Книга знаний

1С:Предприятие

Временные таблицы в 8.1

Использование временных таблиц в 8.1Автор статьи: Гений 1С | Редакторы: Sol78, ILM, zag2art, Alex_Sun, Kreont
Последняя редакция №16 от 09.08.10 | История
URL: http://kb.mista.ru/article.php?id=628

В 8.1. появились временные таблицы. Они хранятся на сервере и позволяют писать более простые запросы.
Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц. Когда этот объект уничтожается, уничтожаются и временные таблицы.
Чтобы создать временную таблицу, используется ключевое слово "ПОМЕСТИТЬ В", например:
ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары

Временная таблица создается при выполнении запроса, если повторно выполнить запрос, то выдастся ошибка, что таблица уже существует.

Описания временных таблиц хранятся в свойстве запроса МенеджерВременныхТаблиц. К сожалению, в духе 1С, нельзя получить список временных таблиц, которые хранятся в запросе.

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

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


Готовую таблицу значений из памяти можно выгружать в менеджер временных таблиц запроса. Единственное условие - колонки таблицы значений должны быть типизированными, т.е. иметь тип. Вот пример, демонстрирующий это (спасибо Чепелевич А.А., раньше я думал что это невозможно):

ТЗ=Новый ТаблицаЗначений();
//Колонки должны быть типизированы
ТЗ.Колонки.Добавить("А", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Б", Новый ОписаниеТипов("Строка"));

//Заполняем таблицу данными
Стр=ТЗ.Добавить();
Стр.А="А";
Стр.Б="Б";
Стр=ТЗ.Добавить();
Стр.А="А1";
Стр.Б="Б1";


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

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


Вместо перечисления списка полей можно использовать "ВЫБРАТЬ *".

От zag2art
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:
[1с]
Процедура ТипизацияТЗ(ТЗ) Экспорт
   РезультатТЗ = новый ТаблицаЗначений;
   Для Каждого Колонка из ТЗ.Колонки Цикл
       Имя = Колонка.Имя;
       МассивТипов = новый Массив(1);
       МассивТипов[0] = ТипЗнч(ТЗ[0][Имя]);
       Описатель = новый ОписаниеТипов(МассивТипов);
       РезультатТЗ.Колонки.Добавить(Имя, Описатель);
   КонецЦикла;
   
   Для каждого Строка из ТЗ Цикл
       СтрокаРез = РезультатТЗ.Добавить();
       ЗаполнитьЗначенияСвойств(СтрокаРез, Строка);
   КонецЦикла;
   
   ТЗ = РезультатТЗ.Скопировать();
КонецПроцедуры
[/1с]


Функция для просмотра ВТ в отладчике


Функция  ЛукВТ(Запрос, ИмяВнутреннейТаблицы) Экспорт
    Перем ЗапросТМП, Р;
    //Получаем таблицу из менеджера временных таблиц запроса
    ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ "+ИмяВнутреннейТаблицы);
    ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц; 
    Р=ЗапросТМП.Выполнить().Выгрузить(); 
    Возврат Р;
КонецФункции



Вот как получить список всех ВТ, не знаю. Видимо никак.

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


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


Недостатки временных таблиц:</


1. Если в тексте запроса есть временная таблица, то этот запрос не разбирается конструктором запроса (это ограничение можно обойти нештатно, используя объявление подзапроса Книга знаний: v8: Конструирование сложных запросов для 1С). В релизе 8.1.11 можно использовать конструктор
2. Нельзя выполнить запрос над временной таблицей и поместить данные в нее же саму.
3. Нельзя получить список временных таблиц из менеджера временных таблиц.


Примечание: В последних версиях платформы больше 8.1.8 используется синтаксис "ПОМЕСТИТЬ" без предлога "В".

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

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика