Как настроить отбор контрагентов по виду операции через связи параметров выбора в 1С?

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

При конфигурировании документов в 1С (в частности, в «1С:Управление нашей фирмой») часто возникает необходимость ограничить список доступных для выбора контрагентов в зависимости от выбранного вида операции. В типовых решениях в реквизитах формы или реквизитах объекта нередко можно встретить настройку связи параметров выбора вида Дополнительно.ВидОперации(ВидОперации).

Разберем детально, как платформа 1С обрабатывает префикс Дополнительно., почему отбор не срабатывает автоматически при добавлении нового вида операции и какими способами можно реализовать требуемое поведение.

Как работает механизм «Дополнительно.» в связях параметров выбора

Проанализируем базовый механизм платформы 1С:Предприятие 8.3:

  1. Стандартный отбор (Отбор.ИмяРеквизита): если в свойствах связи указано, например, Отбор.Поставщик(РеквизитФормы), платформа автоматически при открытии формы выбора накладывает жесткий отбор на динамический список по полю Поставщик.
  2. Передача дополнительного параметра (Дополнительно.ИмяПараметра): если указан префикс Дополнительно. (например, Дополнительно.ВидОперации), платформа не выполняет автоматический отбор. Префикс отсекается, а само значение передается в структуру параметров открываемой формы под именем Параметры.ВидОперации.

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

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

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

Создадим процедуру обновления отбора и вызовем ее при создании/чтении формы и при изменении реквизита ВидОперации:


&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
    УстановитьОтборКонтрагента();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОтборКонтрагента()
    
    МассивПараметров = Новый Массив;
    
    Если Объект.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийПриходнаяНакладная.ПоступлениеОтПрочегоПоставщика") Тогда
        // Добавляем параметр выбора с префиксом "Отбор."
        МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.ПрочиеОтношения", Истина));
    КонецЕсли;
    
    // Передаем фиксированный массив в параметры выбора элемента
    Элементы.Контрагент.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
    
КонецПроцедуры

Преимущества данного подхода:

  1. Отбор работает корректно как при открытии формы выбора через кнопку «...», так и при быстром автоподборе и вводе текста по строке.
  2. Не требуется изменять код справочника Контрагенты или вмешиваться в модули менеджера.
  3. Типовой механизм возврата выбранного значения в реквизит работает штатно.

Способ 2. Обработка переданного параметра в форме выбора справочника через расширение

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

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


&Вместо("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ПродолжитьВызов(Отказ, СтандартнаяОбработка);
    
    Если Параметры.Свойство("ВидОперации") Тогда
        Если Параметры.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийПриходнаяНакладная.ПоступлениеОтПрочегоПоставщика") Тогда
            
            ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
            ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПрочиеОтношения");
            ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
            ЭлементОтбора.ПравоеЗначение = Истина;
            ЭлементОтбора.Использование = Истина;
            
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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

Способ 3. Переопределение события «НачалоВыбора»

Разберем также вариант с ручным открытием формы выбора через событие поля ввода НачалоВыбора. Обратите внимание: при использовании метода ОткрытьФорму критически важно правильно передавать владельца формы (элемент формы документа), иначе выбранное значение не будет помещено в поле ввода.


&НаКлиенте
Процедура КонтрагентНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    Если Объект.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийПриходнаяНакладная.ПоступлениеОтПрочегоПоставщика") Тогда
        
        СтандартнаяОбработка = Ложь;
        
        ЗначениеОтбора = Новый Структура("ПрочиеОтношения", Истина);
        ПараметрыОткрытия = Новый Структура("Отбор", ЗначениеОтбора);
        
        // Обязательно передаем "Элемент" 4-м параметром, чтобы связать выбор со значением поля
        ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыОткрытия, Элемент);
        
    КонецЕсли;
    
КонецПроцедуры

Важное ограничение: переопределение события НачалоВыбора с отключением СтандартнаяОбработка = Ложь работает только при интерактивном нажатии на кнопку выбора. Ввод по строке и выпадающий список быстрого автоподбора при этом не будут отфильтрованы, поэтому первый и второй способы являются более предпочтительными в промышленной разработке.

← На главную