К статье
Практический материал

Отчеты и Аналитика · 12 мин

Как отлаживать СКД в 1С: практическое руководство

Практическое руководство по отладке СКД в 1С: точки останова в запросах, отладка наборов данных, вычисляемых полей, ресурсов и типичные ошибки компоновки.

Система компоновки данных (СКД) — мощный механизм построения отчётов в 1С, но именно она чаще всего вызывает у разработчиков вопрос «почему отчёт выводит не то?». Отладка СКД отличается от обычной отладки кода: значительная часть логики выполняется внутри платформы, и классическая точка останова там не сработает. Приходится комбинировать несколько приёмов — от внешних отчётов до консоли СКД и анализа итогового запроса.

Типичные симптомы проблем с СКД: отчёт пустой, хотя данные в базе есть; дублируются строки; итоги не сходятся; вычисляемое поле выдаёт NULL или ноль; отбор «не срабатывает». У каждого симптома есть свой путь диагностики, и в большинстве случаев причина находится за 10–15 минут, если действовать системно, а не методом случайных изменений настроек.

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

Почему СКД нельзя отладить обычной точкой останова

Когда СКД формирует отчёт, платформа сама строит итоговый запрос, добавляет в него отборы, группировки, итоги и выполняет его внутри механизма компоновки. Этот автоматически сгенерированный запрос не существует в виде кода, который можно поставить на паузу. Поэтому стандартный отладчик конфигуратора «видит» только те места, где есть явный встроенный код: обработчики событий отчёта, выражения вычисляемых полей на встроенном языке, код формирования наборов данных типа «Объект».

Отсюда главный принцип отладки СКД — разложить проблему на слои. Первый слой — данные (запрос или программный набор). Второй слой — настройки компоновки (поля, отборы, ресурсы, группировки). Третий слой — программное окружение отчёта (параметры, код в модуле объекта, переопределённые настройки). Проверять слои нужно именно в этом порядке: бессмысленно копаться в настройках, если сам запрос уже возвращает неверные данные.

Шаг 1. Проверка запроса набора данных в консоли запросов

Первое действие при любом подозрительном отчёте — скопировать текст запроса из набора данных и выполнить его в консоли запросов (типовая обработка с диска ИТС или аналогичная). В консоли подставьте те же значения параметров, с которыми формируется отчёт, и посмотрите результат. Если данные уже здесь неверные — проблема в запросе, а не в СКД, и дальнейшая отладка компоновки бессмысленна.

Частые проблемы на этом этапе: лишнее левое соединение, которое размножает строки; отсутствие отбора по периоду в виртуальной таблице, из-за чего запрос тормозит и возвращает лишнее; неверные параметры виртуальных таблиц (например, не передан список счетов в ОборотыДтКт). Особое внимание уделите виртуальным таблицам регистров — параметры в фигурных скобках в СКД-запросе ({&НачалоПериода}) работают иначе, чем обычные параметры, и при ручной проверке их нужно подставить явно.

Если запрос в консоли возвращает правильные данные, а отчёт — нет, проблема выше по стеку: в настройках компоновки или в отборах, которые СКД добавляет автоматически. Тогда переходите к анализу макета компоновки.

Порядок проверки запроса
  1. 1
    Скопируйте текст запроса из набора данных СКД
  2. 2
    Откройте консоль запросов и вставьте текст
  3. 3
    Подставьте те же параметры, что и в отчёте
  4. 4
    Выполните запрос и сверьте результат с ожиданием
  5. 5
    Если данные неверны — исправляйте запрос, если верны — переходите к макету компоновки

Шаг 2. Анализ макета компоновки данных

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

Пример кода для получения макета в модуле объекта отчёта или во внешней обработке:

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

МакетКомпоновки = КомпоновщикМакета.Выполнить(

СхемаКомпоновкиДанных,

КомпоновщикНастроек.ПолучитьНастройки());

Для Каждого Набор Из МакетКомпоновки.НаборыДанных Цикл

