Почему СКД игнорирует процедуру ПриКомпоновкеРезультата и как это исправить

Программист IT и автоматизация бизнеса
← На главную

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

Причина 1: Кэширование внешних отчетов в БСП

Проанализируем наиболее частую ситуацию, с которой столкнулся автор темы. Если ваш отчет зарегистрирован в информационной базе через механизм Библиотеки стандартных подсистем (БСП) в справочнике "Дополнительные отчеты и обработки", возникает эффект "залипшего" кода.

Когда вы открываете файл отчета через Файл -> Открыть, вы работаете с актуальной версией кода. Однако, если отчет уже добавлен в справочник дополнительных обработок, система может подтягивать версию из ХранилищаЗначений в базе данных или использовать кэшированную копию во временных файлах пользователя. В этом случае, сколько бы вы ни правили код в Конфигураторе, при запуске через интерфейс программы будет выполняться старая копия, в которой процедуры ПриКомпоновкеРезультата еще не было.

Что нужно сделать:

  1. Убедитесь, что вы запускаете именно тот файл, который правите.
  2. Если отчет подключен как внешний, обновите его двоичные данные в справочнике "Дополнительные отчеты и обработки", перезагрузив файл.
  3. Очистите кэш конфигурации на локальной машине, если изменения все равно не подхватываются.

Причина 2: Отсутствие ключевого слова Экспорт

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

Выясним правильный синтаксис написания процедуры:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) Экспорт
    // Ваш код здесь
КонецПроцедуры

Если слово Экспорт отсутствует, платформа проигнорирует наличие процедуры, так как посчитает её локальной функцией модуля, не предназначенной для внешнего вызова. Также важно проверить правильность написания имени — любая опечатка приведет к тому, что событие не будет опознано.

Причина 3: Программное формирование вместо стандартного

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

Если вы используете конструкцию типа:


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

Система не "заглядывает" в модуль объекта. В таком случае у вас есть два пути:

  1. Вызывать процедуру модуля объекта вручную из формы.
  2. Использовать метод СкомпоноватьРезультат() объекта отчет, который инициирует стандартный цикл формирования с заходом в нужные события.

Причина 4: Нюансы отладки фоновых заданий

В современных конфигурациях (например, УТ 11, ERP 2.5, БП 3.0) отчеты по умолчанию формируются в фоновом задании на сервере. Это делается для того, чтобы интерфейс пользователя не "зависал" во время длительных расчетов.

Проанализируем, почему точка останова может не работать:

Чтобы проверить, заходит ли система в код, попробуйте использовать запись в журнал регистрации или метод ЗаписьЖурналаРегистрации. Если запись появляется — процедура выполняется, а проблема лишь в настройках отладки.

Причина 5: Неправильное использование СтандартнаяОбработка

Иногда процедура вызывается, но создается впечатление, что она "игнорируется", потому что результат отчета пустой или не меняется. Проверьте переменную СтандартнаяОбработка.

Если вы устанавливаете СтандартнаяОбработка = Ложь;, вы берете на себя полную ответственность за вывод данных в ДокументРезультат. Если после этого вы не инициализируете ПроцессорВыводаРезультатаВТабличныйДокумент и не выполните метод Вывести(), отчет будет всегда пустым.

Пример правильного перехвата управления:


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

Подведем итоги

Если 1С игнорирует ПриКомпоновкеРезультата, в первую очередь проверьте, не работаете ли вы со "старой" версией отчета, сохраненной в базе (для внешних отчетов). Затем убедитесь в наличии Экспорт и проверьте, не перекрыто ли формирование кастомным кодом в форме отчета. Помните, что при фоновом формировании отладка требует включения соответствующих флажков в настройках конфигуратора.

← На главную