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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1: Использование штатного отладчика и встроенных средств платформы

Самый простой способ, не требующий сторонних инструментов, — это использование встроенного отладчика 1С. Когда выполнение программы остановлено на точке останова в момент, когда объект Запрос уже инициализирован и, возможно, часть временных таблиц уже сформирована, мы можем изучить его состояние.

Проанализируем ситуацию: если у запроса инициализирован МенеджерВременныхТаблиц, мы можем программно обращаться к его содержимому. Для этого в окне «Вычислить выражение» (Shift+F9) можно использовать следующую конструкцию:

Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ИмяВашейВТ").ПолучитьДанные().Выгрузить()

Рассмотрим подробнее этот механизм:

  1. Запрос.МенеджерВременныхТаблиц — объект, который хранит все временные таблицы текущего сеанса запроса.
  2. Таблицы — коллекция всех созданных ВТ.
  3. ПолучитьДанные() — метод, который возвращает РезультатЗапроса, содержащий строки из временной таблицы.
  4. Выгрузить() — преобразует результат в привычную ТаблицаЗначений, которую удобно просматривать через «глаз» (визуализатор) в отладчике.

Этот метод хорош для быстрой проверки, но если временных таблиц десятки, а запрос собирается динамически из кусков кода, ручной ввод выражений становится трудоемким.

Метод 2: Программный дамп (сохранение) временных таблиц на диск

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

Разберем пример кода, который автоматизирует этот процесс:


Функция СохранитьВТ(Запрос, ИмяКаталога = "C:\DebugVT\") Экспорт
    Если Запрос.МенеджерВременныхТаблиц = Неопределено Тогда
        Возврат Ложь;
    КонецЕсли;

    Для Каждого ВременнаяТаблица Из Запрос.МенеджерВременныхТаблиц.Таблицы Цикл
        ТекРезультатЗапроса = ВременнаяТаблица.ПолучитьДанные();
        ТекТЧ = ТекРезультатЗапроса.Выгрузить();
        
        ПолноеИмяФайла = ИмяКаталога + ВременнаяТаблица.ПолноеИмя + ".vt";
        ЗначениеВФайл(ПолноеИмяФайла, ТекТЧ);
    КонецЦикла;
    
    Возврат Истина;
КонецФункции

Как это использовать на практике? Вы просто вызываете эту функцию в отладчике через «Вычислить выражение». Все временные таблицы «дампятся» в указанную папку. Затем в консоли запросов, которая поддерживает загрузку таблиц значений из файлов (например, через ЗначениеИзФайла), вы подтягиваете эти данные и продолжаете отладку в режиме предприятия.

Метод 3: Специализированные консоли запросов

Опытные разработчики редко пользуются стандартной консолью. Существуют продвинутые инструменты, которые значительно упрощают жизнь при работе с Управляемыми формами и сложными конструкциями.

1. Запросник (Отладчик запросов)
Это, пожалуй, один из самых популярных инструментов. Его главная особенность — умение перехватывать параметры и временные таблицы. Вы просто копируете код инициализации запроса из конфигуратора, вставляете в Запросник, и он автоматически восстанавливает всю структуру, включая таблицы значений, переданные в качестве параметров.

2. Инструменты разработчика (ИР) от Tormozit
Это мощный комплекс, который включает в себя консоль запросов, умеющую работать в толстом клиенте управляемого приложения. Она позволяет просматривать планы выполнения запросов и очень детально анализировать временные таблицы без необходимости их ручного сохранения.

3. Консоль запросов А. С. Акулова
Классический инструмент, проверенный временем. Она отлично справляется с многоэтажными запросами и предоставляет наглядный интерфейс для анализа каждой части пакета запросов.

Метод 4: Анализ через Технологический журнал и SQL

Иногда проблема кроется не в логике 1С, а в том, как СУБД (SQL Server или PostgreSQL) интерпретирует запрос. Если запрос «тормозит» только на реальных данных, стоит заглянуть «под капот».

Выясним причину медленной работы с помощью Технологического журнала (ТЖ). Настроив событие DBV8DBS, мы можем получить чистый SQL-текст, который платформа отправляет на сервер. Это особенно важно для виртуальных таблиц (например, ОстаткиИОбороты), так как 1С превращает один компактный запрос в огромную конструкцию со множеством соединений. Анализ плана выполнения SQL-запроса поможет понять, не пропускает ли СУБД индексы и не делает ли она избыточное сканирование таблиц.

Метод 5: Использование временного хранилища

Если вы работаете в клиент-серверном варианте и не хотите возиться с записью файлов на диск (так как у сервера 1С может не быть прав на запись в нужную вам папку), можно использовать временное хранилище.

Проанализируем этот подход: в момент отладки выгружаем ВТ в таблицу значений и помещаем ее во временное хранилище через ПоместитьВоВременноеХранилище(ТЗ, Новый УникальныйИдентификатор). Полученный адрес (строку) можно скопировать и использовать в консоли запросов, которая умеет обращаться к данным по адресу во временном хранилище. Это работает быстро и не засоряет жесткий диск временными файлами.

Советы для эффективной отладки

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

← На главную