Разработчики отчетов в системе «1С:Предприятие» часто сталкиваются с требованиями заказчиков или руководства сделать интерфейс максимально простым и интуитивным. Одной из таких классических задач является замена стандартного переключателя вариантов отчетов или панели настроек на простые и понятные флажки (галочки) прямо на форме отчета.
Например, для отчета по контрагентам пользователю могут потребоваться три быстрых режима фильтрации: «Помеченные на удаление», «Общий список» и «Работающие контрагенты». Стандартный выбор вариантов компоновки часто кажется пользователям слишком сложным. В этой статье мы подробно разберем, как реализовать такую задачу несколькими способами — от простых встроенных механизмов платформы до гибкого программирования на встроенном языке 1С.
В обсуждениях часто предлагают создавать отдельные макеты схем компоновки данных (СКД) под каждый флажок и программно подгружать их. Однако создание нескольких разных макетов СКД ведет к дублированию запросов. Если завтра потребуется изменить логику получения данных (например, добавить новое поле контрагента или изменить условия связи таблиц), вам придется переписывать запросы во всех макетах. Это усложняет поддержку решения.
Правильный подход — использовать одну единую схему СКД, но настроить внутри нее несколько Вариантов отчета. Рассмотрим подробнее, как это сделать:
ОбщийСписок, ПомеченныеНаУдаление и РаботающиеКонтрагенты.ПометкаУдаления Равно Ложь).Теперь разберем, как программно переключать эти варианты при изменении состояния флажков на управляемой форме отчета. Нам не нужно загружать файлы или макеты целиком. Достаточно получить настройки нужного варианта из схемы и загрузить их в компоновщик настроек отчета. Напишем соответствующий код на сервере:
&НаСервере
Процедура ПереключитьВариантОтчетаНаСервере(ИмяВарианта)
// Получаем схему компоновки данных отчета
СхемаКомпоновки = РеквизитФормыВЗначение("Отчет").СхемаКомпоновкиДанных;
// Находим нужный вариант настроек в схеме
ВариантНастроек = СхемаКомпоновки.ВариантыНастроек.Найти(ИмяВарианта);
Если ВариантНастроек <> Неопределено Тогда
// Загружаем настройки выбранного варианта в компоновщик нашего отчета
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(ВариантНастроек.Настройки);
КонецЕсли;
КонецПроцедуры
Этот способ позволяет сохранить структуру отчета единой, не дублировать логику запросов и существенно упростить дальнейшую поддержку и модификацию отчета.
Если задача заключается исключительно в фильтрации данных (выделении помеченных на удаление или работающих контрагентов), создавать отдельные варианты отчетов или писать программный код вообще не требуется. Платформа 1С содержит мощный стандартный механизм вывода отборов на форму.
Проанализируем процесс создания быстрых настроек по шагам:
ПометкаУдаления со значением Ложь (это будут наши работающие контрагенты).После запуска программы платформа 1С автоматически сформирует и выведет в шапку отчета готовые элементы управления в виде флажков. Пользователь сможет самостоятельно включать и отключать эти отборы одним кликом мыши, при этом разработчику не придется писать ни одной строки кода.
Иногда дизайн формы жестко регламентирован, и стандартные элементы быстрых настроек не вписываются в концепцию, созданную дизайнером или утвержденную руководством. В таком случае мы можем создать собственные реквизиты формы типа Булево и связать их с отборами СКД программно.
Разберем, как связать кастомные флажки на управляемой форме с настройками компоновщика:
ФлагПомеченные с типом данных Булево.ПриИзменении для нашего флажка.В обработчике события мы напишем код, который будет находить нужный отбор в компоновщике настроек и управлять его использованием в зависимости от состояния флажка на форме:
&НаКлиенте
Процедура ФлагПомеченныеПриИзменении(Элемент)
УстановитьИспользованиеОтбораНаСервере("ПометкаУдаления", ФлагПомеченные, Истина);
КонецПроцедуры
&НаСервере
Процедура УстановитьИспользованиеОтбораНаСервере(ИмяПоля, ЗначениеФлага, ЗначениеОтбора)
// Инициализируем поиск поля в отборах компоновщика настроек
ИмяПоляКомпоновки = Новый ПолеКомпоновкиДанных(ИмяПоля);
ОтборНайден = Ложь;
// Перебираем существующие элементы отбора в компоновщике настроек
Для Каждого ЭлементОтбора Из Отчет.КомпоновщикНастроек.Settings.Filter.Items Цикл
Если ЭлементОтбора.ЛевоеЗначение = ИмяПоляКомпоновки Тогда
ЭлементОтбора.Использование = ЗначениеФлага;
ЭлементОтбора.ПравоеЗначение = ЗначениеОтбора;
ОтборНайден = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
// Если такого отбора еще нет в настройках, добавим его программно
Если Не ОтборНайден Тогда
НовыйОтбор = Отчет.КомпоновщикНастроек.Settings.Filter.Items.Add(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = ИмяПоляКомпоновки;
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.ПравоеЗначение = ЗначениеОтбора;
НовыйОтбор.Использование = ЗначениеФлага;
КонецЕсли;
КонецПроцедуры
Используя этот алгоритм, вы сможете настраивать сколь угодно сложную логику поведения отборов на форме, сохраняя лаконичный внешний вид интерфейса и не перегружая конфигурацию лишними макетами.
Часто руководство требует реализовать логику, при которой при установке всех трех флажков («Помеченные на удаление», «Общий список», «Работающие») система должна сформировать не один компромиссный отчет, а вывести все три разные таблицы последовательно друг за другом в один результирующий документ.
В платформе 1С это реализуется достаточно просто за счет последовательного вывода результатов компоновки в один и тот же объект ТабличныйДокумент без его предварительной очистки между выводами. Выясним, как написать такой обработчик для кнопки «Сформировать»:
&НаСервере
Процедура СформироватьВсеОтчетыНаСервере(ТабличныйДокумент)
// Очищаем результирующий документ перед формированием пакета отчетов
ТабличныйДокумент.Очистить();
СхемаКомпоновки = РеквизитФормыВЗначение("Отчет").СхемаКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
// Шаг 1. Проверяем флаг общего списка
Если ФлагОбщийСписок Тогда
ВывестиВариантВОбщийДокумент("ОбщийСписок", СхемаКомпоновки, КомпоновщикМакета, ПроцессорВывода);
КонецЕсли;
// Шаг 2. Проверяем флаг помеченных на удаление
Если ФлагПомеченные Тогда
// Добавим разделитель страниц или пустые строки для визуального разделения таблиц
ТабличныйДокумент.ВывестиВертикальныйРазделительСтраниц();
ВывестиВариантВОбщийДокумент("ПомеченныеНаУдаление", СхемаКомпоновки, КомпоновщикМакета, ПроцессорВывода);
КонецЕсли;
// Шаг 3. Проверяем флаг работающих контрагентов
Если ФлагРаботающие Тогда
ТабличныйДокумент.ВывестиВертикальныйРазделительСтраниц();
ВывестиВариантВОбщийДокумент("РаботающиеКонтрагенты", СхемаКомпоновки, КомпоновщикМакета, ПроцессорВывода);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВывестиВариантВОбщийДокумент(ИмяВарианта, СхемаКомпоновки, КомпоновщикМакета, ПроцессорВывода)
ВариантНастроек = СхемаКомпоновки.ВариантыНастроек.Найти(ИмяВарианта);
Если ВариантНастроек = Неопределено Тогда
Возврат;
КонецЕсли;
Настройки = ВариантНастроек.Настройки;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
// Формируем макет компоновки для конкретного варианта
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ДанныеРасшифровки);
// Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
// Выводим результат в общий документ (без очистки предыдущих данных)
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Благодаря этому подходу пользователь получит на одном экране структурированный и разделенный отчет, содержащий всю необходимую информацию в соответствии с выбранными флажками.
Рассмотрим важный архитектурный нюанс. Если ваш отчет разрабатывается в современной конфигурации, созданной на базе БСП (Библиотеки Стандартных Подсистем), то написание собственного кода вывода отчета в обход стандартных механизмов формы может нарушить важный типовой функционал.
К каким проблемам может привести ручной вывод результатов СКД:
Чтобы избежать этих проблем и сохранить все преимущества БСП, рекомендуется перенести логику обработки флажков в модуль объекта отчета в переопределяемое событие ПриКомпоновкеРезультата. Выясним, как выглядит правильная интеграция логики флажков с БСП:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Мы можем перехватить стандартную обработку и скорректировать настройки непосредственно перед выводом
// При этом БСП сама займется генерацией макета, сохраняя расшифровку и рассылки
// Пример получения параметров, переданных из формы отчета
ФлагПомеченные = Ложь;
Если ЭтотОбъект.Свойства().Найти("ФлагПомеченные") <> Неопределено Тогда
ФлагПомеченные = ЭтотОбъект.ФлагПомеченные;
КонецЕсли;
// Программное наложение отборов непосредственно в СКД перед выводом
Если ФлагПомеченные Тогда
ПолеПометка = Новый ПолеКомпоновкиДанных("ПометкаУдаления");
// Находим или добавляем отбор в текущих настройках компоновщика
ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = ПолеПометка;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Этот способ гарантирует стабильную работу отчета в любых современных конфигурациях 1С (ERP, КА, УТ, БП) и избавляет разработчика от необходимости переписывать базовые сервисные функции системы.