Временные таблицы: Пример получения цен (1С: 8.1: Программисту: Работа с запросами)

Вопрос Как в языке запросов 1С используются временные таблицы? Что такое временные таблицы?
Ответ
В одном из последних релизов платформы 8.1 появилась возможность использовать в запросах временные таблицы. Что это такое и как их можно использовать? Рассмотрим пример, с которым наверное многие из Вас сталкивались — а именно с необходимостью расчета цен по таблице товаров. Раньше эту задачу можно было решить разными способами, но ни один не обеспечивал быстрое и удобное получение результата. Эту проблему и решили временные таблицы.
Итак, допустим у нас есть таблица товаров — «ТабТоваров» с колонками — «Номенклатура», «Количество», «Цена», «Сумма», и нам необходимо быстро рассчитать цену и сумму по всем товарам. Первым шагом мы создаем менеджер временных таблиц и помещаем туда нашу таблицу значений:

МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
 Запрос = Новый Запрос;
 Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
 Запрос.Текст =
 "ВЫБРАТЬ 
 | ТабТоваров.Номенклатура,
 | ТабТоваров.Количество
 | ПОМЕСТИТЬ ВыбрНоменклатура 
 | ИЗ &ТабТоваровКАК ТабТоваров";

 Запрос.УстановитьПараметр("ТабТоваров", ТабТоваров);
 Запрос.Выполнить();

Следующим шагом мы к временной таблице левым соединением прицепим цены из регистра сведений «ЦеныНоменклатуры»

 Запрос.Текст = "ВЫБРАТЬ 
 | ВыбрНоменклатура.Номенклатура,
 | ВыбрНоменклатура.Количество,
 | ЦеныНоменклатурыСрезПоследних.Цена,
 | ЦеныНоменклатурыСрезПоследних.Цена * ВыбрНоменклатура.Количество КАК Сумма 
 | ИЗ ВыбрНоменклатура КАК ВыбрНоменклатура
 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаЦен, 
 | Номенклатура В (&СписокТоваров) И ТипЦен = &ТипЦен ) КАК ЦеныНоменклатурыСрезПоследних
 | ПО ВыбрНоменклатура.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";

 Запрос.УстановитьПараметр("СписокТоваров",ТабТоваров.ВыгрузитьКолонку("Номенклатура"));
 Запрос.УстановитьПараметр("ТипЦен",ТипЦены);
 Запрос.УстановитьПараметр("ДатаЦен",ТекущаяДата());

 ТабТоваров = Запрос.Выполнить().Выгрузить();

 МенеджерВременныхТаблиц.Закрыть();

В итоге мы получили ту же таблицу, но с уже рассчитанными ценами и суммами. Достаточно легко и оптимально быстро. Обращаю внимание, что одним из параметров отбора регистра мы указали список товаров. Это очень сильно оптимизирует работу при большом количестве записей в регистре, т.к. лишние данные отсекаются уже на этапе выбора цен. Если этого не сделать — будут выбраны все записи из регистра и лишь потом по условию соединения отсекутся лишние записи.

Источник

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.