Сообщить(Набор.Запрос);

КонецЦикла;

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

1c
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
Сообщить(МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос);

Шаг 3. Отладка наборов данных типа «Объект» и кода отчёта

Если набор данных имеет тип «Объект» (данные формируются программно, например таблицей значений), отладка становится классической. Поставьте точку останова в обработчике ПриКомпоновкеРезультата модуля объекта отчёта — там, где заполняется внешний набор данных. Запустите отчёт в режиме отладки предприятия и пошагово проверьте содержимое таблицы значений перед передачей её в процессор компоновки.

Обратите внимание: имена колонок таблицы значений должны точно совпадать с именами полей, указанными в наборе данных на закладке «Поля» схемы компоновки. Расхождение даже в одном символе приведёт к пустым значениям в отчёте без каких-либо сообщений об ошибке. Это одна из самых коварных проблем — платформа молча подставляет NULL.

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

Шаг 4. Проверка ресурсов, итогов и группировок

Если детальные строки в отчёте правильные, а итоги не сходятся, проблема почти всегда в настройке ресурсов. Откройте закладку «Ресурсы» схемы компоновки и проверьте: выбрано ли поле как ресурс, верное ли выражение агрегирования (Сумма, Количество, Максимум), и — критически важно — на закладке настройки ресурса указано, по каким группировкам он рассчитывается. Если ресурс рассчитывается не по всем группировкам, в некоторых итогах будет пусто.

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

Ещё один источник ошибок в итогах — роли полей. Если поле-период не отмечено как период в ролях, СКД может неверно строить итоги по временным группировкам. Проверьте закладку «Наборы данных» → колонку ролей для полей типа «Период», «Остаток» и т.п.

Типичные ошибки при работе с СКД
01
Левое соединение с неуникальной таблицей — суммы в отчёте задваиваются или застраиваются
02
Имя колонки таблицы значений не совпадает с именем поля набора — поле молча выводится пустым
03
Ресурс не рассчитывается по нужной группировке — в итогах по группе пусто или ноль
04
Отбор наложен на поле, недоступное в настройках, — отбор игнорируется без предупреждения
05
Параметры виртуальной таблицы не заполнены — запрос сканирует весь регистр и отчёт формируется минутами

Шаг 5. Отладка отборов и параметров

Симптом «отбор не работает» обычно имеет одну из трёх причин. Первая: поле отбора не включено в список доступных полей настройки — тогда СКД просто игнорирует условие. Вторая: отбор установлен в пользовательских настройках, но отключён (флажок использования снят). Третья: параметр отчёта имеет тип «Дата», а поле в запросе — «Дата и время», из-за чего сравнение по границе периода отсекает часть данных. Для конца периода используйте функцию КонецПериода() или задавайте время 23:59:59.

Обязательные параметры с незаполненным значением — ещё один частый источник пустого отчёта. Проверьте закладку «Параметры» схемы: у параметров типа «Стандартный период» значения НачалоПериода и КонецПериода должны реально передаваться в запрос. Через макет компоновки (шаг 2) вы увидите, какие значения подставились в финальный запрос.

Контрольные точки

Как проверить результат отладки

Данные в консоли запросов
Норма

Совпадают с ожидаемыми по контрольному примеру

Тревожный признак

Строки дублируются или отсутствуют — чинить запрос

Финальный запрос из макета компоновки
Норма

Содержит все отборы и параметры пользователя

Тревожный признак

Отбор отсутствует в тексте запроса — поле недоступно в настройках

Итоги по группировкам
Норма

Равны сумме детальных строк

Тревожный признак

Итоги пустые или больше суммы строк — проверять ресурсы и связи

Инструменты, которые ускоряют отладку

Консоль СКД (внешняя обработка, доступная на диске ИТС и в открытых библиотеках) позволяет загрузить схему компоновки, настроить параметры и сразу увидеть результат без запуска всего отчёта. Это самый быстрый способ экспериментировать с настройками: меняете отбор — сразу видите эффект, без перезапуска сеанса.

