Как вывести выбор вариантов отчета СКД на обычных формах?

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

Рассмотрим частую задачу, с которой разработчики сталкиваются при поддержке или доработке конфигураций на обычных формах (например, в конфигурации «Управление производственным предприятием»). При создании собственного варианта отчета на базе Системы Компоновки Данных (СКД) и генерации стандартной формы мы часто обнаруживаем, что на ней есть кнопки «Сформировать», «Настройки», но полностью отсутствует механизм переключения между заранее созданными вариантами отчета. Разберем по шагам, как исправить эту ситуацию и предоставить пользователям удобный выбор настроек.

Решение 1: Программное добавление подменю на командную панель

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

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


Процедура УстановитьВариантыНастроек()
    // Получаем доступ к командной панели формы
    КП = ЭлементыФормы.ДействияФормы; 
    
    // Добавляем кнопку типа "Подменю"
    НоваяКнопка = КП.Кнопки.Вставить(1, "_ВариантыОтчетов", ТипКнопкиКоманднойПанели.Подменю, "Варианты отчетов"); 
    НовоеДействие = Новый Действие("_СменаВариантаНастройки"); 
    ч = 1;
    
    // Перебираем варианты настроек из схемы
    Для каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
        // Добавляем каждую настройку как подчиненную кнопку
        НоваяКнопка = КП.Кнопки._ВариантыОтчетов.Кнопки.Добавить("Вариант" + Строка(ч), ТипКнопкиКоманднойПанели.Действие, Настройка.Представление, НовоеДействие); 
        ч = ч + 1;
    КонецЦикла;
КонецПроцедуры

Затем напишем процедуру-обработчик, которая будет вызываться при нажатии на конкретный вариант отчета в нашем новом подменю. Она найдет выбранную настройку по тексту кнопки и загрузит ее в компоновщик:


Процедура _СменаВариантаНастройки(Элемент)
    Для каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
        Если Элемент.Текст = Настройка.Представление Тогда
            // Загружаем выбранный вариант в настройки компоновщика
            КомпоновщикНастроек.ЗагрузитьНастройки(Настройка.Настройки);
            Прервать;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

И, наконец, вызовем процедуру формирования кнопок в стандартном обработчике открытия формы:


Процедура ПриОткрытии()
    УстановитьВариантыНастроек();
КонецПроцедуры

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

Решение 2: Использование выпадающего списка (Поля выбора)

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

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

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

Решение 3: Получение вариантов напрямую из макета

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

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


// Получаем макет СКД и обращаемся к коллекции вариантов
КоллекцияВариантов = ПолучитьМакет("ИмяВашегоМакетаСКД").ВариантыНастроек;

Для Каждого Вариант Из КоллекцияВариантов Цикл
    // Выполняем заполнение списка или кнопок
КонецЦикла;

Решение 4: Сохранение пользовательских вариантов

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

Для обычных форм потребуется реализовать механизм сохранения. Разберем необходимые шаги:

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

Решение 5: Интеграция с подсистемой Универсального отчета

Во многих старых конфигурациях присутствует так называемый «Универсальный отчет». Вместо того чтобы «изобретать велосипед» с созданием собственной формы и кнопок, мы можем встроить наш отчет на СКД в типовую оболочку. Посмотрим на преимущества:

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

Решение 6: Программное открытие отчета с заданным вариантом

Иногда нужно не просто дать возможность выбора, а открыть отчет из другого места (например, из документа) сразу с нужным вариантом. Разберем по шагам эту задачу:

При вызове метода открытия формы мы можем передать в структуру параметров некий ключ — КлючВарианта. В модуле формы отчета, внутри обработчика ПриОткрытии, мы анализируем этот параметр:


Процедура ПриОткрытии()
    УстановитьВариантыНастроек(); // Наша процедура генерации кнопок/списков
    
    // Проверяем наличие переданного варианта
    Если Параметры.Свойство("КлючВарианта") Тогда
        Для каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
            Если Настройка.Имя = Параметры.КлючВарианта Тогда
                КомпоновщикНастроек.ЗагрузитьНастройки(Настройка.Настройки);
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

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

← На главную