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