Где задается отбор при открытии формы выбора в 1С и как его найти?

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

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

Разберем по шагам, какими механизмами платформа 1С:Предприятие 8.3 передает отборы в форму выбора, где искать скрытые фильтры и как ими управлять.

Почему в процедуре ПриСозданииНаСервере формы выбора отбор уже заполнен?

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

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

Основные места установки отборов при выборе значений

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

  1. Программная установка параметров выбора в форме документа

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

    Посмотрим на пример такого кода:

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Установка отбора через отраслевой или типовой общий модуль
        НастройкаФормБА.УстановитьОтборПоляВводаПоТипуСклада(
            Элементы.СкладОтправитель, 
            Перечисления.ТипыСкладов.Отделение
        );
    КонецПроцедуры
    

    Внутри этой процедуры для элемента формы создается массив объектов типа ПараметрВыбора, который и накладывает ограничение на список.

  2. Свойства элемента формы в конфигураторе

    Откроем свойства поля ввода на управляемой форме документа и проверим два свойства:

    1. Параметры выбора (ChoiceParameters): статический отбор, который жестко задает значения реквизитов для фильтрации выбираемых объектов.
    2. Связи параметров выбора (ChoiceParameterLinks): динамический отбор, связывающий выбор текущего поля со значением другого реквизита формы (например, фильтрация складов по выбранной организации или подразделению).
  3. Свойства реквизита в дереве метаданных

    Если отбор действует во всех документах конфигурации одинаково, он может быть определен на уровне метаданных самого реквизита объекта. Проверим свойства реквизита Склад в дереве конфигурации — там также доступны Параметры выбора и Связи параметров выбора. Эти параметры автоматически переносятся на все поля ввода, связанные с данным реквизитом.

  4. Модуль менеджера справочника

    Проанализируем события ОбработкаПолученияФормы и ОбработкаПолученияДанныхВыбора в модуле менеджера целевого справочника. Обработчик ОбработкаПолученияФормы позволяет программно подменить открываемую форму или динамически передать в нее дополнительные параметры перед открытием.

Как программно изменить или переопределить параметры выбора?

Если необходимо скорректировать наложенный фильтр, рассмотрим несколько способов решения этой задачи в зависимости от точки вмешательства.

Способ 1. Изменение свойства ПараметрыВыбора у элемента формы

Если отбор формируется на стороне формы документа, мы можем переопределить свойство элемента ПараметрыВыбора в серверном контексте формы:


&НаСервере
Процедура НастроитьОтборСкладовНаСервере()
    // Создаем массив параметров выбора
    МассивПараметров = Новый Массив;
    
    // Формируем отбор по нескольким типам складов
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(Перечисления.ТипыСкладов.РозничныйМагазин);
    МассивТипов.Добавить(Перечисления.ТипыСкладов.АптечныйСклад);
    
    МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.ТипСклада", МассивТипов));
    
    // Присваиваем фиксированный массив элементу формы
    Элементы.СкладОтправитель.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
КонецПроцедуры

Способ 2. Явное открытие формы через событие НачалоВыбора

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


&НаКлиенте
Процедура СкладОтправительНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // Отключаем стандартный механизм открытия
    СтандартнаяОбработка = Ложь;
    
    // Задаем собственные параметры
    ПараметрыФормы = Новый Структура;
    
    Отбор = Новый Структура;
    Отбор.Вставить("ПометкаУдаления", Ложь);
    // Добавляем или исключаем нужные условия
    ПараметрыФормы.Вставить("Отбор", Отбор);
    
    // Открываем форму выбора явно
    ОткрытьФорму(
        "Справочник.Склады.ФормаВыбора", 
        ПараметрыФормы, 
        Элемент
    );
КонецПроцедуры

Способ 3. Очистка отбора в самой форме выбора

Если нужно гарантировать доступность всех элементов независимо от того, откуда открывается форма, отбор можно программно снять в процедуре ПриСозданииНаСервере формы выбора:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Если параметр Отбор передан, мы можем удалить конкретное условие
    Если Параметры.Свойство("Отбор") Тогда
        // Очищаем отбор по конкретному полю динамического списка
        ЭлементОтбора = Список.Отбор.Элементы;
        // Либо модифицируем компоновщик настроек списка
    КонецЕсли;
КонецПроцедуры

Таким образом, для поиска скрытых условий отбора всегда последовательно проверяем: модули формы документа (процедуры инициализации), свойства элемента формы и метаданных объекта, а также модуль менеджера выбираемого справочника.

← На главную