Как отладить запрос с Менеджером временных таблиц и итогами в 1С?

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

При разработке сложных механизмов в конфигурациях уровня "1С:Управление торговлей" или "1С:ERP" мы часто сталкиваемся с необходимостью написания объемных запросов. Ситуация усложняется, когда запрос использует Менеджер временных таблиц (МВТ), наполненный данными в предыдущих этапах кода, и содержит конструкцию ИТОГИ ПО, возвращающую иерархический результат. Рассмотрим подробно, почему возникают сложности с отладкой таких запросов и какие инструменты позволяют эффективно решить эту задачу.

Суть проблемы: контекст и визуализация

Разберем ситуацию, описанную автором вопроса. Имеется большой программный код, который последовательно помещает различные таблицы (например, остатки, доступность ячеек, номенклатуру) в объект МенеджерВременныхТаблиц. Финальный запрос обращается к этим временным таблицам и формирует результат с итогами:


Запрос.Текст = "
    // ... текст выборки ...
    ИТОГИ ПО
        Распоряжение,
        Номенклатура,
        Характеристика,
        Назначение,
        Серия";

При попытке отладить этот запрос возникают две основные трудности:

  1. Потеря контекста временных таблиц. Если просто скопировать текст запроса в обычную Консоль запросов, она выдаст ошибку "Таблица не найдена". Это происходит потому, что обычная консоль работает в своем сеансе (или контексте) и ничего не знает о тех данных, которые находятся в переменной МенеджерВременныхТаблиц запущенного сеанса отладки.
  2. Сложность просмотра иерархии. Результат запроса с итогами при выгрузке методом Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам) превращается в ДеревоЗначений. Просмотреть глубокую вложенность этого дерева в стандартном табло отладчика бывает крайне неудобно, особенно если дерево содержит тысячи строк.

Проанализируем доступные методы решения этой задачи, от простых штатных средств до профессиональных инструментов.

Способ 1. Использование профессиональных инструментов (ИР)

Как справедливо заметили участники обсуждения, наиболее эффективным способом работы с "потерянными" временными таблицами является использование подсистем типа Инструменты разработчика (ИР) или продвинутых консолей запросов с поддержкой отладки.

Рассмотрим, как работает механизм "Отложенной отладки" в таких инструментах:

  1. В коде конфигурации, непосредственно перед выполнением проблемного запроса, мы вызываем специальный метод инструментария.
  2. Этот метод "консервирует" (сериализует) текущее состояние менеджера временных таблиц и параметров запроса в файл на диске.
  3. Затем мы запускаем внешнюю обработку "Консоль запросов ИР" и загружаем в нее сохраненный файл.
  4. Консоль восстанавливает окружение: создает временные таблицы с теми же данными, заполняет параметры и текст запроса, позволяя использовать Уничтожитель временных таблиц для оптимизации пакета.

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

Способ 2. Штатные средства отладки (Визуализаторы)

Если под рукой нет специализированных инструментов, мы можем воспользоваться встроенными возможностями платформы 1С:Предприятие 8.3. Рассмотрим работу с визуализаторами.

Когда вы получаете результат запроса в виде дерева, код выглядит примерно так:


ДеревоРезультата = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

Поставим точку останова на следующей строке после выполнения этого кода. Наведем курсор на переменную ДеревоРезультата или добавим её в "Табло". Рядом со значением переменной (тип ДеревоЗначений) есть иконка лупы ("Показать значение в отдельном окне") или карандаша.

Нажатие на эту иконку открывает штатный визуализатор коллекций. Он позволяет:

Однако, этот метод имеет недостатки: в визуализаторе нельзя выполнить запрос заново или изменить его текст. Он служит только для просмотра уже полученного результата.

Способ 3. Программная передача МВТ в консоль

Многие современные консоли запросов, такие как совместимая консоль для всех платформ 1С, поддерживают передачу МВТ в качестве параметра при программном открытии.

Разберем алгоритм действий, если вы хотите встроить вызов консоли прямо в отлаживаемый код:


// Примерный код для вызова консоли в режиме отладки
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("МенеджерВременныхТаблиц", Запрос.МенеджерВременныхТаблиц);
ПараметрыОткрытия.Вставить("ТекстЗапроса", Запрос.Текст);
ПараметрыОткрытия.Вставить("Параметры", Запрос.Параметры);

// Открываем внешнюю обработку консоли
ОткрытьФорму("ВнешняяОбработка.КонсольЗапросов.Форма", ПараметрыОткрытия);

Этот метод требует наличия консоли, умеющей принимать такие параметры (например, Отладчик запроса 1С 8.3), но он очень удобен, так как позволяет "на лету" провалиться в контекст выполнения и проверить данные.

Особенности работы с итогами (TOTALS)

В обсуждении был затронут важный момент: "Не пользуйтесь Итогами в запросах". Проанализируем это утверждение. Использование конструкции ИТОГИ ПО действительно накладывает определенные ограничения и риски:

  1. Производительность. Расчет итогов выполняется на сервере приложений 1С, а не на SQL-сервере. При выборке огромных массивов данных это может привести к избыточному потреблению оперативной памяти процессами rphost.
  2. Сложность обработки. Обход результата с итогами требует внимательности. Если вы используете ОбходРезультатаЗапроса.ПоГруппировкам, выборка вернет только верхний уровень. Чтобы добраться до детальных записей, внутри цикла нужно снова вызывать метод Выбрать() для текущей строки группировки.

Альтернатива итогам: Если ваша задача — вывести сложный отчет, рассмотрите использование Системы Компоновки Данных (СКД). В СКД вы пишете "плоский" запрос без итогов, а группировки и суммы настраиваются в структуре настроек схемы компоновки. Это значительно упрощает отладку запроса (так как он возвращает простую таблицу) и перекладывает задачу группировки на оптимизированные механизмы платформы.

Как просмотреть "плоскую" таблицу для проверки цифр?

Иногда дерево значений слишком громоздкое, и нам нужно просто убедиться, что цифры (например, СвободныйОстаток) считаются верно, не обращая внимания на иерархию. В этом случае мы можем временно изменить код выгрузки:


// Было: выгрузка в дерево
// Таб = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

// Стало: выгрузка в плоскую таблицу
Таб = Запрос.Выполнить().Выгрузить();

В этом случае переменная Таб станет объектом ТаблицаЗначений. Конструкция ИТОГИ все равно отработает, но результат будет представлен в виде списка, где строки итогов и детальные записи будут идти друг за другом. В такой таблице проще использовать отборы и поиск в отладчике, чтобы найти конкретную номенклатуру и проверить её остаток.

Резюме

Для успешной отладки запросов с менеджером временных таблиц и итогами рекомендуем придерживаться следующего алгоритма:

  1. Если нужно часто менять текст запроса и анализировать данные временных таблиц — используйте инструменты с поддержкой "Отложенной отладки" (ИР) или передавайте МВТ в консоль программно.
  2. Если нужно быстро проверить структуру данных без изменения запроса — используйте встроенный визуализатор отладчика (лупа).
  3. Если дерево слишком сложно для восприятия — временно выгрузите результат в плоскую ТаблицаЗначений или откажитесь от конструкции ИТОГИ в пользу СКД для построения отчетов.
← На главную