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