Отчеты и Аналитика · 12 мин
Как отлаживать СКД в 1С: практическое руководство
Практическое руководство по отладке СКД в 1С: точки останова в запросах, отладка наборов данных, вычисляемых полей, ресурсов и типичные ошибки компоновки.
Система компоновки данных (СКД) — мощный механизм построения отчётов в 1С, но именно она чаще всего вызывает у разработчиков вопрос «почему отчёт выводит не то?». Отладка СКД отличается от обычной отладки кода: значительная часть логики выполняется внутри платформы, и классическая точка останова там не сработает. Приходится комбинировать несколько приёмов — от внешних отчётов до консоли СКД и анализа итогового запроса.
Типичные симптомы проблем с СКД: отчёт пустой, хотя данные в базе есть; дублируются строки; итоги не сходятся; вычисляемое поле выдаёт NULL или ноль; отбор «не срабатывает». У каждого симптома есть свой путь диагностики, и в большинстве случаев причина находится за 10–15 минут, если действовать системно, а не методом случайных изменений настроек.
В этом материале разобраны рабочие приёмы отладки: как проверить запрос набора данных отдельно от СКД, как посмотреть макет компоновки, как отладить код в модуле объекта отчёта и наборы данных типа «Объект», а также частые ошибки, которые приводят к неверным итогам и пустым отчётам.
Почему СКД нельзя отладить обычной точкой останова
Когда СКД формирует отчёт, платформа сама строит итоговый запрос, добавляет в него отборы, группировки, итоги и выполняет его внутри механизма компоновки. Этот автоматически сгенерированный запрос не существует в виде кода, который можно поставить на паузу. Поэтому стандартный отладчик конфигуратора «видит» только те места, где есть явный встроенный код: обработчики событий отчёта, выражения вычисляемых полей на встроенном языке, код формирования наборов данных типа «Объект».
Отсюда главный принцип отладки СКД — разложить проблему на слои. Первый слой — данные (запрос или программный набор). Второй слой — настройки компоновки (поля, отборы, ресурсы, группировки). Третий слой — программное окружение отчёта (параметры, код в модуле объекта, переопределённые настройки). Проверять слои нужно именно в этом порядке: бессмысленно копаться в настройках, если сам запрос уже возвращает неверные данные.
Шаг 1. Проверка запроса набора данных в консоли запросов
Первое действие при любом подозрительном отчёте — скопировать текст запроса из набора данных и выполнить его в консоли запросов (типовая обработка с диска ИТС или аналогичная). В консоли подставьте те же значения параметров, с которыми формируется отчёт, и посмотрите результат. Если данные уже здесь неверные — проблема в запросе, а не в СКД, и дальнейшая отладка компоновки бессмысленна.
Частые проблемы на этом этапе: лишнее левое соединение, которое размножает строки; отсутствие отбора по периоду в виртуальной таблице, из-за чего запрос тормозит и возвращает лишнее; неверные параметры виртуальных таблиц (например, не передан список счетов в ОборотыДтКт). Особое внимание уделите виртуальным таблицам регистров — параметры в фигурных скобках в СКД-запросе ({&НачалоПериода}) работают иначе, чем обычные параметры, и при ручной проверке их нужно подставить явно.
Если запрос в консоли возвращает правильные данные, а отчёт — нет, проблема выше по стеку: в настройках компоновки или в отборах, которые СКД добавляет автоматически. Тогда переходите к анализу макета компоновки.
- 1Скопируйте текст запроса из набора данных СКД
- 2Откройте консоль запросов и вставьте текст
- 3Подставьте те же параметры, что и в отчёте
- 4Выполните запрос и сверьте результат с ожиданием
- 5Если данные неверны — исправляйте запрос, если верны — переходите к макету компоновки
Шаг 2. Анализ макета компоновки данных
Макет компоновки показывает финальный запрос, который СКД реально выполняет с учётом всех отборов, параметров и выбранных полей. Чтобы его получить, сформируйте отчёт программно через объект КомпоновщикМакетаКомпоновкиДанных и выведите текст запроса из макета. В отладчике этот текст можно посмотреть в табло или вывести через Сообщить().
Пример кода для получения макета в модуле объекта отчёта или во внешней обработке:
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
СхемаКомпоновкиДанных,
КомпоновщикНастроек.ПолучитьНастройки());
Для Каждого Набор Из МакетКомпоновки.НаборыДанных Цикл
Сообщить(Набор.Запрос);
КонецЦикла;
Полученный запрос вставьте в консоль запросов и выполните — вы увидите данные именно в том виде, в каком их получает СКД. Так легко обнаружить, например, что пользовательский отбор по организации реально добавился в запрос, или наоборот — что отбор «потерялся», потому что поле отбора недоступно в настройках.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
Сообщить(МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос);Шаг 3. Отладка наборов данных типа «Объект» и кода отчёта
Если набор данных имеет тип «Объект» (данные формируются программно, например таблицей значений), отладка становится классической. Поставьте точку останова в обработчике ПриКомпоновкеРезультата модуля объекта отчёта — там, где заполняется внешний набор данных. Запустите отчёт в режиме отладки предприятия и пошагово проверьте содержимое таблицы значений перед передачей её в процессор компоновки.
Обратите внимание: имена колонок таблицы значений должны точно совпадать с именами полей, указанными в наборе данных на закладке «Поля» схемы компоновки. Расхождение даже в одном символе приведёт к пустым значениям в отчёте без каких-либо сообщений об ошибке. Это одна из самых коварных проблем — платформа молча подставляет NULL.
Вычисляемые поля, выражения которых написаны на встроенном языке (а не на языке выражений СКД), тоже отлаживаются точкой останова. Но учтите: выражение вычисляется для каждой строки, поэтому остановок будет много. Удобнее временно добавить в выражение условие или выводить значения через Сообщить() с ключевым полем строки.
Шаг 4. Проверка ресурсов, итогов и группировок
Если детальные строки в отчёте правильные, а итоги не сходятся, проблема почти всегда в настройке ресурсов. Откройте закладку «Ресурсы» схемы компоновки и проверьте: выбрано ли поле как ресурс, верное ли выражение агрегирования (Сумма, Количество, Максимум), и — критически важно — на закладке настройки ресурса указано, по каким группировкам он рассчитывается. Если ресурс рассчитывается не по всем группировкам, в некоторых итогах будет пусто.
Дублирование строк и «задвоение» сумм — признак лишних связей между наборами данных или левого соединения с таблицей, где на одну строку основной таблицы приходится несколько строк присоединяемой. Проверьте закладку «Связи наборов данных»: связь должна идти по уникальному ключу. Если соединяете, например, продажи с оплатами по документу, а оплат по документу несколько — суммы продаж умножатся.
Ещё один источник ошибок в итогах — роли полей. Если поле-период не отмечено как период в ролях, СКД может неверно строить итоги по временным группировкам. Проверьте закладку «Наборы данных» → колонку ролей для полей типа «Период», «Остаток» и т.п.
Шаг 5. Отладка отборов и параметров
Симптом «отбор не работает» обычно имеет одну из трёх причин. Первая: поле отбора не включено в список доступных полей настройки — тогда СКД просто игнорирует условие. Вторая: отбор установлен в пользовательских настройках, но отключён (флажок использования снят). Третья: параметр отчёта имеет тип «Дата», а поле в запросе — «Дата и время», из-за чего сравнение по границе периода отсекает часть данных. Для конца периода используйте функцию КонецПериода() или задавайте время 23:59:59.
Обязательные параметры с незаполненным значением — ещё один частый источник пустого отчёта. Проверьте закладку «Параметры» схемы: у параметров типа «Стандартный период» значения НачалоПериода и КонецПериода должны реально передаваться в запрос. Через макет компоновки (шаг 2) вы увидите, какие значения подставились в финальный запрос.
Как проверить результат отладки
Совпадают с ожидаемыми по контрольному примеру
Строки дублируются или отсутствуют — чинить запрос
Содержит все отборы и параметры пользователя
Отбор отсутствует в тексте запроса — поле недоступно в настройках
Равны сумме детальных строк
Итоги пустые или больше суммы строк — проверять ресурсы и связи
Инструменты, которые ускоряют отладку
Консоль СКД (внешняя обработка, доступная на диске ИТС и в открытых библиотеках) позволяет загрузить схему компоновки, настроить параметры и сразу увидеть результат без запуска всего отчёта. Это самый быстрый способ экспериментировать с настройками: меняете отбор — сразу видите эффект, без перезапуска сеанса.
Конструктор схемы компоновки в конфигураторе имеет встроенную проверку: кнопка «Проверить» на некоторых закладках покажет синтаксические ошибки запроса. Для сложных отчётов полезно временно упростить схему — отключить часть наборов данных и полей, чтобы локализовать проблемный участок методом исключения.
Наконец, не пренебрегайте выводом промежуточных данных через Сообщить() или в журнал регистрации: текст финального запроса, число строк в наборе, значения параметров. Три-четыре контрольных сообщения часто локализуют проблему быстрее, чем час пошаговой отладки.
Полезная привычка: для каждого нетривиального отчёта держите контрольный пример — небольшой набор данных с заранее известным результатом. После любого изменения схемы прогоняйте отчёт на этом примере. Это позволяет сразу заметить, что правка одного отчёта сломала итоги в другом варианте настроек.
Частые вопросы по отладке СКД
Почему отчёт пустой, хотя запрос в консоли возвращает данные?
Чаще всего причина в отборах или параметрах, которые СКД добавляет к запросу автоматически. Получите макет компоновки и посмотрите финальный запрос — скорее всего, в него попало условие, отсекающее все строки: незаполненный обязательный параметр, отбор по пустому списку или дата с неверным временем. Также проверьте, что выбранные в настройках поля действительно присутствуют в схеме.
Как поставить точку останова внутри запроса СКД?
Напрямую — никак: итоговый запрос генерируется платформой и не существует как код. Вместо этого скопируйте запрос набора данных (или финальный запрос из макета компоновки) в консоль запросов и отлаживайте его там, варьируя параметры и условия. Точки останова работают только в обработчиках модуля отчёта и в коде формирования наборов типа «Объект».
Вычисляемое поле выводит пусто, хотя выражение верное. Что проверить?
Во-первых, убедитесь, что все поля, участвующие в выражении, выбраны в настройках отчёта или помечены как автополе — СКД не вычислит выражение по полям, которые не попали в выборку. Во-вторых, проверьте типы: выражение на языке СКД с NULL в одном из операндов вернёт NULL. В-третьих, если выражение на встроенном языке, убедитесь, что оно написано без синтаксических ошибок — платформа не всегда сообщает о них явно.
Почему итоги по группировке больше суммы детальных строк?
Это признак размножения строк при соединении наборов данных. Если связь наборов идёт по неуникальному ключу (например, по номенклатуре, у которой несколько строк в присоединяемом наборе), строки основного набора дублируются, и агрегаты типа Максимум или Сумма по разным полям дают несогласованные итоги. Проверьте закладку «Связи наборов данных» и уникальность ключа связи.
Отчёт формируется очень долго — как найти узкое место?
Выполните финальный запрос из макета компоновки в консоли с замером времени. Если медленно работает сам запрос — проверьте параметры виртуальных таблиц (отборы должны накладываться внутри виртуальной таблицы, а не в общем WHERE) и наличие индексов по полям соединений. Если запрос быстрый, а отчёт медленный — проблема в компоновке: слишком много детальных записей, сложные вычисляемые поля или вывод без группировок.
Можно ли отлаживать СКД без конфигуратора?
Частично да. Консоль СКД и консоль запросов работают в режиме предприятия и позволяют проверить запрос, настройки и результат без открытия конфигуратора. Но для анализа макета компоновки через код и отладки обработчиков модуля отчёта потребуется конфигуратор с включённой отладкой и соответствующие права.
Что важно запомнить
Отлаживайте СКД послойно: сначала запрос в консоли, затем финальный запрос из макета компоновки, затем настройки ресурсов и связей, и только потом программный код. Большинство проблем — это размножение строк из-за связей, несовпадение имён полей и «потерянные» отборы. Работайте на копии базы и проверяйте результат на контрольном примере.