При разработке отчетов на платформе 1С:Предприятие 8 в конфигурациях на базе БСП (например, 1С:ERP, Комплексная автоматизация, Управление холдингом) разработчики часто сталкиваются с задачей: ограничить выбор значений для конкретного поля отбора или параметра данных. Нередко возникает проблема, когда при открытии отчета список значений заполняется корректно, но стоит пользователю изменить период или нажать кнопку формирования, как доступные значения сбрасываются к стандартным.
В этой статье разберем, почему происходит сброс настроек и как правильно организовать ограничение выбора значений через механизмы БСП и стандартные средства схемы компоновки данных.
Проанализируем механизм работы компоновщика настроек. Если программно изменять доступные поля отбора или свойства элементов формы напрямую при инициализации отчета (например, в обработчиках ПриСозданииНаСервере или ПриКомпоновкеРезультата), платформа при любом интерактивном действии пользователя (смена периода, выбор другого варианта, повторная инициализация компоновщика) перечитывает структуру настроек из исходной схемы компоновки данных (СКД). В результате коллекция доступных полей очищается и пересоздается заново, стирая все динамические изменения.
Чтобы список выбора оставался актуальным и не сбрасывался при изменении периода или перезагрузке формы, необходимо встраиваться в штатные механизмы подсистемы «Варианты отчетов» БСП либо фиксировать настройки на уровне самой схемы.
В типовых конфигурациях для управления параметрами выбора используется подсистема «Варианты отчетов». Чтобы переопределить логику выбора для поля или параметра, подключим специальный обработчик в модуле отчета или модуле менеджера отчета.
Разберем по шагам реализацию данного механизма:
ОпределитьНастройкиФормы.ПриОпределенииПараметровВыбора, где зададим список допустимых значений.Сначала объявим подписку на событие формы:
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПриОпределенииПараметровВыбора = Истина;
КонецПроцедуры
Теперь рассмотрим, как ограничить выбор с помощью фиксированного списка значений. Важный нюанс БСП: не следует заново переопределять свойство СвойстваНастройки.ЗначенияДляВыбора новым объектом Новый СписокЗначений, так как это нарушает внутреннюю логику подсистемы. Правильнее очистить уже существующую коллекцию и заполнить её нужными элементами:
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
ИмяПоля = Строка(СвойстваНастройки.ПолеКД);
// Проверяем, является ли поле параметром данных
Если ИмяПоля = "ПараметрыДанных.НужныйПараметр" Тогда
СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями = Истина;
// Очищаем существующую коллекцию и наполняем её
СвойстваНастройки.ЗначенияДляВыбора.Очистить();
СвойстваНастройки.ЗначенияДляВыбора.Добавить(ПредопределенноеЗначение("Перечисление.Статусы.Действует"));
СвойстваНастройки.ЗначенияДляВыбора.Добавить(ПредопределенноеЗначение("Перечисление.Статусы.Закрыт"));
КонецЕсли;
КонецПроцедуры
Если требуется ограничить не параметр данных, а обычное поле отбора СКД, проверка поля выполняется без префикса параметров:
Если СвойстваНастройки.ПолеКД = Новый ПолеКомпоновкиДанных("Организация") Тогда
СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями = Истина;
СвойстваНастройки.ЗначенияДляВыбора.Очистить();
// Добавление разрешенных организаций
СвойстваНастройки.ЗначенияДляВыбора.Добавить(СсылкаНаОрганизацию);
КонецЕсли;
Рассмотрим вариант, когда список доступных значений зависит от других параметров (например, от выбранного периода или организации). В этом случае в обработчике ПриОпределенииПараметровВыбора можно передать текст запроса, который система выполнит динамически при открытии выпадающего списка:
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
ИмяПоля = Строка(СвойстваНастройки.ПолеКД);
Если ИмяПоля = "ПараметрыДанных.Подразделение" Тогда
// Текущие значения других параметров можно прочитать из настроек формы
ТекстЗапроса =
"ВЫБРАТЬ
| Подразделения.Ссылка КАК Значение
|ИЗ
| Справочник.СтруктураПредприятия КАК Подразделения
|ГДЕ
| НЕ Подразделения.ПометкаУдаления";
СвойстваНастройки.ЗапросЗначенийВыбора.Текст = ТекстЗапроса;
КонецЕсли;
КонецПроцедуры
Если список допустимых значений статичен и рассчитывается один раз при инициализации отчета (не зависит интерактивно от смены периода на форме), его можно установить напрямую в объекте СхемаКомпоновкиДанных. В таком случае настройки не будут сбрасываться при любых манипуляциях пользователя с компоновщиком.
Посмотрим на пример установки доступных значений в модуле объекта отчета:
// В модуле отчета или перед инициализацией компоновщика
ПолеНабора = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Поля.Найти("Статус");
Если ПолеНабора <> Неопределено Тогда
Список = Новый СписокЗначений;
Список.Добавить(ПредопределенноеЗначение("Перечисление.Статусы.Согласован"));
Список.Добавить(ПредопределенноеЗначение("Перечисление.Статусы.Утвержден"));
ПолеНабора.УстановитьДоступныеЗначения(Список);
КонецЕсли;
Проанализируем ситуацию, когда поле выбора ссылочного типа и зависит от другого реквизита или параметра отчета (например, выбор договора должен зависеть от выбранного контрагента). Для этого программный код писать не требуется:
Отбор.Владелец(Контрагент)).Использование механизмов БСП через ПриОпределенииПараметровВыбора или штатных связей параметров выбора в СКД гарантирует корректную работу отчета, исключая сброс доступных значений при изменении периода и повторном формировании результата.