При разработке в 1С часто возникает задача добавить собственный отчет через механизм расширений и использовать при этом стандартные возможности Библиотеки стандартных подсистем (БСП), например, общую форму отчета ФормаОтчета. Однако можно столкнуться с ситуацией, когда необходимый для инициализации формы обработчик события ПриСозданииНаСервере, определенный в модуле объекта отчета, просто не вызывается. Давайте разберемся, почему так происходит и как это исправить.
Проблема заключается в том, что подсистема БСП "Варианты отчетов" по умолчанию "не знает" о существовании отчетов, добавленных через расширения. Ей нужно явно указать на новый отчет, чтобы она начала вызывать его экспортные процедуры настройки. Без этого вся цепочка вызовов, которая в итоге приводит к срабатыванию ПриСозданииНаСервере, обрывается в самом начале.
Чтобы понять, что мы чиним, проанализируем, как устроен механизм в типовой конфигурации. Вызов нашего кода в общей форме отчета происходит при выполнении следующего условия:
// Фрагмент кода из общей формы "ФормаОтчета"
Если НастройкиОтчета.События.ПриСозданииНаСервере Тогда
ОтчетОбъект.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
КонецЕсли;
Чтобы свойство НастройкиОтчета.События.ПриСозданииНаСервере стало равно Истина, БСП должна вызвать процедуру ОпределитьНастройкиФормы из модуля объекта нашего отчета, где мы и устанавливаем это свойство:
// Модуль объекта отчета
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПриСозданииНаСервере = Истина;
КонецПроцедуры
Но и этот вызов произойдет только в том случае, если ранее в модуле менеджера нашего отчета в процедуре НастроитьВариантыОтчета будет установлен флаг ОпределитьНастройкиФормы:
// Модуль менеджера отчета
Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт
НастройкиОтчета.ОпределитьНастройкиФормы = Истина;
КонецПроцедуры
Как видим, это целая цепочка зависимостей. Для отчетов из расширений она не работает автоматически, потому что система не вызывает процедуру НастроитьВариантыОтчета из модуля менеджера. Наша задача — "зарегистрировать" отчет в БСП, чтобы запустить этот механизм.
Для корректной работы отчета из расширения необходимо выполнить несколько шагов в разных модулях. Рассмотрим каждый из них подробно.
Подготовка модуля объекта отчета
В модуле объекта вашего отчета нужно определить две экспортные процедуры. Первая, ПриОпределенииНастроекОтчета, является "входной точкой" и сообщает БСП, что у данного отчета есть дополнительные настройки в модуле менеджера. Вторая, ОпределитьНастройкиФормы, непосредственно включает нужный нам обработчик события.
// Модуль объекта отчета "МойОтчет"
// Сообщаем БСП, что нужно вызвать процедуру НастроитьВариантыОтчета из модуля менеджера.
Процедура ПриОпределенииНастроекОтчета(НастройкиОтчета, НастройкиВариантов) Экспорт
НастройкиОтчета.НастроитьВариантыОтчета = Истина;
КонецПроцедуры
// Включаем обработчик события ПриСозданииНаСервере для общей формы отчета.
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПриСозданииНаСервере = Истина;
КонецПроцедуры
// Здесь же размещаем сам обработчик события.
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
// Ваш код, который должен выполниться при создании формы на сервере.
Сообщить("Обработчик ПриСозданииНаСервере из модуля объекта отработал!");
КонецПроцедуры
Подготовка модуля менеджера отчета
В модуле менеджера отчета необходимо определить процедуру НастроитьВариантыОтчета. Ее задача — включить флаг, который разрешит БСП вызывать процедуру ОпределитьНастройкиФормы из модуля объекта.
// Модуль менеджера отчета "МойОтчет"
Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт
// Разрешаем вызов процедуры ОпределитьНастройкиФормы из модуля объекта.
НастройкиОтчета.ОпределитьНастройкиФормы = Истина;
КонецПроцедуры
"Регистрация" отчета в БСП — ключевой шаг
Это самый важный этап, который и решает основную проблему. Нам нужно заимствовать в расширение общий модуль ВариантыОтчетовПереопределяемый и расширить его процедуру НастроитьВариантыОтчетов с помощью аннотации &После. Внутри этой процедуры мы должны для каждого нашего отчета из расширения вызвать метод ВариантыОтчетов.НастроитьОтветВМодулеМенеджера. Именно этот вызов "регистрирует" отчет в подсистеме БСП.
Важно: если в вашем расширении несколько отчетов, которые нужно подключить к БСП, вызовите этот метод для каждого из них.
// Общий модуль "ВариантыОтчетовПереопределяемый" в расширении
&После("НастроитьВариантыОтчетов")
Процедура Расш_НастроитьВариантыОтчетов(Настройки) // Имя процедуры может быть любым
// Явно указываем БСП на наш отчет из расширения.
// Это заставит систему вызвать процедуру НастроитьВариантыОтчета из модуля менеджера нашего отчета.
ВариантыОтчетов.НастроитьОтветВМодулеМенеджера(Настройки, Метаданные.Отчеты.МойОтчет);
// Если есть другие отчеты, добавляем их так же:
// ВариантыОтчетов.НастроитьОтветВМодулеМенеджера(Настройки, Метаданные.Отчеты.МойВторойОтчет);
КонецПроцедуры
Обновление вспомогательных данных
После внесения всех изменений в коде необходимо обновить служебные данные БСП, чтобы система "увидела" наши доработки. Без этого шага ничего не заработает. Сделать это можно двумя способами:
/C ЗапуститьОбновлениеИнформационнойБазы.Также убедитесь, что выполнилось регламентное задание Заполнение параметров работы расширений, которое отвечает за регистрацию метаданных из расширений.
Если после выполнения всех шагов проблема не решена, можно провести диагностику. Основная причина — отчет по-прежнему не зарегистрирован в параметрах работы расширений. Чтобы это проверить, можно выполнить следующий код в консоли кода (для этого подойдёт универсальная консоль кода и запросов 1С) или через "Вычислить выражение" в отладчике:
ПараметрыРасширений = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения("СтандартныеПодсистемы.ВариантыОтчетов");
ОтчетыСНастройками = ПараметрыРасширений.ОтчетыСНастройками;
// Теперь посмотрите содержимое массива ОтчетыСНастройками
Если в массиве ОтчетыСНастройками отсутствует ваш отчет, это означает, что шаг 3 (расширение модуля ВариантыОтчетовПереопределяемый) или шаг 4 (обновление данных) были выполнены некорректно или не дали результата. Проверьте правильность кода и повторно запустите обновление вспомогательных данных.
Выполнив эту последовательность действий, вы успешно интегрируете свой отчет из расширения в механизмы БСП, и все необходимые обработчики событий, включая ПриСозданииНаСервере, начнут корректно отрабатывать.