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