Перейти к содержимому

Где хранятся временные таблицы 1с

  • автор:

Где хранятся временные таблицы 1с

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

ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары

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

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

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

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

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

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

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

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

Для каждого Строка из ТЗ Цикл
СтрокаРез = РезультатТЗ.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаРез, Строка);
КонецЦикла;

ТЗ = РезультатТЗ.Скопировать();
КонецПроцедуры
[/1с]

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

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

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

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

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

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

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

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

Где хранятся временные таблицы 1с

для работы с временными таблицами, запросы надо писать вручную или можно использовать коструктор?
Т.е. как получить временную таблицу — понятно, а как дальше её использовать — непонятно. У кого какие мысли?
P.S. для чего они вообще нужны.

ЖЖК — в путь.

бля, тут такие программеры смешные. НАСТОЯЩИЕ! У меня то в основном фрилансеры были, они и одеваются более менее, и следят за собой.
А тут прямо классические кошерные программисты. С бородами, с усами. Свитор в джинсы запрвляют. Сразу видно — профессионалы.

к предыдущему: с баша свежие новости
Рот закрой, если по делу сказать ничего не можешь.
(0)долби дальше

Использование временных таблиц в 8.1 Автор статьи: Гений 1С
Последняя редакция №2 от 17.01.08 | История
URL: Книга знаний: v8: Временные таблицы в 8.1

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

ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары

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

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

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

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

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

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

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

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

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

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

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

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

Временные таблицы, что из себя представляют и как с ними работать?

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

 |ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары 

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

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

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

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

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

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

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

Вместо перечисления списка полей можно использовать «ВЫБРАТЬ * «.
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:
Код 1C v 8.х

Аренда 1С в облаке

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

Для каждого Строка из ТЗ Цикл
СтрокаРез = РезультатТЗ.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаРез, Строка);
КонецЦикла;

ТЗ = РезультатТЗ.Скопировать();
КонецПроцедуры

Пример 2: Нужно в отчете СКД Связать Данные из Регистра Накопления ВзаиморасчетыСРаботниками и Табличной Части Документа ЗарплатаКВыплате по Ссылке на Документ и ФизЛицу! И вывести полученные данные за указанный Период(с ДатаН по ДатаК) — Запрос будет такой:
Код 1C v 8.х

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

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

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

X
УНИЧТОЖИТЬ РегВзаимРасч
;

X
УНИЧТОЖИТЬ ДокумЗарплКВыпл

Временные таблицы 1С

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

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

Временные таблицы — это объекты СУБД, никаких временных таблиц на сервере 1С нет, не путайте пожалуйста, их с таблицами значений.

Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц. Когда этот объект уничтожается, уничтожаются и временные таблицы.

Физически временные таблицы по умолчанию создаются в оперативной памяти, а именно в буферном кэше.

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

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

ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ ВТТовары

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

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

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

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

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

Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:

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

Остались вопросы? Спрашивайте в комментариях.

Похожие записи

  • Работа с датами в 1С
  • Отбор строк в табличной части
  • Функции языка запросов 1С. Работа с датами
  • Как перебрать все элементы из определенной группы справочника

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *