Использование временных таблиц с помощью встроенного языка
страницаИспользование временных таблиц с помощью встроенного языка
В этом разделе вы рассмотрите, как использовать данные временной таблицы с помощью встроенного языка. В разделе «Временные таблицы и пакетные запросы» вы использовали данные временной таблицы в пакетном запросе.
В первом запросе пакета создавалась временная таблица НакладнаяМатериалы, содержащая данные о поступлении товаров из приходной накладной № 1. Во втором запросе пакета таблица справочника Номенклатура связывалась левым соединением с этой временной таблицей. В результате выполнения данного пакетного запроса в консоли запросов вы получали список номенклатуры в порядке иерархии с данными о ее поступлении (листинг 11.53).
Листинг 11.53. Вывод номенклатуры в порядке иерархии с данными о ее поступлении
ВЫБРАТЬ
ПриходнаяНакладнаяМатериалы.Материал КАК Материал,
ПриходнаяНакладнаяМатериалы.Ссылка.Дата КАК Дата,
ПриходнаяНакладнаяМатериалы.Ссылка.Номер КАК Номер
ПОМЕСТИТЬ НакладнаяМатериалы
ИЗ
Документ.ПриходнаяНакладная.Материалы КАК ПриходнаяНакладнаяМатериалы
ГДЕ
ПриходнаяНакладнаяМатериалы.Ссылка.Номер = "000000001"
;
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
НакладнаяМатериалы.Дата КАК Дата,
НакладнаяМатериалы.Номер КАК Номер
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ НакладнаяМатериалы КАК НакладнаяМатериалы
ПО Номенклатура.Ссылка = НакладнаяМатериалы.Материал
УПОРЯДОЧИТЬ ПО
Номенклатура.Ссылка ИЕРАРХИЯ
АВТОУПОРЯДОЧИВАНИЕ
Используя имеющиеся знания, вы без труда можете выполнить этот запрос из встроенного языка. В этом случае временная таблица НакладнаяМатериалы будет использоваться только в этом запросе.
Однако в прикладных решениях встречаются такие задачи, в которых одна и та же временная таблица, полученная запросом, должна использоваться не в одном, а в нескольких запросах, которые могут находиться в разных частях модуля.
Такая возможность реализуется с помощью объекта встроенного языка МенеджерВременныхТаблиц, который предназначен для хранения данных временных таблиц. Сначала вы создаете программный объект МенеджерВременныхТаблиц, затем создаете объект Запрос и связываете его с менеджером временных таблиц через свойство запроса МенеджерВременныхТаблиц (листинг 11.54).
Листинг 11.54. Создание менеджера временных таблиц и установка его связи с запросом
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
После этого все временные таблицы, созданные при помощи этого запроса, будут доступны в других запросах, использующих этот же менеджер временных таблиц.
Таким образом, пакетный запрос (см. листинг 11.53) можно переписать следующим образом (листинг 11.55).
Листинг **11.**55. Вывод всех товаров в порядке иерархии справочника «Товары» с данными об их поступлении за ноябрь
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ
| ПриходнаяНакладнаяМатериалы.Материал,
| ПриходнаяНакладнаяМатериалы.Ссылка.Дата,
| ПриходнаяНакладнаяМатериалы.Ссылка.Номер
|ПОМЕСТИТЬ НакладнаяМатериалы
|ИЗ
| Документ.ПриходнаяНакладная.Материалы КАК ПриходнаяНакладнаяМатериалы
|ГДЕ
| ПриходнаяНакладнаяМатериалы.Ссылка.Номер = &НомерНакладной";
Запрос.УстановитьПараметр("НомерНакладной", "000000001");
Запрос.Выполнить();
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст = "ВЫБРАТЬ
| Номенклатура.Наименование КАК Наименование,
| НакладнаяМатериалы.Дата КАК Дата,
| НакладнаяМатериалы.Номер КАК Номер
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ НакладнаяМатериалы КАК НакладнаяМатериалы
| ПО Номенклатура.Ссылка = НакладнаяМатериалы.Материал
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура.Ссылка ИЕРАРХИЯ
|АВТОУПОРЯДОЧИВАНИЕ";
РезультатЗапроса = Запрос2.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Материал: " + Выборка.Наименование + " Дата: " + Выборка.Дата + " Номер: " + Выборка.Номер);
КонецЦикла;
В процедуре сначала создается менеджер временных таблиц МенеджерВТ, затем создается запрос Запрос, выбирающий данные о поступлении товаров. С ним связывается менеджер временных таблиц. При выполнении этого запроса (Запрос.Выполнить()) данные, выбранные запросом, помещаются во временную таблицу НакладнаяМатериалы.
Результат выполнения первого запроса (Запрос.Выполнить()) не используется. Он включает одну колонку Количество, содержащую количество строк, помещенных во временную таблицу.
Затем создается второй запрос Запрос2. В качестве менеджера временных таблиц для него также указывается МенеджерВТ. Это значит, что второй запрос получает доступ к временной таблице, созданной при выполнении первого запроса. То есть он может использовать временную таблицу НакладнаяМатериалы в качестве источника данных точно так же, как и таблицу базы данных.
После выполнения второго запроса выполняется обход выборки результата запроса, и в итоге в окне сообщений вы получаете следующий результат (рис. 11.65).

Рис. 11.65. Использование данных временной таблицы с помощью встроенного языка
Запросов, использующих общий менеджер временных таблиц, может быть несколько, и во всех этих запросах будут доступны данные всех временных таблиц, созданных с помощью запросов с использованием того же менеджера временных таблиц.
Необходимо учитывать, что временные таблицы будут существовать в памяти компьютера до закрытия менеджера временных таблиц (автоматически или принудительно методом Закрыть()) или до исполнения запроса, связанного с этим менеджером, уничтожающего временную таблицу с помощью конструкции УНИЧТОЖИТЬ.
В одном прикладном решении может быть создано произвольное количество менеджеров временных таблиц, каждый из которых хранит свой набор временных таблиц. Каждая временная таблица однозначно идентифицируется своим именем, и в пределах одного менеджера временных таблиц все временные таблицы должны иметь уникальные имена.