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