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