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