Временные таблицы 1С
Временные таблицы часто используются как для реализации сложных запросов, так и для их оптимизации.
Временные таблицы в 1С
Временные таблицы — это объекты СУБД, никаких временных таблиц на сервере 1С нет, не путайте пожалуйста, их с таблицами значений.
Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц. Когда этот объект уничтожается, уничтожаются и временные таблицы.
Физически временные таблицы по умолчанию создаются в оперативной памяти, а именно в буферном кэше.
Конечно, есть исключения. Например, если таблица слишком большая, то сервер может принять решение сбросить ее на диск. Также возможна ситуация, когда сервер по каким-либо причинам решил отдать память под другие данные, тогда таблица тоже будет записана на диск.
Почему таблица создается именно в памяти? Тут все очевидно, дело в производительности, думаю не стоит объяснять, что чтение из оперативной памяти гораздо быстрее чтения с диска, даже если этот диск SSD.
Чтобы создать временную таблицу, используется ключевое слово «ПОМЕСТИТЬ», например:
ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ ВТТовары
Временная таблица создается при выполнении запроса, если повторно выполнить запрос, то выдастся ошибка, что таблица уже существует.
Описания временных таблиц хранятся в свойстве запроса МенеджерВременныхТаблиц. К сожалению, нельзя получить список временных таблиц, которые хранятся в запросе.
Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ ВТТовары");
Запрос.Выполнить(); //Создалась таблица ВТТовары
ЗапросТМП = Новый Запрос("ВЫБРАТЬ * ИЗ ВТТовары");
ЗапросТМП.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц; //Копируем ссылку на временные таблицы
ТЗ = ЗапросТМП.Выполнить().Выгрузить(); //Получаем временную таблицу в таблице значений
Готовую таблицу значений из памяти можно выгружать в менеджер временных таблиц запроса. Единственное условие — колонки таблицы значений должны быть типизированными, т.е. иметь тип. Вот пример, демонстрирующий это:
ТЗ = Новый ТаблицаЗначений(); //Колонки должны быть типизированы
ТЗ.Колонки.Добавить("А", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Б", Новый ОписаниеТипов("Строка"));
//Заполняем таблицу данными
Стр = ТЗ.Добавить();
Стр.А = "А";
Стр.Б = "Б";
Стр = ТЗ.Добавить();
Стр.А = "А1";
Стр.Б = "Б1";
//Загружаем таблицу значений в менеджер временных таблиц запроса
Запрос = Новый Запрос("Выбрать Т.А, Т.Б ПОМЕСТИТЬ ВТТаб Из &Таб Как Т");
//Вариант: Запрос = Новый Запрос("Выбрать * ПОМЕСТИТЬ ВТТаб Из &Таб Как Т");
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Таб",ТЗ);
Запрос.Выполнить();
//Получаем таблицу из менеджера временных таблиц запроса
ЗапросТМП = Новый Запрос("ВЫБРАТЬ * ИЗ ВТТаб");
ЗапросТМП.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
ТЗ1 = ЗапросТМП.Выполнить().Выгрузить();
ТЗ1.ВыбратьСтроку(); //Показываем полученную таблицу
Вместо перечисления списка полей можно использовать «ВЫБРАТЬ *».
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:
Процедура ТипизацияТЗ(ТЗ) Экспорт
РезультатТЗ = новый ТаблицаЗначений;
Для Каждого Колонка из ТЗ.Колонки Цикл
Имя = Колонка.Имя;
МассивТипов = новый Массив(1);
МассивТипов[0] = ТипЗнч(ТЗ[0][Имя]);
Описатель = новый ОписаниеТипов(МассивТипов);
РезультатТЗ.Колонки.Добавить(Имя, Описатель);
КонецЦикла;
Для каждого Строка из ТЗ Цикл
СтрокаРез = РезультатТЗ.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаРез, Строка);
КонецЦикла;
ТЗ = РезультатТЗ.Скопировать();
КонецПроцедуры
Остались вопросы? Спрашивайте в комментариях.
© Гений 1С Источник: http://kb.mista.ru/article.php?id=628
Приветствую, Алексей!
Есть ли возможность использовать временную таблицу (в ней данные ТЧ документа) в качестве условия виртуальной, чтобы не обращаться к ним ещё раз вложенным запросом?
После ПОМЕСТИТЬ не надо писать В
Добрый день, Дмитрий. Спасибо за внимательность 🙂 Конечно «В» не нужно, это опечатка, а не написано специально