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