1с 8 временные таблицы

Не помню уже с какого релиза в запросах стало можно использовать временные таблицы. Для этого используется объект «Менеджер временных таблиц». Фактически менеджер временных таблиц описывает пространство имен временных таблиц и отвечает за их создание и уничтожение в базе данных.

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

МВТ = Новый МенеджерВременныхТаблиц;

Запрос = Новый Запрос;

Запрос.Текст = "

| Номенклатура, СУММА(Количество) КАК Количество

|ПОМЕСТИТЬ ДокТЧ

|СГРУППИРОВАТЬ ПО Номенклатура";

РезультатЗапроса = Запрос.Выполнить(); //Прим. 1

Запрос = Новый Запрос;

Запрос.МенеджерВременныхТаблиц = МВТ;

Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ

| Номенклатура

|ПОМЕСТИТЬ СписокТоваров

РезультатЗапроса = Запрос.Выполнить(); //Прим. 2

Запрос = Новый Запрос;

Запрос.МенеджерВременныхТаблиц = МВТ;

Запрос.Текст = "

| Док.Номенклатура,

| Док.Количество КАК Док_Количество,

| ЕСТЬNULL(Рег.КоличествоОстаток,0) КАК Рег_Количество

| ДокТЧ КАК Док

| ЛЕВОЕ СОЕДИНЕНИЕ

| РегистрНакопления.ОстаткиТоваров.Остатки(,

| Номенклатура В(ВЫБРАТЬ РАЗЛИЧНЫЕ

| Номенклатура

| СписокТоваров КАК СписокТоваров)) КАК Рег

| Док.Номенклатура = Рег.Номенклатура";

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

//Проверка отрицательных остатков

//Проведение по регистру

КонецЦикла;

КонецПроцедуры

При использовании временных таблиц в тексте запроса применяют инструкцию Поместить для создания новой временной таблицы, в этом случае в результат запроса система передает не содержимое этой таблицы (см прим 1 и прим 2 в коде выше), а количество записей помещенных во временную таблицу, по желанию можно не принимать это значение.

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

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

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

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

Временные таблицы, как удалить?

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

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

43
NULL – отсутствующие значения. Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено. NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа. NULL... 26
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос. Создается этот объект вызовом конструкции Новый Запрос. Запрос удобно... 18
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на... 13
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения...

Язык запросов 1С:Предприятия 8 позволяет использовать временные таблицы в запросах. Использование временных таблиц помогает повысить производительность запросов и сделать текст сложных запросов более легким для восприятия.

Работа с временными таблицами обеспечивается двумя составляющими:

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

В одном прикладном решении может быть создано произвольное количество экземпляров менеджера временных таблиц, каждый из которых хранит свой набор временных таблиц. Каждая временная таблица однозначно идентифицируется своим именем, и в пределах одного менеджера временных таблиц все временные таблицы должны иметь уникальные имена.

Экземпляр менеджера временных таблиц может быть создан с помощью конструктора Новый. Например:

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

Менеджер временных таблиц можно закрыть принудительно при помощи метода Закрыть(). При этом будут удалены все созданные в нем таблицы. Дальнейшая работа с данным экземпляром менеджера будет невозможна.

Создание временных таблиц
Создание временных таблиц осуществляется с помощью объекта Запрос встроенного языка 1С:Предприятия 8.

Связь запроса с менеджером временных таблиц осуществляется с помощью свойства МенеджерВременныхТаблиц запроса, в котором указывается тот экземпляр менеджера, в котором должны создаваться временные таблицы. Например:

МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

Временная таблица может быть создана на основе данных базы данных или на основе внешнего источника данных (например, таблицы значений).

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

ВЫБРАТЬ
Код,
Наименование
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ Справочник.Номенклатура

Результат исполнения такого запроса будет содержать одну строку с одной колонкой с именем "Количество", в которой будет находится количество записей, помещенных в созданную таблицу.

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

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

При необходимости создания индекса для временной таблицы, следует в запросе указать ключевое слово ИНДЕКСИРОВАТЬ ПО, после которого перечислить поля, по которым нужно построить индекс.

Например:

ВЫБРАТЬ
Код,
Наименование
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ Справочник.Номенклатура
ИНДЕКСИРОВАТЬ ПО Код

Поля, по которым происходит индексирование должны находиться в списке выборки.

Для того, чтобы создать временную таблицу и заблокировать данные таблиц, на основании которых создается временная, следует использовать конструкцию ДЛЯ ИЗМЕНЕНИЯ, следует использовать конструкцию ДЛЯ ИЗМЕНЕНИЯ.

Например:

ВЫБРАТЬ
РасходнаяНакладная.Ссылка,
РасходнаяНакладная.Номер,
РасходнаяНакладная.Дата
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
Документ.РасходнаяНакладная КАК РасходнаяНакладная
ГДЕ
РасходнаяНакладная.Ссылка В(&Документы)

ДЛЯ ИЗМЕНЕНИЯ

Для того чтобы создать временную таблицу на основании внешнего источника, следует в тексте запроса в списке источников указать имя параметра, в который будет помещен внешний источник. Остальной синтаксис идентичен обычному созданию временной таблицы. В качестве внешнего источника могут выступать:

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

ВЫБРАТЬ
Код,
Наименование
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ &ВнешнийИсточник КАК ВнешнийИсточник

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

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

Использование временных таблиц
Для использования существующих временных таблиц в запросе следует установить объекту Запрос менеджер временных таблиц, после чего к временным таблицам, содержащимся в данном менеджере временных таблиц, можно обращаться по имени, как к обычным таблицам запроса.

Удаление временных таблиц
Для удаления временной таблицы из менеджера временных таблиц следует воспользоваться ключевым словом языка запроса УНИЧТОЖИТЬ, после которого указывается имя уничтожаемой таблицы. Например:

УНИЧТОЖИТЬ ВременнаяТаблица

В случае если уничтожаемой таблицы не существует, будет выдана ошибка.

Очень часто это порождает распространенную ошибку — запрос в цикле. То есть разработчик не умеет включать таблицу значений в запрос и поэтому начинает обходить её в цикле и делать на каждую итерацию свой запрос. Рассмотрим на простом примере, как это сделать.

Пример

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

Получите 267 видеоуроков по 1С бесплатно:

Может быть две ситуации, как создана таблица значений, — программно и уже получена откуда-то (например, ТЧ документа). Если таблица создана программно, необходимо установить тип колонки , сделать это несложно

Т.е. при добавление колонки необходимо вторым параметром указать типы данных с помощью конструктора объекта «ОписаниеТипов».

Перейдем к построению запроса. Таблицу значений можно передать в запрос простым &Параметром.

Обязательный нюанс — созданную таблицу необходимо поместить результат во временную таблицу, в противном случае система выдаст сообщение: «Ошибка при вызове метода контекста (Выполнить): Содержимое объекта данных может быть выбрано только во временную таблицу ».

Таким образом, мы помещаем первый запрос во временную таблицу, а потом соединяем её с регистром остатков номенклатуры.

Вот и всё, проблема решена.