Как отлаживать сложный динамический запрос в 1С?

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

Разработка в 1С часто сталкивается с ситуациями, когда текст запроса не является статичным. Мы используем условия, тернарные операторы ?() и конкатенацию строк, чтобы адаптировать запрос под конкретные параметры отчета или обработки. Однако у такого подхода есть существенный минус: такой запрос невозможно открыть в стандартном конструкторе, так как он содержит программный код на языке 1С, а не чистый SQL-подобный текст.

Рассмотрим ситуацию на примере запроса из темы, где условия ГДЕ и УПОРЯДОЧИТЬ ПО собираются «на лету» в зависимости от значений ПараметрыОтчета. Разберем пошагово, как эффективно отладить такой код и проверить правильность его выполнения.

Метод 1: Извлечение итогового текста через отладчик

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

  1. Установим точку останова на строке кода Запрос.Выполнить() (или Запрос.ВыполнитьПакет()).
  2. Запустим программу в режиме отладки и дождемся остановки на этой строке.
  3. Выделим переменную Запрос и нажмем Shift + F9 (Вычислить выражение).
  4. В открывшемся окне раскроем свойства объекта и найдем поле Текст.
  5. Нажмем F2 на значении текста. Теперь перед нами «чистый» текст запроса, в котором уже отработали все условия ?() и вставились нужные фрагменты строк.

Полученный текст можно скопировать и вставить в любую консоль запросов. Однако помните, что конструктор запроса все равно может выдать ошибку, если в тексте присутствуют специфические символы переноса строк (вертикальная черта |). Чтобы очистить текст, можно воспользоваться функцией поиска и замены или специализированными инструментами.

Метод 2: Работа с параметрами и консолью запросов

Проблема копирования текста вручную заключается в том, что параметры запроса (например, &Организация, &Дата) остаются не заполненными в консоли. Рассмотрим, как упростить этот процесс. Профессиональные программисты используют консоли запросов с перехватом. Эти обработки позволяют:

Проанализируем, почему это важно. В вашем запросе используется условие по списку контрагентов: В(&Контрагенты). Если этот список велик, ручное заполнение его в консоли для проверки результата займет много времени. Специализированные консоли подтягивают эти объекты напрямую из памяти сеанса.

Метод 3: Отладка временных таблиц через Менеджер

Ваш запрос активно использует временные таблицы: вр_ОсновноеСредство, вр_Договора, вр_Осн и вр_доп. Если итоговый результат неверен, нам нужно проверить промежуточные данные. Рассмотрим, как это сделать программно.

Для доступа к содержимому временных таблиц необходимо, чтобы у объекта Запрос был инициализирован МенеджерВременныхТаблиц. Посмотрим на пример кода для отладки промежуточного состояния:


МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

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

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

Метод 4: Анализ динамических условий в ИТОГАХ

В тексте запроса встречается сложная логика формирования итогов: ?(не ПараметрыОтчета.ВыводитьИтогиПоКонтрагенту, "ОБЩИЕ,", "Контрагент,"). Такие конструкции часто приводят к ошибкам синтаксиса, если забыта запятая или пробел при склейке. Выясним причину возможной ошибки: если ПараметрыОтчета.ВыводитьИтогиПоКонтрагенту истинно, текст превращается в ПО Контрагент, Регистратор. Если же в поле выбора нет поля Контрагент (оно называется КонтрагентНаименование во временной таблице), запрос упадет с ошибкой.

Рассмотрим рекомендации по рефакторингу, чтобы отладка стала проще:

  1. Используйте Схему запроса: Вместо сборки текста строками, используйте объект СхемаЗапроса. Это позволит программно добавлять таблицы и условия как объекты, что исключает ошибки синтаксиса при склейке строк.
  2. Шаблоны с заменой: Вместо тернарных операторов внутри строки используйте метки, например //УСЛОВИЕ_КОНТРАГЕНТЫ, и заменяйте их через СтрЗаменить().

Метод 5: Использование Технологического журнала

Если запрос выполняется на сервере и вы не можете воспользоваться отладчиком (например, в фоновом задании), проанализируем ситуацию через Технологический журнал (ТЖ). Настроив сбор событий DBMSSQL или SDBL, мы получим полный текст SQL-запроса, который платформа отправила к СУБД. Это «тяжелый» метод, но он незаменим при поиске проблем с производительностью в сложных соединениях, как в вашем случае с РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт.

Подводя итог: для быстрой отладки вашего запроса наиболее эффективным будет сочетание извлечения текста через Shift+F9 и использование внешней консоли запросов, адаптированной под управляемые формы. Это позволит вам не только увидеть финальный текст без операторов ?(), но и сразу запустить его на реальных данных для анализа сумм.

← На главную