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

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

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

Способ 1. Использование свойства «Связь по владельцу»

Это самый простой и быстрый метод, который подходит для большинства типовых задач в обычных формах (например, в УПП или старых версиях УТ). Суть заключается в том, что справочник ДоговорыКонтрагентов является подчиненным справочнику Контрагенты. Система «знает», что контрагент является владельцем договора.

Рассмотрим по шагам, как это настроить:

  1. Откроем форму обработки в конфигураторе.
  2. Выберем поле ввода, предназначенное для выбора договора.
  3. В палитре свойств найдем параметр Связь по владельцу.
  4. В открывшемся окне выберем имя реквизита (или поля на форме), в котором выбирается контрагент.

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

Способ 2. Связи параметров выбора (для управляемых форм)

В современных конфигурациях на базе управляемых форм механизм связи по владельцу был значительно расширен и заменен более гибким инструментом — Связи параметров выбора (ChoiceParameterLinks). Этот метод позволяет устанавливать зависимость не только от одного владельца, но и от нескольких реквизитов сразу (например, от организации и контрагента одновременно).

Проанализируем настройку этого механизма:

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

Такой подход считается наиболее «правильным» в среде 1С:Предприятие 8.3, так как он минимизирует написание кода и корректно отрабатывается платформой.

Способ 3. Программная установка отбора через событие «НачалоВыбора»

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

Рассмотрим пример кода для реализации такой задачи:


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

Выясним, в чем преимущество этого метода. Используя СтандартнаяОбработка = Ложь, мы полностью берем управление процессом на себя. Это позволяет избежать открытия окна выбора контрагента, даже если он еще не выбран в форме (в этом случае можно вывести предупреждение пользователю).

Важные нюансы и типичные ошибки

Проанализируем ситуацию, которая часто приводит к ошибкам в данных. Если пользователь сначала выбрал Контрагента А и Договор А-1, а затем изменил Контрагента на Б, в поле «Договор» останется старое значение А-1, которое теперь невалидно.

Чтобы этого избежать, необходимо обязательно использовать событие ПриИзменении для поля «Контрагент»:


Процедура КонтрагентПриИзменении(Элемент)
    
    // При смене контрагента всегда очищаем договор, 
    // так как старый договор больше не принадлежит новому владельцу
    Объект.Договор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
    
КонецПроцедуры

Также стоит обратить внимание на свойство Быстрый выбор. Если у большинства ваших контрагентов немного договоров (1–5), включение этого свойства позволит выбирать договор из выпадающего списка прямо в поле ввода, без открытия громоздких модальных окон. В сочетании с правильно настроенной связью по владельцу это делает работу пользователя молниеносной.

Резюме

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

← На главную