Как в отчете из расширения вызвать обработчик `ПриСозданииНаСервере` в общей форме БСП `ФормаОтчета`?

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

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

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

Анализ стандартного механизма вызовов в БСП

Чтобы понять, что мы чиним, проанализируем, как устроен механизм в типовой конфигурации. Вызов нашего кода в общей форме отчета происходит при выполнении следующего условия:


// Фрагмент кода из общей формы "ФормаОтчета"
Если НастройкиОтчета.События.ПриСозданииНаСервере Тогда
    ОтчетОбъект.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
КонецЕсли;

Чтобы свойство НастройкиОтчета.События.ПриСозданииНаСервере стало равно Истина, БСП должна вызвать процедуру ОпределитьНастройкиФормы из модуля объекта нашего отчета, где мы и устанавливаем это свойство:


// Модуль объекта отчета
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    Настройки.События.ПриСозданииНаСервере = Истина;
КонецПроцедуры

Но и этот вызов произойдет только в том случае, если ранее в модуле менеджера нашего отчета в процедуре НастроитьВариантыОтчета будет установлен флаг ОпределитьНастройкиФормы:


// Модуль менеджера отчета
Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт
    НастройкиОтчета.ОпределитьНастройкиФормы = Истина;
КонецПроцедуры

Как видим, это целая цепочка зависимостей. Для отчетов из расширений она не работает автоматически, потому что система не вызывает процедуру НастроитьВариантыОтчета из модуля менеджера. Наша задача — "зарегистрировать" отчет в БСП, чтобы запустить этот механизм.

Пошаговое решение: подключаем отчет из расширения к БСП

Для корректной работы отчета из расширения необходимо выполнить несколько шагов в разных модулях. Рассмотрим каждый из них подробно.

  1. Подготовка модуля объекта отчета

    В модуле объекта вашего отчета нужно определить две экспортные процедуры. Первая, ПриОпределенииНастроекОтчета, является "входной точкой" и сообщает БСП, что у данного отчета есть дополнительные настройки в модуле менеджера. Вторая, ОпределитьНастройкиФормы, непосредственно включает нужный нам обработчик события.

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

    В модуле менеджера отчета необходимо определить процедуру НастроитьВариантыОтчета. Ее задача — включить флаг, который разрешит БСП вызывать процедуру ОпределитьНастройкиФормы из модуля объекта.

    
    // Модуль менеджера отчета "МойОтчет"
    
    Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт
        // Разрешаем вызов процедуры ОпределитьНастройкиФормы из модуля объекта.
        НастройкиОтчета.ОпределитьНастройкиФормы = Истина;
    КонецПроцедуры
    
  3. "Регистрация" отчета в БСП — ключевой шаг

    Это самый важный этап, который и решает основную проблему. Нам нужно заимствовать в расширение общий модуль ВариантыОтчетовПереопределяемый и расширить его процедуру НастроитьВариантыОтчетов с помощью аннотации &После. Внутри этой процедуры мы должны для каждого нашего отчета из расширения вызвать метод ВариантыОтчетов.НастроитьОтветВМодулеМенеджера. Именно этот вызов "регистрирует" отчет в подсистеме БСП.

    Важно: если в вашем расширении несколько отчетов, которые нужно подключить к БСП, вызовите этот метод для каждого из них.

    
    // Общий модуль "ВариантыОтчетовПереопределяемый" в расширении
    
    &После("НастроитьВариантыОтчетов")
    Процедура Расш_НастроитьВариантыОтчетов(Настройки) // Имя процедуры может быть любым
        
        // Явно указываем БСП на наш отчет из расширения.
        // Это заставит систему вызвать процедуру НастроитьВариантыОтчета из модуля менеджера нашего отчета.
        ВариантыОтчетов.НастроитьОтветВМодулеМенеджера(Настройки, Метаданные.Отчеты.МойОтчет);
        
        // Если есть другие отчеты, добавляем их так же:
        // ВариантыОтчетов.НастроитьОтветВМодулеМенеджера(Настройки, Метаданные.Отчеты.МойВторойОтчет);
        
    КонецПроцедуры
    
  4. Обновление вспомогательных данных

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

    • Запустить стандартную обработку ОбновлениеВспомогательныхДанных в режиме "Предприятие" (находится в разделе "Администрирование - Обслуживание - Регламентные операции").
    • Перезапустить базу с параметром командной строки /C ЗапуститьОбновлениеИнформационнойБазы.

    Также убедитесь, что выполнилось регламентное задание Заполнение параметров работы расширений, которое отвечает за регистрацию метаданных из расширений.

Проверка и отладка

Если после выполнения всех шагов проблема не решена, можно провести диагностику. Основная причина — отчет по-прежнему не зарегистрирован в параметрах работы расширений. Чтобы это проверить, можно выполнить следующий код в консоли кода (для этого подойдёт универсальная консоль кода и запросов 1С) или через "Вычислить выражение" в отладчике:


ПараметрыРасширений = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения("СтандартныеПодсистемы.ВариантыОтчетов");
ОтчетыСНастройками = ПараметрыРасширений.ОтчетыСНастройками;
// Теперь посмотрите содержимое массива ОтчетыСНастройками

Если в массиве ОтчетыСНастройками отсутствует ваш отчет, это означает, что шаг 3 (расширение модуля ВариантыОтчетовПереопределяемый) или шаг 4 (обновление данных) были выполнены некорректно или не дали результата. Проверьте правильность кода и повторно запустите обновление вспомогательных данных.

Выполнив эту последовательность действий, вы успешно интегрируете свой отчет из расширения в механизмы БСП, и все необходимые обработчики событий, включая ПриСозданииНаСервере, начнут корректно отрабатывать.

← На главную