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