HelpF.pro

Что такое менеджер временных таблиц и как с ним работать?

В 1С есть такая замечательная вещь, как МенеджерВременныхТаблиц. Этот объект позволяет передавать временные таблицы из одного запроса в другой. То есть, мы можем создать временную таблицу в запросе, прерваться, выполнить какой-нибудь код, и продолжить работу с этой временной таблицей дальше. 

Код 1C v 8.2 УП
  Запрос = Новый Запрос;
    МВТ = Новый МенеджерВременныхТаблиц;
    Запрос.МенеджерВременныхТаблиц = МВТ;
    
    Запрос.Текст = "ВЫБРАТЬ
                   |    ТЧ.Номенклатура
                   |ПОМЕСТИТЬ ВременнаяТЗ
                   |ИЗ
                   |    &ТЧ КАК ТЧ
                   |ГДЕ
                   |    ТЧ.Номенклатура В ИЕРАРХИИ(&Номенклатура)
                   |    И ТЧ.Цена < 5";
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("ТЧ", ТЧ);
    РезультатЗапроса = Запрос.Выполнить();
                   
    Запрос2 = Новый Запрос;
    Запрос2.Текст = "ВЫБРАТЬ
                    | ВременнаяТЗ.Номенклатура
                    |ИЗ
                    | ВременнаяТЗ КАК ВременнаяТЗ"; 
    Запрос2.МенеджерВременныхТаблиц    = МВТ;   
    РезультатЗапроса = Запрос2.Выполнить().Выгрузить();

Например, в отчете в зависимости от выбранных настроек первичные данные обрабатываются тем или иным способом. Тогда имеет смысл в одной процедуре сформировать эти данные и поместить их во временную таблицу, которую уже передаем через менеджер временных таблиц в другую процедуру, отвечающую за выбранный способ обработки. Это позволит сократить код, сделать запросы более читаемыми. А так же в случае, если возникнут изменения в методике подготовки первичных данных для обработки, то потребуется внести изменения только в один запрос, а не в каждый.

В качестве примера работы с менеджером временных таблиц приведу следующую обработку.

Я создаю менеджер временных таблиц, и передаю его последовательно в каждую процедуру, для создания и объединения временных таблиц. Результат выводится в сводную таблицу.

Код 1C v 8.2 УП
 &НаКлиенте
Процедура ЗаполнитьСводную(Команда)
 ЗаполнитьСводнуюНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСводнуюНаСервере()
 
 МенВТ = Новый МенеджерВременныхТаблиц;
 ПолучитьДанныеА(МенВТ);
 ПолучитьДанныеБ(МенВТ);
 ЗагрузитьСводные(МенВТ);
 МенВТ.Закрыть();
 
КонецПроцедуры


&НаСервере
Процедура ПолучитьДанныеА(МенВремТаб)

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


&НаСервере
Процедура ПолучитьДанныеБ(МенВремТаб)


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

&НаСервере
Процедура ЗагрузитьСводные(МенВремТаб)

 Запрос = Новый Запрос;
 Запрос.МенеджерВременныхТаблиц = МенВремТаб;
 Запрос.Текст = "ВЫБРАТЬ
                | ЕСТЬNULL(ТабА.Контрагент, ТабБ.Контрагент) КАК Контрагент,
                | ЕСТЬNULL(ТабА.Сумма, 0) КАК Сумма,
                | ЕСТЬNULL(ТабБ.Комментарий, """") КАК Комментарий
                |ИЗ
                | ТабА КАК ТабА
                |  ПОЛНОЕ СОЕДИНЕНИЕ ТабБ КАК ТабБ
                |  ПО ТабА.Контрагент = ТабБ.Контрагент
                |
                |УПОРЯДОЧИТЬ ПО
                | Контрагент
                |АВТОУПОРЯДОЧИВАНИЕ";
       
 ТаблицаСводная.Загрузить(Запрос.Выполнить().Выгрузить());

КонецПроцедуры // ЗагрузитьСводные()

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1722.html