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