Как сделать управление вариантами и отборами отчета 1С с помощью флажков на форме?

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

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

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

Способ 1. Использование одного макета СКД с разными вариантами (Оптимальный подход)

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

Правильный подход — использовать одну единую схему СКД, но настроить внутри нее несколько Вариантов отчета. Рассмотрим подробнее, как это сделать:

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

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


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

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

Способ 2. Быстрые отборы СКД без программирования (No-code подход)

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

Проанализируем процесс создания быстрых настроек по шагам:

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

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

Способ 3. Программная связь произвольных флажков формы с отборами СКД (Low-code)

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

Разберем, как связать кастомные флажки на управляемой форме с настройками компоновщика:

  1. В редакторе управляемой формы перейдем на вкладку «Реквизиты» и добавим новый реквизит. Назовем его, например, ФлагПомеченные с типом данных Булево.
  2. Перетащим этот реквизит в элементы формы. Платформа автоматически создаст элемент управления с видом «Поле флажка».
  3. Создадим на форме обработчик события ПриИзменении для нашего флажка.

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


&НаКлиенте
Процедура ФлагПомеченныеПриИзменении(Элемент)
    УстановитьИспользованиеОтбораНаСервере("ПометкаУдаления", ФлагПомеченные, Истина);
КонецПроцедуры

&НаСервере
Процедура УстановитьИспользованиеОтбораНаСервере(ИмяПоля, ЗначениеФлага, ЗначениеОтбора)
    
    // Инициализируем поиск поля в отборах компоновщика настроек
    ИмяПоляКомпоновки = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ОтборНайден = Ложь;
    
    // Перебираем существующие элементы отбора в компоновщике настроек
    Для Каждого ЭлементОтбора Из Отчет.КомпоновщикНастроек.Settings.Filter.Items Цикл
        Если ЭлементОтбора.ЛевоеЗначение = ИмяПоляКомпоновки Тогда
            ЭлементОтбора.Использование = ЗначениеФлага;
            ЭлементОтбора.ПравоеЗначение = ЗначениеОтбора;
            ОтборНайден = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    // Если такого отбора еще нет в настройках, добавим его программно
    Если Не ОтборНайден Тогда
        НовыйОтбор = Отчет.КомпоновщикНастроек.Settings.Filter.Items.Add(Тип("ЭлементОтбораКомпоновкиДанных"));
        НовыйОтбор.ЛевоеЗначение  = ИмяПоляКомпоновки;
        НовыйОтбор.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
        НовыйОтбор.ПравоеЗначение = ЗначениеОтбора;
        НовыйОтбор.Использование  = ЗначениеФлага;
    КонецЕсли;
    
КонецПроцедуры

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

Способ 4. Реализация принципа «Всё и сразу» (Вывод нескольких таблиц в один отчет)

Часто руководство требует реализовать логику, при которой при установке всех трех флажков («Помеченные на удаление», «Общий список», «Работающие») система должна сформировать не один компромиссный отчет, а вывести все три разные таблицы последовательно друг за другом в один результирующий документ.

В платформе 1С это реализуется достаточно просто за счет последовательного вывода результатов компоновки в один и тот же объект ТабличныйДокумент без его предварительной очистки между выводами. Выясним, как написать такой обработчик для кнопки «Сформировать»:


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

&НаСервере
Процедура ВывестиВариантВОбщийДокумент(ИмяВарианта, СхемаКомпоновки, КомпоновщикМакета, ПроцессорВывода)
    
    ВариантНастроек = СхемаКомпоновки.ВариантыНастроек.Найти(ИмяВарианта);
    Если ВариантНастроек = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Настройки = ВариантНастроек.Настройки;
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    
    // Формируем макет компоновки для конкретного варианта
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ДанныеРасшифровки);
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    // Выводим результат в общий документ (без очистки предыдущих данных)
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

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

Способ 5. Риски ручной компоновки при интеграции с БСП

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

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

Чтобы избежать этих проблем и сохранить все преимущества БСП, рекомендуется перенести логику обработки флажков в модуль объекта отчета в переопределяемое событие ПриКомпоновкеРезультата. Выясним, как выглядит правильная интеграция логики флажков с БСП:


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

Этот способ гарантирует стабильную работу отчета в любых современных конфигурациях 1С (ERP, КА, УТ, БП) и избавляет разработчика от необходимости переписывать базовые сервисные функции системы.

← На главную