Почему в запросе 1С внезапно появляются временные таблицы и как их найти?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Понимаем природу временных таблиц в БСП

В типовых конфигурациях на БСП (Библиотека стандартных подсистем) проведение документов — это сложный многоступенчатый процесс. Часто один и тот же МенеджерВременныхТаблиц передается через ДополнительныеСвойства между различными модулями. Это делается для того, чтобы оптимизировать запросы и не пересчитывать одни и те же данные (например, остатки или цены) несколько раз.

Если вы видите, что перед вызовом Объект.Движения.Записать() таблиц нет, а при попадании в ПередЗаписью они уже появились, значит, между этими точками отработал код, который инициировал создание запроса и выполнение метода Выполнить() или ВыполнитьПакет().

Метод 1: Использование замера производительности

Самый эффективный способ увидеть «скрытые» операции — это замер производительности. Выполним следующие действия:

  1. Включите замер производительности в конфигураторе (раздел «Отладка» -> «Замер производительности»).
  2. Выполните операцию проведения документа.
  3. Откройте замер и отсортируйте его по времени или количеству вызовов.
  4. Ищите вызовы методов Выполнить() или ВыполнитьПакет(). Именно в этих местах происходит материализация временных таблиц в СУБД.
  5. Установите точки останова в найденных местах и проверьте состояние МенеджерВременныхТаблиц.Таблицы.

Метод 2: Анализ кода через «Колесо фортуны»

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

Проанализируем все места, где используется конструкция ПОМЕСТИТЬ. Хотя это не всегда срабатывает из-за динамического формирования текста запроса, поиск по строке часто выводит на нужные модули. Рассмотрим пример кода, который часто встречается в типовых решениях:


// Пример формирования временной таблицы
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.Текст = 
    "ВЫБРАТЬ * ПОМЕСТИТЬ ВТ_Товары ИЗ &Список КАК Список";
Запрос.Выполнить();

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

Метод 3: Проверка подписок на события и модулей менеджеров

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

Технологический журнал — последний рубеж отладки

Если вышеперечисленные методы не привели к успеху, используйте Технологический журнал. Это самый надежный способ увидеть, что реально отправляет сервер 1С в СУБД. Настройте фильтр событий на DBPROC (процедуры базы данных). В логах вы увидите полные тексты всех запросов, включая инструкции CREATE TABLE для временных таблиц. Это позволит точно определить, какая часть кода отправляет запрос к базе, содержащий инструкцию ПОМЕСТИТЬ.

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

← На главную