Как правильно использовать типовую форму настроек СКД в отчетах для 1С:Управление торговлей 11?

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

При разработке отчетов на базе системы компоновки данных (СКД) в конфигурациях на базе БСП (включая «1С:Управление торговлей 11», «1С:ERP», «1С:Комплексная автоматизация») разработчики часто сталкиваются с задачей предоставления пользователю удобной формы изменения настроек. Типовая форма ОбщаяФорма.ФормаНастроекОтчета привычна для пользователей и обладает богатым функционалом, однако при попытке вызвать ее из собственной кастомной формы отчета методом прямого копирования кода из ОбщаяФорма.ФормаОтчета возникает множество проблем: необходимость переноса десятков процедур, реквизитов и зависимостей, которые ломаются при первом же обновлении конфигурации.

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

Почему сложно вызывать «ФормаНастроекОтчета» напрямую

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

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

Поэтому попытка перенести функционал в отдельную форму путем копирования кода приводит к созданию нестабильного дублирующего механизма. Разберем основные способы решения этой задачи по стандартам 1С.

Решение 1. Программная модификация типовой формы отчета (рекомендуемый подход БСП)

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

В этом случае отчет в полной мере сохраняет доступ ко всем типовым механизмам: сохранению вариантов, отправке отчетов и открытию формы настроек.

Для отчетов конфигурации и отчетов в расширении:

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


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

Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
    // Добавление собственных реквизитов и команд формы
    ЭлементКоманды = Форма.Элементы.Добавить("МояКоманда", Тип("КнопкаФормы"), Форма.$Элементы.КоманднаяПанель);
    ЭлементКоманды.ИмяКоманды = "ИмяСозданнойКоманды";
КонецПроцедуры

Для дополнительных (внешних) отчетов:

В модуле объекта внешнего отчета в функции СведенияОВнешнейОбработке() необходимо указать флаг поддержки настройки формы:


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

В свойствах отчета реквизит Хранилище вариантов следует установить в значение ХранилищеВариантовОтчетов.

Решение 2. Размещение пользовательских настроек непосредственно на форме

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

Разберем последовательность действий:

  1. Откроем разрабатываемую форму отчета в конфигураторе.
  2. В дереве реквизитов найдем реквизит Отчет и раскроем ветку КомпоновщикНастроек.
  3. Перетащим элемент ПользовательскиеНастройки в элементы формы (создастся таблица формы).
  4. В СКД отчета для нужных параметров и отборов установим признак Включать в пользовательские настройки (с режимом отображения «Быстрый доступ» или «Обычный»).

При таком подходе пользователь видит все фильтры и параметры прямо на форме отчета, и отдельное модальное окно настроек больше не требуется.

Решение 3. Использование стандартной платформенной формы настроек СКД

Если пользовательские настройки не помещаются на форме и требуется именно отдельное диалоговое окно, надежнее использовать стандартный платформенный диалог СКД вместо формы БСП. Он работает автономно и не зависит от обновлений конфигурации.

Команда открытия настроек компоновщика настроек на клиенте вызывается с помощью стандартного метода:


&НаКлиенте
Процедура ОткрытьНастройкиСКД(Команда)
    ОткрытьФорму("Отчет." + ИмяОтчета + ".Форма.ФормаНастроек", Новый Структура("КомпоновщикНастроек", Отчет.КомпоновщикНастроек), ЭтотОбъект);
КонецПроцедуры

Если отдельная форма настроек не была создана в объекте отчета, платформа автоматически сгенерирует и откроет стандартное системное окно настроек СКД.

Решение 4. Корректный программный вызов «ОбщаяФорма.ФормаНастроекОтчета»

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


&НаКлиенте
Процедура НастройкиОтчета(Команда)
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("КлючВарианта", "Основной");
    ПараметрыФормы.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки);
    ПараметрыФормы.Вставить("СхемаКомпоновкиДанных", ПолучитьАдресСхемы());
    
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормыНастроек", ЭтотОбъект);
    ОткрытьФорму("ОбщаяФорма.ФормаНастроекОтчета", ПараметрыФормы, ЭтотОбъект, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

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

На сервере необходимо поместить схему компоновки данных во временное хранилище:


&НаСервере
Функция ПолучитьАдресСхемы()
    Схема = Отчеты[ИмяОтчета].ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Возврат ПоместитьВоВременноеХранилище(Схема, УникальныйИдентификатор);
КонецФункции

Итоги

Метод копирования процедур из ФормаОтчета в кастомную форму приводит к потере сопровождаемости кода. Наиболее стабильным и рекомендуемым решением в экосистеме 1С:Предприятие 8.3 является использование типовой ОбщаяФорма.ФормаОтчета с программной доработкой через ОпределитьНастройкиФормы или расширения. Если же своя форма отчета обязательна — наиболее надежным вариантом является размещение таблицы пользовательских настроек на самой форме или использование стандартного диалога настроек платформы.

← На главную