Временные таблицы служат для написания более «гибких» запросов.
МенеджерВременныхТаблиц – это объект, в котором они хранятся. При его уничтожении, и таблицы уничтожаются вместе с ним. Работа с такими таблицами, осуществляется только на сервере.
Для создания временной таблицы, используется ключевое слово «ПОМЕСТИТЬ В», например:
1 |
|ВЫБРАТЬ * ИЗ Справочник.Товары ПОМЕСТИТЬ В ВТТовары |
Временная таблица создается при выполнении запроса, если повторно выполнить запрос, то выдастся ошибка, что таблица уже существует.
В свойстве запроса МенеджерВременныхТаблиц, хранятся описания временных таблиц. Самое интересное, что список этих таблиц, получить невозможно.
Как можно выгрузить временную таблицу в таблицу значений и как использовать менеджер временных таблиц:
1 2 3 4 5 6 7 8 9 |
Запрос=Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Товары ПОМЕСТИТЬ В ВТТовары"); Запрос.Выполнить(); //Создалась таблица ВТТовары ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ ВТТовары"); ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц; //Копируем ссылку на временные таблицы ТЗ=ЗапросТМП.Выполнить().Выгрузить(); //Получаем временную таблицу в таблице значений |
Готовую таблицу значений из памяти можно выгружать в менеджер временных таблиц запроса. Единственное условие — колонки таблицы значений должны быть типизированными, т.е. иметь тип.
Вот пример, демонстрирующий это:
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 |
ТЗ = Новый ТаблицаЗначений(); //Колонки должны быть типизированы ТЗ.Колонки.Добавить("А", Новый ОписаниеТипов("Строка")); ТЗ.Колонки.Добавить("Б", Новый ОписаниеТипов("Строка")); //Заполняем таблицу данными Стр = ТЗ.Добавить(); Стр.А = "А"; Стр.Б = "Б"; Стр = ТЗ.Добавить(); Стр.А = "А1"; Стр.Б = "Б1"; //Загружаем таблицу значений в менеджер временных таблиц запроса Запрос = Новый Запрос("Выбрать Т.А, Т.Б ПОМЕСТИТЬ ВТТаб Из &Таб Как Т"); //Вариант: Запрос=Новый Запрос("Выбрать * ПОМЕСТИТЬ ВТТаб Из &Таб Как Т"); Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("Таб",ТЗ); Запрос.Выполнить(); //Получаем таблицу из менеджера временных таблиц запроса ЗапросТМП = Новый Запрос("ВЫБРАТЬ * ИЗ ВТТаб"); ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц; ТЗ1 = ЗапросТМП.Выполнить().Выгрузить(); ТЗ1.ВыбратьСтроку(); //Показываем полученную таблицу |
Вместо перечисления списка полей можно использовать ВЫБРАТЬ * .
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Процедура ТипизацияТЗ(ТЗ) Экспорт РезультатТЗ = новый ТаблицаЗначений; Для Каждого Колонка из ТЗ.Колонки Цикл Имя = Колонка.Имя; MassivTipov = новый Массив(1); MassivTipov[0] = ТипЗнч(ТЗ[0][Имя]); Описатель = новый ОписаниеТипов(MassivTipov); РезультатТЗ.Колонки.Добавить(Имя, Описатель); КонецЦикла; Для каждого Строка из ТЗ Цикл СтрокаРез = РезультатТЗ.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаРез, Строка); КонецЦикла; ТЗ = РезультатТЗ.Скопировать(); КонецПроцедуры |
Нужно в отчете СКД Связать Данные из Регистра Накопления ВзаиморасчетыСРаботниками и Табличной Части Документа ЗарплатаКВыплате по Ссылке на Документ и Сотруднику! И вывести полученные данные за указанный Период(с ДатаН по ДатаК) — Запрос будет такой:
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 50 51 52 53 54 55 |
ВЫБРАТЬ РасчётыССотрудникамиПредприятий.Период, РасчётыССотрудникамиПредприятий.Сотрудник, РасчётыССотрудникамиПредприятий.СуммаВзаиморасчетов, РасчётыССотрудникамиПредприятий.Организация, РасчётыССотрудникамиПредприятий.ПериодВзаиморасчетов, РасчётыССотрудникамиПредприятий.Регистратор ПОМЕСТИТЬ РегВзаимРасч ИЗ РегистрНакопления.РасчётыССотрудникамиПредприятий КАК РасчётыССотрудникамиПредприятий ГДЕ РасчётыССотрудникамиПредприятий.Период МЕЖДУ &ДатаН И &ДатаК; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЗарплатаКВыплатеОрганизацийЗарплата.Сотрудник, ЗарплатаКВыплатеОрганизацийЗарплата.Сумма, ЗарплатаКВыплатеОрганизацийЗарплата.ВыплаченностьЗарплаты, ЗарплатаКВыплатеОрганизацийЗарплата.КомпенсацияЗаЗадержкуЗарплаты, ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка ПОМЕСТИТЬ ДокумЗарплКВыпл ИЗ Документ.ЗарплатаКВыплатеОрганизаций.Зарплата КАК ЗарплатаКВыплатеОрганизацийЗарплата ГДЕ ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РегВзаимРасч.Период, РегВзаимРасч.Сотрудник, РегВзаимРасч.СуммаВзаиморасчетов, ДокумЗарплКВыпл.Сумма, ДокумЗарплКВыпл.ВыплаченностьЗарплаты, ДокумЗарплКВыпл.КомпенсацияЗаЗадержкуЗарплаты ИЗ РегВзаимРасч КАК РегВзаимРасч ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДокумЗарплКВыпл КАК ДокумЗарплКВыпл ПО РегВзаимРасч.Регистратор = ДокумЗарплКВыпл.Ссылка И РегВзаимРасч.Сотрудник = ДокумЗарплКВыпл.Сотрудник; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ РегВзаимРасч; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ ДокумЗарплКВыпл |