Работа со сложными запросами в 1С, особенно в таких крупных конфигурациях, как 1С:ERP или 1С:Комплексная автоматизация, часто превращается в настоящий вызов для разработчика и консультанта. Основная трудность заключается в использовании временных таблиц (ВТ), содержимое которых невозможно увидеть простым просмотром результата финального запроса. В этой статье мы подробно разберем, как эффективно отлаживать такие запросы, какие инструменты использовать и как «вытащить» данные из временных таблиц для анализа.
Самый простой способ, не требующий сторонних инструментов, — это использование встроенного отладчика 1С. Когда выполнение программы остановлено на точке останова в момент, когда объект Запрос уже инициализирован и, возможно, часть временных таблиц уже сформирована, мы можем изучить его состояние.
Проанализируем ситуацию: если у запроса инициализирован МенеджерВременныхТаблиц, мы можем программно обращаться к его содержимому. Для этого в окне «Вычислить выражение» (Shift+F9) можно использовать следующую конструкцию:
Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ИмяВашейВТ").ПолучитьДанные().Выгрузить()
Рассмотрим подробнее этот механизм:
РезультатЗапроса, содержащий строки из временной таблицы.ТаблицаЗначений, которую удобно просматривать через «глаз» (визуализатор) в отладчике.Этот метод хорош для быстрой проверки, но если временных таблиц десятки, а запрос собирается динамически из кусков кода, ручной ввод выражений становится трудоемким.
Когда нам нужно проанализировать состояние всех временных таблиц сразу, на помощь приходит программный метод. Мы можем написать вспомогательную функцию, которая переберет все таблицы в менеджере и сохранит их в файлы. В дальнейшем эти файлы можно загрузить в любую консоль запросов как внешние источники данных.
Разберем пример кода, который автоматизирует этот процесс:
Функция СохранитьВТ(Запрос, ИмяКаталога = "C:\DebugVT\") Экспорт
Если Запрос.МенеджерВременныхТаблиц = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Для Каждого ВременнаяТаблица Из Запрос.МенеджерВременныхТаблиц.Таблицы Цикл
ТекРезультатЗапроса = ВременнаяТаблица.ПолучитьДанные();
ТекТЧ = ТекРезультатЗапроса.Выгрузить();
ПолноеИмяФайла = ИмяКаталога + ВременнаяТаблица.ПолноеИмя + ".vt";
ЗначениеВФайл(ПолноеИмяФайла, ТекТЧ);
КонецЦикла;
Возврат Истина;
КонецФункции
Как это использовать на практике? Вы просто вызываете эту функцию в отладчике через «Вычислить выражение». Все временные таблицы «дампятся» в указанную папку. Затем в консоли запросов, которая поддерживает загрузку таблиц значений из файлов (например, через ЗначениеИзФайла), вы подтягиваете эти данные и продолжаете отладку в режиме предприятия.
Опытные разработчики редко пользуются стандартной консолью. Существуют продвинутые инструменты, которые значительно упрощают жизнь при работе с Управляемыми формами и сложными конструкциями.
1. Запросник (Отладчик запросов)
Это, пожалуй, один из самых популярных инструментов. Его главная особенность — умение перехватывать параметры и временные таблицы. Вы просто копируете код инициализации запроса из конфигуратора, вставляете в Запросник, и он автоматически восстанавливает всю структуру, включая таблицы значений, переданные в качестве параметров.
2. Инструменты разработчика (ИР) от Tormozit
Это мощный комплекс, который включает в себя консоль запросов, умеющую работать в толстом клиенте управляемого приложения. Она позволяет просматривать планы выполнения запросов и очень детально анализировать временные таблицы без необходимости их ручного сохранения.
3. Консоль запросов А. С. Акулова
Классический инструмент, проверенный временем. Она отлично справляется с многоэтажными запросами и предоставляет наглядный интерфейс для анализа каждой части пакета запросов.
Иногда проблема кроется не в логике 1С, а в том, как СУБД (SQL Server или PostgreSQL) интерпретирует запрос. Если запрос «тормозит» только на реальных данных, стоит заглянуть «под капот».
Выясним причину медленной работы с помощью Технологического журнала (ТЖ). Настроив событие DBV8DBS, мы можем получить чистый SQL-текст, который платформа отправляет на сервер. Это особенно важно для виртуальных таблиц (например, ОстаткиИОбороты), так как 1С превращает один компактный запрос в огромную конструкцию со множеством соединений. Анализ плана выполнения SQL-запроса поможет понять, не пропускает ли СУБД индексы и не делает ли она избыточное сканирование таблиц.
Если вы работаете в клиент-серверном варианте и не хотите возиться с записью файлов на диск (так как у сервера 1С может не быть прав на запись в нужную вам папку), можно использовать временное хранилище.
Проанализируем этот подход: в момент отладки выгружаем ВТ в таблицу значений и помещаем ее во временное хранилище через ПоместитьВоВременноеХранилище(ТЗ, Новый УникальныйИдентификатор). Полученный адрес (строку) можно скопировать и использовать в консоли запросов, которая умеет обращаться к данным по адресу во временном хранилище. Это работает быстро и не засоряет жесткий диск временными файлами.
Таким образом, отладка сложных запросов — это комбинация использования правильных инструментов (консолей) и понимания механизмов платформы 1С. Выбор метода зависит от конкретной задачи: для быстрой проверки достаточно МенеджераВременныхТаблиц в отладчике, а для глубокого анализа архитектуры запроса в ERP лучше воспользоваться Запросником или Инструментами разработчика.