1С менеджер временных таблиц

Временные таблицы — хранятся на сервере и позволяют писать более простые запросы.
Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц. Когда этот объект уничтожается, уничтожаются и временные таблицы.
Чтобы создать временную таблицу, используется ключевое слово «ПОМЕСТИТЬ В», например:

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

Код 1C v 8.х ВЫБРАТЬ
ВзаиморасчетыСРаботникамиОрганизаций.Период,
ВзаиморасчетыСРаботникамиОрганизаций.Физлицо,
ВзаиморасчетыСРаботникамиОрганизаций.СуммаВзаиморасчетов,
ВзаиморасчетыСРаботникамиОрганизаций.Организация,
ВзаиморасчетыСРаботникамиОрганизаций.ПериодВзаиморасчетов,
ВзаиморасчетыСРаботникамиОрганизаций.Регистратор
ПОМЕСТИТЬ РегВзаимРасч
ИЗ
РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций КАК ВзаиморасчетыСРаботникамиОрганизаций
ГДЕ
ВзаиморасчетыСРаботникамиОрганизаций.Период МЕЖДУ &ДатаН И &ДатаК
;
X
ВЫБРАТЬ
ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо,
ЗарплатаКВыплатеОрганизацийЗарплата.Сумма,
ЗарплатаКВыплатеОрганизацийЗарплата.ВыплаченностьЗарплаты,
ЗарплатаКВыплатеОрганизацийЗарплата.КомпенсацияЗаЗадержкуЗарплаты,
ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка
ПОМЕСТИТЬ ДокумЗарплКВыпл
ИЗ
Документ.ЗарплатаКВыплатеОрганизаций.Зарплата КАК ЗарплатаКВыплатеОрганизацийЗарплата
ГДЕ
ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
;
X
ВЫБРАТЬ
РегВзаимРасч.Период,
РегВзаимРасч.Физлицо,
РегВзаимРасч.СуммаВзаиморасчетов,
ДокумЗарплКВыпл.Сумма,
ДокумЗарплКВыпл.ВыплаченностьЗарплаты,
ДокумЗарплКВыпл.КомпенсацияЗаЗадержкуЗарплаты
ИЗ
РегВзаимРасч КАК РегВзаимРасч
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДокумЗарплКВыпл КАК ДокумЗарплКВыпл
ПО РегВзаимРасч.Регистратор = ДокумЗарплКВыпл.Ссылка
И РегВзаимРасч.Физлицо = ДокумЗарплКВыпл.Физлицо
;

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

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

Очевидно, что в этих случаях нужно, чтобы различные запросы использовали один и тот же менеджер временных таблиц. Рассмотрим методы работы с менеджером временных таблиц в запросах 1С.

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

МВТ = новый МенеджерВременныхТаблиц;

Как назначить менеджер временных в запрос 1С

//создадим запрос
запрос = новый запрос;
//Назначим созданный ранее менеджер временных таблиц
запрос.МенеджерВременныхТаблиц = МВТ;

Как добавить временную таблицу в менеджер

Для того чтобы добавить временную таблицу в запрос, нужно выполнить запрос в режиме Создание временной таблицы, назначив ему менеджер временных таблиц.

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

Как удалить временную таблицу из менеджера

Для этого нужно создать запрос на уничтожение временной таблицы и выполнить его.

запрос = новый запрос;
запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст =»УНИЧТОЖИТЬ ВТ1″;
Результат = запрос.Выполнить();

Как использовать таблицы из менеджера временных таблиц в запросах 1С

К сожалению, конструктор запроса не может видеть временные таблицы из менеджера. Поэтому запрос к временной таблице нужно либо писать вручную, либо все-таки воспользоваться конструктором, но указать в нем структуру временной таблицы.

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

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