Как программно установить отбор в СКД для разных вариантов отчета

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

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

Метод 1. Программная установка отбора в процедуре ПриКомпоновкеРезультата

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

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


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

КонецПроцедуры

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

Метод 2. Работа с пользовательскими настройками

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

Проанализируем алгоритм поиска в пользовательских настройках:


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

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

Метод 3. Связка «Отбор — Параметр» (Самый элегантный способ)

Работа с коллекциями отборов бывает громоздкой из-за сложной структуры групп (И/ИЛИ). Рассмотрим более простой подход через параметры СКД:

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

Теперь нам не нужно искать элементы в коллекции отборов. Достаточно в процедуре ПриКомпоновкеРезультата просто установить значение параметра. Это гораздо надежнее и проще в поддержке:


ПараметрСклад = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("П_СкладОтбора");
Если ПараметрСклад <> Неопределено Тогда
    ПараметрСклад.Значение = Справочники.Склады.НайтиПоКоду("00001");
    ПараметрСклад.Использование = Истина;
КонецЕсли;

Метод 4. Использование события формы ПриЗагрузкеВариантаНаСервере

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

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


&НаСервере
Процедура ПриЗагрузкеВариантаНаСервере(Настройки)
    
    // Проверяем имя загруженного варианта
    Если Настройки.ИмяВарианта = "АнализПоРегиону" Тогда
        // Устанавливаем параметры или отборы напрямую в переданный объект Настройки
        // Помним про ПользовательскиеНастройки, если они используются
    КонецЕсли;
    
КонецПроцедуры

Метод 5. Фиксированные настройки

Иногда требуется, чтобы отбор был жестко задан для варианта и пользователь не мог его изменить или удалить. Для этого используйте КомпоновщикНастроек.ФиксированныеНастройки. Отборы, установленные здесь, суммируются с основными настройками, но не отображаются в интерфейсе пользователя. Это идеальное решение для вариантов типа «Только помеченные на удаление» или «Только по конкретной организации».

Нюансы работы с внешними отчетами

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

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

← На главную