В процессе разработки на платформе 1С:Предприятие часто возникают ситуации, когда необходимо собрать данные из нескольких источников, каждый из которых работает со своим экземпляром объекта МенеджерВременныхТаблиц. Многие разработчики сталкиваются с вопросом: можно ли «подружить» эти менеджеры в одном финальном запросе, чтобы выполнить полное соединение, объединение таблиц или быстрый анализ данных? Давайте разберем эту ситуацию и выясним, какие пути решения существуют на текущий момент.
Прежде чем приступать к решению, важно осознать, почему эта задача не имеет прямого «волшебного» способа реализации. Объект МенеджерВременныхТаблиц — это контейнер, который управляет жизненным циклом временных таблиц в рамках сеанса или конкретного выполнения запроса. Платформа 1С строго изолирует области видимости временных таблиц. Даже если в двух разных менеджерах существуют таблицы с идентичными именами, для системы это принципиально разные объекты.
На сегодняшний день один запрос может работать только с одним экземпляром МенеджерВременныхТаблиц. Попытка обратиться к таблице, созданной в одном менеджере, из запроса, использующего другой менеджер (что часто проверяют через консоль запросов для управляемых форм), неизбежно приведет к ошибке выполнения.
Самый универсальный и надежный способ — это промежуточная выгрузка данных. Если вам необходимо объединить данные из двух разных МВТ, используйте ТаблицаЗначений как буфер. Этот метод работает на любых версиях платформы и гарантирует стабильность.
Разберем процесс по шагам:
МенеджерВременныхТаблиц №1 и выгрузите результат в ТаблицаЗначений:
Запрос1 = Новый Запрос;
Запрос1.МенеджерВременныхТаблиц = МВТ1;
Запрос1.Текст = "ВЫБРАТЬ * ИЗ ВТ_Дети";
Результат = Запрос1.Выполнить().Выгрузить();
МенеджерВременныхТаблиц №2, передайте эту таблицу через параметр:
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МВТ2;
Запрос2.УстановитьПараметр("ТаблицаДети", Результат);
Запрос2.Текст = "ВЫБРАТЬ * ИЗ &ТаблицаДети КАК ВТ_Дети ПОМЕСТИТЬ ВТ_Дети_Из_ПервогоМенеджера";
Запрос2.Выполнить();
МВТ2, и вы можете беспрепятственно выполнять соединение.Если вы чувствуете, что «перекладывание» данных через ТЗ выглядит как костыль, возможно, пришло время пересмотреть архитектуру формирования отчета или обработки. Вместо того чтобы создавать менеджеры в разных подсистемах независимо, попробуйте передавать МенеджерВременныхТаблиц в качестве параметра в ваши общие модули.
Рассмотрим структуру передачи ссылки:
Вместо создания МенеджерВременныхТаблиц внутри общего модуля, принимайте его как аргумент функции:
Функция ПолучитьДанныеДетей(МенеджерВременныхТаблиц) Экспорт
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ ... ПОМЕСТИТЬ ВТ_ТаблицаДети ...";
Запрос.Выполнить();
КонецФункции
Таким образом, вызвав несколько функций последовательно и передав в них один и тот же экземпляр менеджера, вы получите все временные таблицы в одной области видимости, что позволит соединить их одним простым запросом без выгрузки данных в память сервера.
Если задача заключается в подготовке отчета, рассмотрите возможность использования Система Компоновки Данных. СКД позволяет гибко настраивать «Связи наборов данных». Вы можете определить два отдельных набора данных (запроса), каждый из которых будет использовать свой собственный менеджер временных таблиц, и настроить объединение или соединение этих наборов уже на уровне настроек схемы компоновки.
Это избавляет от необходимости «смешивать» менеджеры вручную, так как СКД берет на себя управление процессом получения данных из разных источников, объединяя результаты на финальной стадии формирования отчета.
На текущий момент не существует штатного синтаксиса для перекрестного обращения к разным МенеджерВременныхТаблиц в одном операторе ВЫБРАТЬ. Мы рекомендуем следующие подходы:
ТаблицаЗначений и последующую загрузку в новый менеджер через параметры запроса. Это самый предсказуемый вариант.Следите за обновлениями платформы 1С:Предприятие. Сообщество разработчиков постоянно обсуждает возможные улучшения работы с временными таблицами, и, возможно, в будущих версиях появятся более изящные механизмы для решения подобных задач.