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

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

Как в языке запросов 1С используются временные таблицы. Что такое временные таблицы. Что такое виртуальные таблицы.

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

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

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

Здесь ВТ_Номенклатура — это временная таблица.

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

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

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

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

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

Здесь ЦеныНоменклатурыСрезПоследних — это виртуальная таблица, в параметры которой мы передаем дату и список товаров.

Т.е. при получении среза последних мы передаем в параметры виртуальной таблицы нужные параметры.

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

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

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

Next Post

Хитрости запросов: сравнения и проверки в запросах 1С. Отбор не заполненного значения. Отбор в запросе документов конкретного типа при составном типе и т.п. ( 1С: 8.1: Язык программирования: Запросы)

Вт Май 18 , 2010
Как в языке запросов 1С отобрать не заполненное значение. Какое условие указать в запросе после ключевого слова «ГДЕ», когда нужно сделать отбор по не заполненным полям? Есть запрос: Запрос.Текст = "ВЫБРАТЬ | усЕдиницыХранения.Ссылка |ИЗ | Справочник.усЕдиницыХранения КАК усЕдиницыХранения Требуется отобрать по условию, что у справочника усЕдиницыХранения реквизит РазрешитьОтборИзРезервнойЗоны пустой Реквизит […]