Как реализовать универсальный вывод параметров и отборов СКД на форму при смене макетов

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

При разработке сложных отчетов в системе 1С:Предприятие 8.3 часто возникает ситуация, когда один отчет должен содержать несколько разных схем компоновки данных (СКД). Основная трудность здесь заключается в том, чтобы заставить форму отчета динамически подстраиваться под выбранный макет: автоматически выводить нужные параметры, менять состав доступных отборов и обновлять пользовательские настройки без написания уникального кода под каждую схему.

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

Основа механизма: Компоновщик настроек

Прежде всего, нам необходимо понять роль объекта КомпоновщикНастроекКомпоновкиДанных. Этот объект является связующим звеном между схемой (макетом) и формой. Чтобы параметры и отборы отображались на форме автоматически, в реквизитах вашей формы (или в реквизитах самого отчета) должен присутствовать объект с типом КомпоновщикНастроекКомпоновкиДанных.

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

Шаг 1. Подготовка интерфейса формы

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

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

Проанализируем ситуацию: когда мы просто меняем макет в коде, форма "не знает", что состав доступных полей изменился. Поэтому нам нужно программно "пересобрать" компоновщик.

Шаг 2. Программная смена схемы на сервере

Разберем по шагам алгоритм, который должен выполняться при выборе пользователем нового макета из списка. Весь процесс должен происходить в серверном контексте.

Во-первых, нам нужно получить объект новой схемы из макетов отчета. Во-вторых, необходимо инициализировать компоновщик новым источником доступных настроек. Без этого шага компоновщик будет продолжать "думать", что он работает со старой схемой, и вызывать ошибки при попытке обращения к несуществующим полям.

Рассмотрим пример кода для реализации этой логики:


&НаСервере
Процедура УстановитьНовуюСхемуНаСервере(ИмяМакета)
    
    // 1. Получаем макет из объекта отчета
    ОбъектОтчет = РеквизитФормыВЗначение("Объект");
    Схема = ОбъектОтчет.ПолучитьМакет(ИмяМакета);
    
    // 2. Инициализируем компоновщик новым источником настроек
    // Это критически важный момент для обновления состава полей
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема);
    Отчет.КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
    
    // 3. Загружаем настройки по умолчанию из новой схемы
    Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
    
    // 4. Обновляем пользовательские настройки
    // Это заставит платформу перерисовать поля на форме
    Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Схема.НастройкиПоУмолчанию.ПользовательскиеНастройки);

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

Шаг 3. Управление видимостью и обновлением

Выясним причину, по которой поля могут не обновиться сразу. При работе с управляемыми формами иногда требуется явно "подтолкнуть" интерфейс к обновлению. Если вы используете стандартную форму отчета (например, из БСП), там за это отвечает метод ОбновитьРазмещениеПользовательскихНастроек().

Если же вы создаете форму с нуля, рассмотрите возможность программного создания элементов. Хотя автоматическое связывание с ПользовательскиеНастройки работает в 90% случаев, иногда требуется более тонкий контроль. В этом случае мы можем перебрать коллекцию Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы и программно создать для каждого параметра поле ввода на форме.

Шаг 4. Обработка фиксированных настроек

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

Посмотрим на пример полной очистки перед загрузкой новой схемы:


// Очистка перед инициализацией
Отчет.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Очистить();
Отчет.КомпоновщикНастроек.ФиксированныеНастройки.ПараметрыДанных.Элементы.Очистить();

Интеграция с БСП (Библиотека стандартных подсистем)

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

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

Однако, если ваша задача — именно "ручное" управление макетами внутри одной формы обработки или специфического отчета, придерживайтесь алгоритма с ИсточникДоступныхНастроекКомпоновкиДанных, описанного выше.

Заключение

Подведем итог. Для реализации универсального вывода настроек нам не нужно прописывать каждое поле вручную. Достаточно:

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

← На главную