Конструктор схемы компоновки в конфигураторе имеет встроенную проверку: кнопка «Проверить» на некоторых закладках покажет синтаксические ошибки запроса. Для сложных отчётов полезно временно упростить схему — отключить часть наборов данных и полей, чтобы локализовать проблемный участок методом исключения.

Наконец, не пренебрегайте выводом промежуточных данных через Сообщить() или в журнал регистрации: текст финального запроса, число строк в наборе, значения параметров. Три-четыре контрольных сообщения часто локализуют проблему быстрее, чем час пошаговой отладки.

Полезная привычка: для каждого нетривиального отчёта держите контрольный пример — небольшой набор данных с заранее известным результатом. После любого изменения схемы прогоняйте отчёт на этом примере. Это позволяет сразу заметить, что правка одного отчёта сломала итоги в другом варианте настроек.
ПЗ
Практическое замечание

Частые вопросы по отладке СКД

Почему отчёт пустой, хотя запрос в консоли возвращает данные?

Чаще всего причина в отборах или параметрах, которые СКД добавляет к запросу автоматически. Получите макет компоновки и посмотрите финальный запрос — скорее всего, в него попало условие, отсекающее все строки: незаполненный обязательный параметр, отбор по пустому списку или дата с неверным временем. Также проверьте, что выбранные в настройках поля действительно присутствуют в схеме.

Как поставить точку останова внутри запроса СКД?

Напрямую — никак: итоговый запрос генерируется платформой и не существует как код. Вместо этого скопируйте запрос набора данных (или финальный запрос из макета компоновки) в консоль запросов и отлаживайте его там, варьируя параметры и условия. Точки останова работают только в обработчиках модуля отчёта и в коде формирования наборов типа «Объект».

Вычисляемое поле выводит пусто, хотя выражение верное. Что проверить?

Во-первых, убедитесь, что все поля, участвующие в выражении, выбраны в настройках отчёта или помечены как автополе — СКД не вычислит выражение по полям, которые не попали в выборку. Во-вторых, проверьте типы: выражение на языке СКД с NULL в одном из операндов вернёт NULL. В-третьих, если выражение на встроенном языке, убедитесь, что оно написано без синтаксических ошибок — платформа не всегда сообщает о них явно.

Почему итоги по группировке больше суммы детальных строк?

Это признак размножения строк при соединении наборов данных. Если связь наборов идёт по неуникальному ключу (например, по номенклатуре, у которой несколько строк в присоединяемом наборе), строки основного набора дублируются, и агрегаты типа Максимум или Сумма по разным полям дают несогласованные итоги. Проверьте закладку «Связи наборов данных» и уникальность ключа связи.

Отчёт формируется очень долго — как найти узкое место?

Выполните финальный запрос из макета компоновки в консоли с замером времени. Если медленно работает сам запрос — проверьте параметры виртуальных таблиц (отборы должны накладываться внутри виртуальной таблицы, а не в общем WHERE) и наличие индексов по полям соединений. Если запрос быстрый, а отчёт медленный — проблема в компоновке: слишком много детальных записей, сложные вычисляемые поля или вывод без группировок.

Можно ли отлаживать СКД без конфигуратора?

Частично да. Консоль СКД и консоль запросов работают в режиме предприятия и позволяют проверить запрос, настройки и результат без открытия конфигуратора. Но для анализа макета компоновки через код и отладки обработчиков модуля отчёта потребуется конфигуратор с включённой отладкой и соответствующие права.

Итог

Что важно запомнить

Отлаживайте СКД послойно: сначала запрос в консоли, затем финальный запрос из макета компоновки, затем настройки ресурсов и связей, и только потом программный код. Большинство проблем — это размножение строк из-за связей, несовпадение имён полей и «потерянные» отборы. Работайте на копии базы и проверяйте результат на контрольном примере.