Временные таблицы — хранятся на сервере и позволяют писать более простые запросы.
Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц. Когда этот объект уничтожается, уничтожаются и временные таблицы.
Чтобы создать временную таблицу, используется ключевое слово "ПОМЕСТИТЬ В", например:
1 |
|ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары |
Временная таблица создается при выполнении запроса, если повторно выполнить запрос, то выдастся ошибка, что таблица уже существует.
Описания временных таблиц хранятся в свойстве запроса МенеджерВременныхТаблиц. К сожалению, нельзя получить список временных таблиц, которые хранятся в запросе.
Пример 1: Как можно выгрузить временную таблицу в таблицу значений и как использовать менеджер временных таблиц:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Запрос=Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары"); Запрос.Выполнить(); //Создалась таблица ВТТовары ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ ВТТовары"); ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц; //Копируем ссылку на временные таблицы ТЗ=ЗапросТМП.Выполнить().Выгрузить(); //Получаем временную таблицу в таблице значений Готовую таблицу значений из памяти можно выгружать в менеджер временных таблиц запроса. Единственное условие - колонки таблицы значений должны быть типизированными, т.е. иметь тип. Вот пример, демонстрирующий это: ТЗ=Новый ТаблицаЗначений(); //Колонки должны быть типизированы ТЗ.Колонки.Добавить("А", Новый ОписаниеТипов("Строка")); ТЗ.Колонки.Добавить("Б", Новый ОписаниеТипов("Строка")); //Заполняем таблицу данными Стр=ТЗ.Добавить(); Стр.А="А"; Стр.Б="Б"; Стр=ТЗ.Добавить(); Стр.А="А1"; Стр.Б="Б1"; //Загружаем таблицу значений в менеджер временных таблиц запроса Запрос=Новый Запрос("Выбрать Т.А, Т.Б ПОМЕСТИТЬ ВТТаб Из &Таб Как Т"); //Вариант: Запрос=Новый Запрос("Выбрать * ПОМЕСТИТЬ ВТТаб Из &Таб Как Т"); Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("Таб",ТЗ); Запрос.Выполнить(); //Получаем таблицу из менеджера временных таблиц запроса ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ ВТТаб"); ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц; ТЗ1=ЗапросТМП.Выполнить().Выгрузить(); ТЗ1.ВыбратьСтроку(); //Показываем полученную таблицу |
Вместо перечисления списка полей можно использовать "ВЫБРАТЬ * ".
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Процедура ТипизацияТЗ(ТЗ) Экспорт РезультатТЗ = новый ТаблицаЗначений; Для Каждого Колонка из ТЗ.Колонки Цикл Имя = Колонка.Имя; МассивТипов = новый Массив(1); МассивТипов[0] = ТипЗнч(ТЗ[0][Имя]); Описатель = новый ОписаниеТипов(МассивТипов); РезультатТЗ.Колонки.Добавить(Имя, Описатель); КонецЦикла; Для каждого Строка из ТЗ Цикл СтрокаРез = РезультатТЗ.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаРез, Строка); КонецЦикла; ТЗ = РезультатТЗ.Скопировать(); КонецПроцедуры |
Пример 2: Нужно в отчете СКД Связать Данные из Регистра Накопления ВзаиморасчетыСРаботниками и Табличной Части Документа ЗарплатаКВыплате по Ссылке на Документ и ФизЛицу! И вывести полученные данные за указанный Период(с ДатаН по ДатаК) — Запрос будет такой:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
ВЫБРАТЬ ВзаиморасчетыСРаботникамиОрганизаций.Период, ВзаиморасчетыСРаботникамиОрганизаций.Физлицо, ВзаиморасчетыСРаботникамиОрганизаций.СуммаВзаиморасчетов, ВзаиморасчетыСРаботникамиОрганизаций.Организация, ВзаиморасчетыСРаботникамиОрганизаций.ПериодВзаиморасчетов, ВзаиморасчетыСРаботникамиОрганизаций.Регистратор ПОМЕСТИТЬ РегВзаимРасч ИЗ РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций КАК ВзаиморасчетыСРаботникамиОрганизаций ГДЕ ВзаиморасчетыСРаботникамиОрганизаций.Период МЕЖДУ &ДатаН И &ДатаК ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо, ЗарплатаКВыплатеОрганизацийЗарплата.Сумма, ЗарплатаКВыплатеОрганизацийЗарплата.ВыплаченностьЗарплаты, ЗарплатаКВыплатеОрганизацийЗарплата.КомпенсацияЗаЗадержкуЗарплаты, ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка ПОМЕСТИТЬ ДокумЗарплКВыпл ИЗ Документ.ЗарплатаКВыплатеОрганизаций.Зарплата КАК ЗарплатаКВыплатеОрганизацийЗарплата ГДЕ ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РегВзаимРасч.Период, РегВзаимРасч.Физлицо, РегВзаимРасч.СуммаВзаиморасчетов, ДокумЗарплКВыпл.Сумма, ДокумЗарплКВыпл.ВыплаченностьЗарплаты, ДокумЗарплКВыпл.КомпенсацияЗаЗадержкуЗарплаты ИЗ РегВзаимРасч КАК РегВзаимРасч ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДокумЗарплКВыпл КАК ДокумЗарплКВыпл ПО РегВзаимРасч.Регистратор = ДокумЗарплКВыпл.Ссылка И РегВзаимРасч.Физлицо = ДокумЗарплКВыпл.Физлицо ; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ РегВзаимРасч ; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ ДокумЗарплКВыпл |