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