Как установить точку останова в отчете на СКД и найти причину отсутствия данных

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

Работа с Системой компоновки данных (СКД) часто напоминает взаимодействие с «черным ящиком»: мы подаем на вход схему и настройки, а на выходе получаем готовый результат. Но что делать, если отчет не выводит данные, которые точно есть в базе, или работает некорректно? В этой статье мы подробно разберем, как «вскрыть» этот механизм, где поставить точку останова и как проанализировать итоговый запрос, который 1С отправляет к СУБД.

Способ 1: Отладка через модуль отчета и процедуру ПриКомпоновкеРезультата

Стандартно СКД формирует отчет автоматически, минуя видимый программный код. Чтобы вмешаться в этот процесс и установить точку останова, нам необходимо перехватить управление в модуле объекта отчета. Разберем этот процесс по шагам.

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

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


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь; // Отключаем автоматический вывод
	
	// Устанавливаем точку останова на следующей строке:
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, 
		КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(Результат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

Что это нам дает? Установив точку останова на этапе выполнения метода Выполнить объекта КомпоновщикМакета, мы можем изучить объект МакетКомпоновки. Внутри него в свойстве НаборыДанных содержится итоговый текст запроса, который был сформирован системой с учетом всех пользовательских настроек, отборов и параметров. Именно этот текст запроса уходит в базу данных. Для быстрого извлечения и анализа такого запроса можно использовать консоль запросов с возможностью чтения запросов из отчетов СКД.

Способ 2: Использование внешних функций в вычисляемых полях

Если нам нужно понять, почему конкретная строка отчета рассчитывается неверно, мы можем использовать «хитрость» с общим модулем. Рассмотрим ситуацию, когда в СКД есть вычисляемое поле. Мы не можем поставить точку останова в конструкторе СКД, но можем вызвать функцию 1С.

Создадим в общем модуле (с флагами «Сервер» и «Вызов сервера») функцию:


Функция ОтладитьЗначение(Значение) Экспорт
    // Устанавливаем здесь точку останова
    Возврат Значение; 
КонецФункции

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

Способ 3: Использование специализированных консолей СКД

Обычная «Консоль запросов» не всегда помогает, так как она не учитывает специфику работы СКД: автозаполнение, работу с параметрами периодов виртуальных таблиц и наложенные пользователем отборы. Разберем, как правильно использовать «Консоль системы компоновки данных».

Проанализируем основные возможности консоли:

  1. Выгрузка схемы: Мы можем выгрузить XML-схему нашего отчета и его текущие настройки (через КомпоновщикНастроек) и загрузить их в консоль.
  2. Просмотр итогового запроса: В консоли есть кнопка «Получить запрос». Она показывает SQL-подобный текст запроса, который учитывает все временные таблицы, создаваемые СКД для оптимизации.
  3. Анализ параметров: Часто ошибка кроется в том, что СКД неверно интерпретирует границы периодов. В консоли наглядно видно, какие значения дат передаются в виртуальные таблицы.

Почему данные могут не попадать в отчет (проблема границ периодов)

Выясним причину частой проблемы: за один месяц (например, август) данные есть, а за следующий (сентябрь) — нет, хотя записи в базе присутствуют. Одной из главных причин является неверная работа с Границей периода.

Если в параметрах СКД указана дата 30.09.2023 00:00:00, то записи, созданные ровно в полночь или в течение этого дня, могут не попасть в выборку, если в запросе используется виртуальная таблица Остатки. Рассмотрим, как это исправить:

Отладка фоновых заданий

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

  1. Убедиться, что сервер 1С запущен с ключом /debug.
  2. В конфигураторе зайти в меню Отладка -> Подключение.
  3. В окне настроек нажать кнопку Настройка и убедиться, что установлен флаг Автоматическое подключение фоновых заданий.
  4. Только после этого запускать формирование отчета.

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

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

В процедуре ПриКомпоновкеРезультата мы можем модифицировать макет компоновки. Однако более простой способ — временно заменить в схеме тип набора данных на «Объект». Но если мы хотим остаться в рамках запроса, стоит временно заменить последнюю часть пакета запросов (которая выбирает данные из временных таблиц) на простой ВЫБРАТЬ * ИЗ ИмяВременнойТаблицы. Это позволит увидеть содержимое конкретной таблицы в итоговом результате отчета. Для этой задачи также подойдёт инструмент для фиксации и просмотра содержимого временных таблиц при отладке запросов.

Важный момент: Обратите внимание на свойство Автозаполнение в конструкторе запроса СКД. Если оно включено, система сама добавляет условия в секцию ГДЕ на основании доступных полей. Иногда это приводит к тому, что записи отсекаются из-за неявных отборов, которые вы не устанавливали вручную. Попробуйте временно отключить автозаполнение для проблемного поля и проверить результат.

← На главную