Почему не работают события ПриСозданииНаСервере и ОпределитьНастройкиФормы в модуле объекта отчета и как это исправить?

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

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

Понимаем архитектуру: почему события игнорируются?

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

  1. Код расположен не в том модуле (например, в модуле менеджера вместо модуля объекта).
  2. Отчет не зарегистрирован в справочнике «Варианты отчетов».
  3. Неверно указана сигнатура процедур (параметры и слово Экспорт).
  4. Система кэшировала старые настройки и не видит изменений в ОпределитьНастройкиФормы.

Шаг 1. Проверяем расположение и сигнатуру ОпределитьНастройкиФормы

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

Разберем пример правильного кода в модуле объекта:


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

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

Шаг 2. Регистрация отчета в подсистеме «Варианты отчетов»

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

Чтобы обновить сведения, выполните одно из следующих действий:

Шаг 3. Реализация обработчика ПриСозданииНаСервере

После того как мы «включили» событие через настройки, нам нужно прописать сам обработчик в том же модуле объекта. Посмотрим на типовой пример реализации, где мы извлекаем параметр, переданный при открытии отчета из документа:


Процедура ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка) Экспорт
    
    // Проверяем наличие параметра, переданного при открытии
    Если ЭтаФорма.Параметры.Свойство("ПараметрОбъектКопирования") Тогда
        // Пример логики установки параметра
        СсылкаДокумента = ЭтаФорма.Параметры.ПараметрОбъектКопирования;
        
        // Устанавливаем значение в компоновщик настроек
        ЗначениеПараметра = ЭтаФорма.Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДокументСсылка"));
        Если ЗначениеПараметра <> Неопределено Тогда
            ЗначениеПараметра.Значение = СсылкаДокумента;
            ЗначениеПараметра.Использование = Истина;
        КонецЕсли;
    КонецЕсли;

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

Шаг 4. Решаем проблему «пустых параметров» в ПриКомпоновкеРезультата

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

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

Во-вторых, обратите внимание на Пользовательские настройки. Если параметр выведен в пользовательские настройки, то установка значения в КомпоновщикНастроек.Настройки.ПараметрыДанных может быть перекрыта значением из КомпоновщикНастроек.ПользовательскиеНастройки.

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


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

Шаг 5. Работа с расширениями и модулем менеджера

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

Рассмотрим пример кода в модуле менеджера (если типовой механизм требует регистрации через него):


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

Однако помните: в 90% случаев для встроенных отчетов достаточно правильно заполненного модуля объекта и обновления кэша конфигурации.

Итоги и рекомендации

Подведем итог нашему разбору. Чтобы события в модуле отчета заработали, мы должны придерживаться строгого алгоритма:

  1. Проверить, что используется общая форма отчета БСП.
  2. Убедиться, что ОпределитьНастройкиФормы находится в модуле объекта с ключом Экспорт.
  3. Внутри этой процедуры явно проставить Настройки.События.ПриСозданииНаСервере = Истина.
  4. Обновить сведения об отчетах в системе (запустить обновление ИБ или перерегистрировать отчет).
  5. Передавать все данные через КомпоновщикНастроек, так как экземпляр объекта пересоздается при формировании.

Соблюдение этих правил гарантирует стабильную работу ваших отчетов и отсутствие «магических» ошибок с исчезающими параметрами.

← На главную