Задача состоит в следующем: Создать таблицу значений, передать её на вход в запрос, и для каждой строки определить цену на данный момент.
Я сделал таблицу, и заполнил её:
КвалификаторыСтроки = Новый КвалификаторыСтроки(50);
ТаблицаНоменклатуры = Новый ТаблицаЗначений;
ТаблицаНоменклатуры.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки));
ТаблицаНоменклатуры.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
//ТаблицаНоменклатуры.Колонки.Добавить("Цена1", Новый ОписаниеТипов("Число"));
ТаблицаНоменклатуры.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата"));
НоваяСтрока = ТаблицаНоменклатуры.Добавить();
НоваяСтрока.Номенклатура = "Ручка";
НоваяСтрока.Цена = "50";
НоваяСтрока.Период = "20230101";
НоваяСтрока = ТаблицаНоменклатуры.Добавить();
НоваяСтрока.Номенклатура = "Карандаш";
НоваяСтрока.Цена = "100";
НоваяСтрока.Период = "20230102";
НоваяСтрока = ТаблицаНоменклатуры.Добавить();
НоваяСтрока.Номенклатура = "Ручка";
НоваяСтрока.Цена = "150";
НоваяСтрока.Период = "20230103";
НоваяСтрока = ТаблицаНоменклатуры.Добавить();
НоваяСтрока.Номенклатура = "Ручка";
НоваяСтрока.Цена = "240";
НоваяСтрока.Период = "20230105";
НоваяСтрока = ТаблицаНоменклатуры.Добавить();
НоваяСтрока.Номенклатура = "Ручка";
НоваяСтрока.Цена = "210";
НоваяСтрока.Период = "20230106";
Написал следующий запрос:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВременнаяТаблица.Номенклатура КАК Номенклатура,
| ВременнаяТаблица.Цена КАК Цена,
| ВременнаяТаблица.Период КАК Период
|ПОМЕСТИТЬ ВТНоменклатура
|ИЗ
| &ВременнаяТаблица КАК ВременнаяТаблица
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТНоменклатура.Номенклатура КАК Номенклатура,
| ВТНоменклатура.Цена КАК Цена,
| ВТНоменклатура1.Цена КАК Цена1,
| МАКСИМУМ(ВТНоменклатура.Период) КАК Период,
| ВТНоменклатура1.Период КАК Период1
|ПОМЕСТИТЬ ВТПериод
|ИЗ
| ВТНоменклатура КАК ВТНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ ВТНоменклатура КАК ВТНоменклатура1
| ПО ВТНоменклатура.Номенклатура = ВТНоменклатура1.Номенклатура
| И ВТНоменклатура.Период >= ВТНоменклатура1.Период
|
|СГРУППИРОВАТЬ ПО
| ВТНоменклатура.Цена,
| ВТНоменклатура1.Цена,
| ВТНоменклатура.Номенклатура,
| ВТНоменклатура1.Период
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТПериод.Номенклатура КАК Номенклатура,
| ВТПериод.Цена КАК Цена,
| ВТПериод.Цена1 КАК Цена1,
| ВТПериод.Период КАК Период,
| ВТПериод.Период1 КАК Период1
|ИЗ
| ВТПериод КАК ВТПериод
| ЛЕВОЕ СОЕДИНЕНИЕ ВТНоменклатура КАК ВТНоменклатура
| ПО ВТПериод.Номенклатура = ВТНоменклатура.Номенклатура
|ГДЕ
| ВТПериод.Номенклатура = ВТНоменклатура.Номенклатура";
Запрос.УстановитьПараметр("ВременнаяТаблица", ТаблицаНоменклатуры);
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Выборка = Запрос.Выполнить().Выгрузить();
ТабРеквизит.Загрузить(Выборка);
ВЫБРАТЬ
Период,
Измерение,
Ресурс
ИЗ РегистрСведений.МойРегистр КАК Регистр
ГДЕ
Период В (ВЫБРАТЬ Максимум(Период) ИЗ РегистрСведений.МойРегистр КАК Регистр1 Где Регистр1.Измерение = Регистр.Измерение)
Почему это работает быстро? Потому, что измерение и период входят в индекс. Ну и если измерений несколько - они нужны все.