Разработка в 1С часто сталкивается с ситуациями, когда текст запроса не является статичным. Мы используем условия, тернарные операторы ?() и конкатенацию строк, чтобы адаптировать запрос под конкретные параметры отчета или обработки. Однако у такого подхода есть существенный минус: такой запрос невозможно открыть в стандартном конструкторе, так как он содержит программный код на языке 1С, а не чистый SQL-подобный текст.
Рассмотрим ситуацию на примере запроса из темы, где условия ГДЕ и УПОРЯДОЧИТЬ ПО собираются «на лету» в зависимости от значений ПараметрыОтчета. Разберем пошагово, как эффективно отладить такой код и проверить правильность его выполнения.
Проанализируем самый доступный способ. Поскольку платформа выполняет запрос только тогда, когда он полностью сформирован в виде строки, мы можем перехватить эту строку непосредственно перед выполнением. Выясним, как это сделать правильно:
Запрос.Выполнить() (или Запрос.ВыполнитьПакет()).Запрос и нажмем Shift + F9 (Вычислить выражение).Текст.?() и вставились нужные фрагменты строк.Полученный текст можно скопировать и вставить в любую консоль запросов. Однако помните, что конструктор запроса все равно может выдать ошибку, если в тексте присутствуют специфические символы переноса строк (вертикальная черта |). Чтобы очистить текст, можно воспользоваться функцией поиска и замены или специализированными инструментами.
Проблема копирования текста вручную заключается в том, что параметры запроса (например, &Организация, &Дата) остаются не заполненными в консоли. Рассмотрим, как упростить этот процесс. Профессиональные программисты используют консоли запросов с перехватом. Эти обработки позволяют:
Проанализируем, почему это важно. В вашем запросе используется условие по списку контрагентов: В(&Контрагенты). Если этот список велик, ручное заполнение его в консоли для проверки результата займет много времени. Специализированные консоли подтягивают эти объекты напрямую из памяти сеанса.
Ваш запрос активно использует временные таблицы: вр_ОсновноеСредство, вр_Договора, вр_Осн и вр_доп. Если итоговый результат неверен, нам нужно проверить промежуточные данные. Рассмотрим, как это сделать программно.
Для доступа к содержимому временных таблиц необходимо, чтобы у объекта Запрос был инициализирован МенеджерВременныхТаблиц. Посмотрим на пример кода для отладки промежуточного состояния:
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
// После выполнения части запроса, где создается вр_Осн:
ЗапросПроверки = Новый Запрос("ВЫБРАТЬ * ИЗ вр_Осн");
ЗапросПроверки.МенеджерВременныхТаблиц = МенеджерВТ;
ТаблицаРезультата = ЗапросПроверки.Выполнить().Выгрузить();
// Теперь в ТаблицаРезультата можно посмотреть данные временной таблицы
Используя этот метод, мы можем в любой момент «заглянуть» внутрь цепочки соединений и понять, на каком этапе пропадают записи или дублируются суммы.
В тексте запроса встречается сложная логика формирования итогов:
?(не ПараметрыОтчета.ВыводитьИтогиПоКонтрагенту, "ОБЩИЕ,", "Контрагент,").
Такие конструкции часто приводят к ошибкам синтаксиса, если забыта запятая или пробел при склейке. Выясним причину возможной ошибки: если ПараметрыОтчета.ВыводитьИтогиПоКонтрагенту истинно, текст превращается в ПО Контрагент, Регистратор. Если же в поле выбора нет поля Контрагент (оно называется КонтрагентНаименование во временной таблице), запрос упадет с ошибкой.
Рассмотрим рекомендации по рефакторингу, чтобы отладка стала проще:
СхемаЗапроса. Это позволит программно добавлять таблицы и условия как объекты, что исключает ошибки синтаксиса при склейке строк.//УСЛОВИЕ_КОНТРАГЕНТЫ, и заменяйте их через СтрЗаменить().Если запрос выполняется на сервере и вы не можете воспользоваться отладчиком (например, в фоновом задании), проанализируем ситуацию через Технологический журнал (ТЖ). Настроив сбор событий DBMSSQL или SDBL, мы получим полный текст SQL-запроса, который платформа отправила к СУБД. Это «тяжелый» метод, но он незаменим при поиске проблем с производительностью в сложных соединениях, как в вашем случае с РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт.
Подводя итог: для быстрой отладки вашего запроса наиболее эффективным будет сочетание извлечения текста через Shift+F9 и использование внешней консоли запросов, адаптированной под управляемые формы. Это позволит вам не только увидеть финальный текст без операторов ?(), но и сразу запустить его на реальных данных для анализа сумм.