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