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