Разработка и модификация отчетов на базе Системы компоновки данных (СКД) в современных типовых конфигурациях (ЗУП 3.1, УТ 11, ERP 2) часто преподносит сюрпризы начинающим и даже опытным разработчикам. Самая распространенная ситуация: вы открываете модуль объекта отчета, ставите точку останова в процедуре ПриКомпоновкеРезультата, запускаете формирование, но программа игнорирует остановку, выдавая сразу готовый результат или ошибку. Рассмотрим подробно, почему это происходит и какими методами можно "поймать" выполнение кода.
В типовых решениях, построенных на базе Библиотеки стандартных подсистем (БСП), практически все отчеты по умолчанию формируются в фоновом режиме. Это сделано для того, чтобы пользовательский интерфейс не "замирал" во время тяжелых расчетов. Для платформы 1С фоновое задание — это отдельный сеанс на сервере, к которому отладчик конфигуратора не подключается автоматически.
Разберем по шагам, как настроить автоматическое подключение к фоновым заданиям:
Важно помнить, что этот механизм будет работать только в том случае, если на сервере 1С включен режим отладки. Проанализируем, как это проверить: в окне "О программе" в строке "Режим" должно быть написано "Отладка разрешена". Если это не так, сервер необходимо перезапустить с ключом -debug. Если включить отладку на сервере нет возможности, можно использовать расширение для отладки СКД и запросов под пользователем.
Если вы работаете с внешним отчетом, который уже зарегистрирован в справочнике "Дополнительные отчеты и обработки", 1С при запуске из интерфейса создает временную копию этого объекта. Точка останова, поставленная в файле на диске, не сработает, так как исполняется код из временного хранилища базы данных.
Рассмотрим самое простое решение этой проблемы: временно уберите отчет из справочника "Дополнительные отчеты" и откройте его как обычный файл через меню Файл — Открыть. В этом случае контекст выполнения будет жестко привязан к вашему конкретному файлу .erf, и отладчик с большой вероятностью сработает даже без сложных манипуляций с сеансами.
Иногда проблема кроется в метаданных самого объекта. Выясним причину, связанную с формами: если в отчете создана управляемая форма, но в свойствах объекта в качестве "Основной" все еще указана старая форма (или не указана вовсе), платформа может вести себя непредсказуемо при попытке инициализации модуля. Убедитесь, что в дереве метаданных в свойстве "Основная форма отчета" явно выбрана актуальная управляемая форма.
Типовые отчеты ЗУП 3.1 часто используют программное формирование в общих модулях, полностью игнорируя стандартное событие модуля объекта ПриКомпоновкеРезультата. Это происходит, если параметр СтандартнаяОбработка не устанавливается в значение Ложь, или если отчет вызывается через специальные процедуры БСП. Проанализируем стандартный заголовок процедуры:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// Чтобы отладчик гарантированно зашел сюда, мы должны быть уверены,
// что выполнение вообще доходит до этого обработчика.
СтандартнаяОбработка = Ложь;
// Здесь ваш программный код формирования
КонецПроцедуры
Если код внутри этой процедуры не выполняется, попробуйте поставить точку останова в Модуле менеджера отчета. В новых версиях платформы и типовых конфигурациях часть инициализации настроек СКД вынесена именно туда.
Одной из главных сложностей в отчетах типа расчетных листков или ведомостей является то, что текст запроса собирается динамически в общих модулях (например, через механизмы формирования временных таблиц по стажу или начислениям). Попытка прочитать такой запрос в СКД — задача практически невыполнимая из-за его объема.
Рассмотрим алгоритм действий для таких сложных случаев:
СформироватьТекстЗапроса...).
ТекстЗапросаДляОтладки = ПостроительЗапроса.Текст; // Или аналогичная переменная
Сообщить(ТекстЗапросаДляОтладки);
Если стандартные точки останова игнорируются, мы можем прибегнуть к программному вызову исключения или записи в журнал, чтобы убедиться, что код вообще выполняется. Посмотрим на пример использования журнала регистрации:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
ЗаписьЖурналаРегистрации("ОтладкаОтчета", УровеньЖурналаРегистрации.Информация, , , "Процедура ПриКомпоновкеРезультата вызвана!");
// Если запись в журнале появилась, значит проблема только в подключении отладчика.
// Если записи нет — значит управление передано в другие модули БСП.
КонецПроцедуры
Также можно воспользоваться методом "Остановка по ошибке". В конфигураторе выберите Отладка — Остановка по ошибке, установите флажок "Останавливаться по ошибке". В коде отчета напишите заведомо ошибочную строку, например а = 1/0;. Если выполнение дойдет до этой строки, платформа принудительно откроет конфигуратор на этом месте, и вы окажетесь внутри нужного контекста фонового задания.
Подведем итог: чаще всего отладка не срабатывает из-за того, что отчет выполняется в фоновом сеансе, который не "подцеплен" к конфигуратору. Включите автоматическое подключение фоновых заданий и попробуйте открыть отчет как файл. Это решит 90% проблем с отладкой СКД в типовых конфигурациях. Если же отчет слишком сложен (как в ЗКГУ), фокусируйтесь не на модуле отчета, а на поиске места формирования текста запроса в общих модулях БСП. Для анализа структуры компоновки и поиска ошибок в данных пригодится инструмент для отладки отчетов на СКД.