Как ограничить выбор контрагентов конкретной группой в выпадающем списке?

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

При разработке конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача сузить круг элементов для выбора в конкретном документе. Например, если в поле Контрагент пользователь должен видеть только тех лиц, которые входят в группу «Агенты». Мы разберем несколько способов реализации этой задачи: от самых простых (без программирования) до профессиональных методов, обеспечивающих высокую производительность системы.

Способ 1. Использование свойств реквизита в Конфигураторе

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

  1. Откроем дерево конфигурации и найдем нужный нам документ.
  2. Перейдем к свойствам реквизита, имеющего тип СправочникСсылка.Контрагенты.
  3. Найдем категорию свойств Параметры выбора.
  4. В открывшемся окне добавим новый параметр. В колонке «Имя параметра» выберем Отбор.Родитель, а в колонке «Значение» укажем конкретную группу (например, «Агенты»).

Этот метод хорош тем, что он автоматически накладывает фильтр как на выпадающий список (автоподбор), так и на форму выбора, если пользователь решит открыть ее полностью.

Способ 2. Программная установка отбора в событии НачалоВыбора

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


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

В данном примере мы используем ПредопределенноеЗначение, если группа «Агенты» создана в конфигураторе. Если же это обычный элемент справочника, его ссылку можно получить через поиск или из константы.

Способ 3. Обработка получения данных выбора в модуле менеджера

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

Разберем алгоритм работы:

  1. Переходим в модуль менеджера справочника Контрагенты.
  2. Создаем процедуру-обработчик.
  3. Анализируем дополнительные параметры, передаваемые из формы, и модифицируем отбор.

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Если в параметрах передано указание фильтровать по агентам
    Если Параметры.Свойство("ТолькоАгенты") Тогда
        СтандартнаяОбработка = Ложь;
        
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ ПЕРВЫЕ 20
            |	Контрагенты.Ссылка КАК Ссылка,
            |	Контрагенты.Наименование КАК Наименование
            |ИЗ
            |	Справочник.Контрагенты КАК Контрагенты
            |ГДЕ
            |	Контрагенты.Родитель = &ГруппаАгенты
            |	И Контрагенты.Наименование ПОДОБНО &СтрокаПоиска + ""%""";
        
        Запрос.УстановитьПараметр("ГруппаАгенты", Параметры.ГруппаАгенты);
        Запрос.УстановитьПараметр("СтрокаПоиска", Параметры.СтрокаПоиска);
        
        Список = Новый СписокЗначений;
        Выборка = Запрос.Выполнить().Выбрать();
        
        Пока Выборка.Следующий() Цикл
            Список.Добавить(Выборка.Ссылка, Выборка.Наименование);
        КонецЦикла;
        
        ДанныеВыбора = Список;
    КонецЕсли;
    
КонецПроцедуры

Способ 4. Режим быстрого выбора и список выбора

Если в группе «Агенты» содержится небольшое количество элементов (до 15-20), имеет смысл использовать свойство Режим выбора из списка. В этом случае вместо полноценного справочника пользователю будет показано простое выпадающее меню.

Для реализации этого метода проанализируем следующий подход в модуле формы документа:


&НаСервере
Процедура ЗаполнитьСписокВыбораАгентов()
    
    // Очищаем текущий список выбора элемента формы
    ЭлементСписка = Элементы.Контрагент.СписокВыбора;
    ЭлементСписка.Очистить();
    
    // Запрашиваем данные из базы
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Контрагенты.Ссылка,
        |	Контрагенты.Наименование
        |ИЗ
        |	Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |	Контрагенты.Родитель = &Группа";
    
    Запрос.УстановитьПараметр("Группа", Справочники.Контрагенты.НайтиПоНаименованию("Агенты"));
    
    Результат = Запрос.Выполнить().Выбрать();
    Пока Результат.Следующий() Цикл
        ЭлементСписка.Добавить(Результат.Ссылка, Результат.Наименование);
    КонецЦикла;
    
КонецПроцедуры

Важный момент: при использовании этого метода не забудьте установить у элемента формы свойство РежимВыбораИзСписка в значение Истина. Это гарантирует, что программа предложит пользователю именно сформированный нами список.

Оптимизация и производительность

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

Рекомендуется всегда ограничивать количество возвращаемых записей в выпадающем списке (использовать конструкцию ВЫБРАТЬ ПЕРВЫЕ 20 в запросах). Это ускоряет отрисовку интерфейса и делает работу пользователя более комфортной.

Также стоит различать СписокВыбора и ДанныеВыбора. Список выбора — это статический набор данных, который загружается один раз при открытии формы. Данные выбора формируются динамически при каждом вводе символа в поле. Для динамично меняющихся справочников второй вариант предпочтительнее, так как он актуальнее и меньше нагружает память формы.

Итоги

Мы рассмотрели различные варианты решения задачи: от простых настроек в Конфигураторе до гибкого программирования в модуле менеджера. Выбор метода зависит от сложности вашей бизнес-логики. Если отбор всегда одинаковый — используйте Параметры выбора. Если он зависит от текущей даты, организации или других реквизитов документа — используйте программные обработчики событий.

← На главную