Почему не срабатывает ПриКомпоновкеРезультата во внешнем отчете 1С и как это исправить

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

При разработке внешних отчетов для конфигураций на базе БСП (например, «Управление торговлей 11», «ERP» или «Комплексная автоматизация») разработчики часто сталкиваются с ситуацией: при нажатии на кнопку «Сформировать» вызов метода СкомпоноватьРезультат происходит, однако точка останова в процедуре ПриКомпоновкеРезультата модуля объекта не срабатывает. При этом могут возникать ошибки вида «Не задано значение параметра» или отчёт формируется не по вычисляемым алгоритмам.

Разберем подробно причины возникновения такой проблемы и варианты её решения.

Причины проблемы при отладке и формировании отчета

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

  1. Кэширование внешних обработок на сервере 1С. Когда внешний отчет подгружается через подсистему «Дополнительные отчеты и обработки», сервер сохраняет бинарный файл во временный каталог под динамически сгенерированным именем. Если внести изменения в файл .erf на диске и заново запустить его в том же сеансе, сервер 1С может продолжать выполнять скомпилированный модуль из кэша. По этой причине точки останова в исходном файле отчета не срабатывают — платформа выполняет старую копию.
  2. Особенности отладки фоновых заданий. В современных конфигурациях формирование отчетов происходит в фоновом задании на сервере. Даже если в Конфигураторе включено автоматическое подключение фоновых заданий, отладчик не всегда может сопоставить файл внешнего отчета на диске с временным файлом, исполняемым в фоновом сеансе.
  3. Незаполненные параметры СКД в изолированном контексте. При фоновом формировании отчета контекст формы недоступен. Если инициализация специфических параметров запроса (например, &ИспользуетсяОтборПоСегментуПартнеров) выполняется в коде формы, а не в модуле объекта, то фоновое задание выдает ошибку выполнения запроса на этапе Вывести.

Переопределение процедуры ПриКомпоновкеРезультата в модуле объекта

Рассмотрим пример правильной структуры модуля объекта внешнего отчета для работы с БСП. Чтобы перехватить компоновку и установить служебные параметры на сервере, используется следующая схема:


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

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

КонецПроцедуры

#КонецОбласти

#КонецЕсли

Как гарантированно проверить исполнение кода и сбросить кэш

Если код не заходит в точку останова при отладке, выполним следующие шаги для диагностики и устранения проблемы:

  1. Использование явной фиксации событий. Чтобы убедиться, что процедура ПриКомпоновкеРезультата действительно вызывается платформой, вызовем исключение с помощью команды ВызватьИсключение "Проверка вызова"; или запишем сообщение в журнал регистрации с помощью ЗаписьЖурналаРегистрации. Если ошибка отобразится при формировании отчета, значит код выполняется, а проблема заключалась только в привязке отладчика.
  2. Очистка кэша и переименование отчета. Переименуем имя объекта внешнего отчета в метаданных или пересохраним файл под другим именем. При подключении обработанного файла через Файл -> Открыть или через перерегистрацию в справочнике «Дополнительные отчеты и обработки» сервер создаст новый временный кэш, и обновленный модуль начнет исполняться корректно.
  3. Явная установка служебных параметров. Все параметры системы компоновки данных, от которых зависят условия в запросе, должны гарантированно заполняться перед вызовом ПроцессорКомпоновки.Инициализировать. Если в запросе используется параметр, значение которого вычисляется логикой общего модуля (например, СегментыСервер), необходимо явно программно передать его в КомпоновщикНастроек.Настройки.ПараметрыДанных.
← На главную