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