Как программно добавить отбор в СКД и почему он может не работать

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

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

Анализ основной проблемы: где искать настройки?

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

Для корректной работы необходимо использовать КомпоновщикНастроек.Настройки. Именно этот объект содержит текущее состояние настроек отчета. Если же вы программно изменили настройки в коде формы, не забудьте вызвать метод ЗагрузитьНастройки, чтобы синхронизировать состояние компоновщика. В процедуре ПриКомпоновкеРезультата настройки уже доступны в компоновщике, и их модификация напрямую повлияет на результат компоновки макета.

Иерархия настроек СКД: три уровня контроля

Чтобы понять, почему ваш отбор «пропадает», нужно разобраться в иерархии настроек. В СКД существует три слоя, которые накладываются друг на друга:

  1. Настройки (Settings): Основные настройки варианта. Те, что заданы в конфигураторе или программно изменены в КомпоновщикНастроек.Настройки.
  2. Пользовательские настройки (UserSettings): Это то, что пользователь видит и меняет в интерфейсе. Важный момент: если один и тот же отбор присутствует и в основных, и в пользовательских настройках, то приоритет имеют пользовательские. Если вы программно меняете основной отбор, а в пользовательских настройках стоит другое значение (или галочка снята), ваш код визуально «не сработает».
  3. Фиксированные настройки (FixedSettings): Самый «жесткий» уровень. Эти настройки не видны пользователю и накладываются поверх всего остального. Если вам нужно программно ограничить данные так, чтобы пользователь не мог на это повлиять, используйте КомпоновщикНастроек.ФиксированныеНастройки.

Программная установка отбора: пошаговый пример

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


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

Обратите внимание на объект ТекущиеНастройки.Отбор. Это общий отбор для всего отчета. Если ваша структура сложнее, и вам нужно отфильтровать данные только в конкретной группировке, обращаться нужно к структуре настроек.

Отборы на уровне группировок

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

Например, чтобы установить отбор для первой группировки в списке, мы используем следующий путь:

КомпоновщикНастроек.Настройки.Структура[0].Отбор

Важно: обращение по индексу [0] — это «быстрый», но опасный путь. Если структура отчета изменится (пользователь поменяет группировки местами), ваш код может начать работать некорректно. Безопаснее будет выполнить рекурсивный обход структуры настроек и искать нужную группировку по ее имени или типу.

Связь с пользовательскими настройками (UI)

Чтобы программно добавленный отбор стал виден пользователю на форме (появился в списке фильтров с галочкой), необходимо выполнить два условия:

  1. У элемента отбора должно быть заполнено свойство ИдентификаторПользовательскойНастройки.
  2. Этот идентификатор должен быть зарегистрирован в составе пользовательских настроек.

Если вы просто добавите элемент в КомпоновщикНастроек.Настройки.Отбор, он применится при формировании, но останется «невидимым» для пользователя. Чтобы связать программный код с интерфейсом, рассмотрим следующий алгоритм:


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

// Присваиваем уникальный идентификатор для связи с формой
НовыйЭлемент.ИдентификаторПользовательскойНастройки = "ОтборПоОтклонению";

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

Типичные ошибки при программной работе с СКД

Рассмотрим ситуации, которые чаще всего приводят к некорректной работе отчетов:

Заключение

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

← На главную