Как в языке запросов 1С используются временные таблицы. Что такое временные таблицы. Что такое виртуальные таблицы.
В одном из последних релизов платформы 8.1 появилась возможность использовать в запросах временные таблицы. Что это такое и как их можно использовать? Рассмотрим пример, с которым наверное многие из Вас сталкивались — а именно с необходимостью расчета цен по таблице товаров. Раньше эту задачу можно было решить разными способами, но ни один не обеспечивал быстрое и удобное получение результата. Эту проблему и решили временные таблицы.
Итак, допустим у нас есть таблица товаров — «ТабТоваров» с колонками — «Номенклатура», «Количество», «Цена», «Сумма», и нам необходимо быстро рассчитать цену и сумму по всем товарам. Первым шагом мы создаем менеджер временных таблиц и помещаем туда нашу таблицу значений:
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | ТабТоваров.Номенклатура КАК Номенклатура, | ТабТоваров.Количество КАК Количество |ПОМЕСТИТЬ ВТ_Номенклатура |ИЗ | &ТабТоваровКАК КАК ТабТоваров"; Запрос.УстановитьПараметр("ТабТоваров", ТабТоваров); Запрос.Выполнить();
Здесь ВТ_Номенклатура — это временная таблица.
Следующим шагом мы к временной таблице левым соединением добавляем цены из регистра сведений «ЦеныНоменклатуры»
Запрос.Текст = "ВЫБРАТЬ | ВТ_Номенклатура.Номенклатура, | ВТ_Номенклатура.Количество, | ЦеныНоменклатурыСрезПоследних.Цена, | ЦеныНоменклатурыСрезПоследних.Цена * ВТ_Номенклатура.Количество КАК Сумма |ИЗ ВТ_Номенклатура КАК ВТ_Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаЦен, | Номенклатура В (&СписокТоваров) И ТипЦен = &ТипЦен ) КАК ЦеныНоменклатурыСрезПоследних | ПО ВТ_Номенклатура.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура"; Запрос.УстановитьПараметр("СписокТоваров",ТабТоваров.ВыгрузитьКолонку("Номенклатура")); Запрос.УстановитьПараметр("ТипЦен",ТипЦены); Запрос.УстановитьПараметр("ДатаЦен",ТекущаяДата()); ТабТоваров = Запрос.Выполнить().Выгрузить(); МенеджерВременныхТаблиц.Закрыть();
Здесь ЦеныНоменклатурыСрезПоследних — это виртуальная таблица, в параметры которой мы передаем дату и список товаров.
Т.е. при получении среза последних мы передаем в параметры виртуальной таблицы нужные параметры.
Это оптимизирует работу при большом количестве записей в регистре, т.к. лишние данные отсекаются уже на этапе выбора цен.
Если параметры виртуальной таблицы не указать, то будут выбраны все записи из регистра ЦеныНоменклатуры и лишь потом по условию соединения отсекутся лишние записи, что считается грубой ошибкой программирования на языке 1С, т.к. создается неоптимальный код, существенно нагружающий систему.