При программном создании реквизитов и элементов формы в 1С:Предприятии 8.3 часто возникает необходимость установить зависимость одного поля от другого. Классический сценарий — выбор характеристики в зависимости от выбранной номенклатуры в строке табличной части. Если в визуальном редакторе конфигуратора эта связь настраивается в свойствах элемента в несколько кликов, то при программном формировании интерфейса разработчики нередко сталкиваются с ошибками и неработающими отборами.
Разберем типичную ошибку при программной установке свойства СвязиПараметровВыбора, выясним причину её возникновения и подробно рассмотрим правильный алгоритм настройки.
Рассмотрим ситуацию: в табличную часть документа динамически добавлены две колонки — Номенклатура_Врем (ссылка на справочник Номенклатура) и Характеристика_Врем (ссылка на подчиненный справочник ХарактеристикиНоменклатуры). Задача заключается в том, чтобы список выбора характеристик автоматически фильтровался по владельцу — текущей номенклатуре в строке.
Посмотрим на пример кода, в котором была допущена ошибка:
// Ошибочный вариант:
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "Элементы.Товары.ТекущиеДанные.Характеристика_Врем", РежимИзмененияСвязанногоЗначения.Очищать);
НовыйМассив = Новый Массив();
НовыйМассив.Добавить(НоваяСвязь);
НовыеСвязи = Новый ФиксированныйМассив(НовыйМассив);
ПолеВвода.СвязиПараметровВыбора = НовыеСвязи;
Проанализируем причину неработоспособности этого кода. Конструктор объекта СвязьПараметраВыбора принимает три параметра:
"Отбор.Владелец").РежимИзмененияСвязанногоЗначения).В приведенном ошибочном коде в качестве второго параметра был передан путь к самой характеристике ("Элементы.Товары.ТекущиеДанные.Характеристика_Врем"), то есть поле пыталось отфильтровать само себя по собственному значению. Для фильтрации характеристик по владельцу источником данных должна выступать номенклатура.
Исправим путь к данным источника: укажем имя колонки с номенклатурой. Полный рабочий код настройки элемента поля ввода выглядит следующим образом:
// Создаем объект связи параметров выбора, указывая источником поле с номенклатурой
НоваяСвязь = Новый СвязьПараметраВыбора(
"Отбор.Владелец",
"Элементы.Товары.ТекущиеДанные.Номенклатура_Врем",
РежимИзмененияСвязанногоЗначения.Очищать
);
// Свойство СвязиПараметровВыбора принимает исключительно ФиксированныйМассив
МассивСвязей = Новый Массив;
МассивСвязей.Добавить(НоваяСвязь);
ПолеХарактеристика = Элементы.ТоварыХарактеристика_Врем;
ПолеХарактеристика.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
После применения этой корректировки при открытии формы выбора характеристики в строке табличной части платформа автоматически передает владельца из текущей строки, и пользователь видит только те характеристики, которые принадлежат выбранной номенклатуре.
Разберем по шагам ключевые правила и тонкости, о которых важно помнить при программной работе со связями выбора в управляемых формах:
СвязиПараметровВыбора выполняется исключительно на сервере, как правило, в обработчике ПриСозданииНаСервере."Элементы.<ИмяТаблицы>.ТекущиеДанные.<ИмяКолонкиИсточника>". Прямое указание пути через данные объекта (например, "Объект.Товары.Номенклатура") для строки таблицы недопустимо и приведет к ошибке платформы."Объект.<ИмяРеквизитаШапки>".СвязиПараметровВыбора доступно только для чтения в плане изменения самого массива — оно принимает строго тип ФиксированныйМассив. Добавить элемент методом Добавить() напрямую в существующее свойство нельзя. Необходимо сформировать обычный Массив и обернуть его в Новый ФиксированныйМассив().РежимИзмененияСвязанногоЗначения.Очищать автоматически очищает значение зависимого реквизита при смене родительского значения, что предотвращает появление некорректных данных (например, когда номенклатуру изменили, а характеристика осталась от старой). Если требуется сохранить значение, используется значение РежимИзмененияСвязанногоЗначения.НеИзменять.Механизм СвязиПараметровВыбора предназначен для простого равенства значений. Если алгоритм отбора зависит от сложной бизнес-логики (например, учет общих и индивидуальных характеристик, проверка дополнительных опций номенклатуры), стандартной связи может быть недостаточно. Рассмотрим два альтернативных подхода:
СтандартнаяОбработка = Ложь), программно формируется структура отбора с необходимыми условиями и вызывается метод ОткрытьФорму() с передачей параметров.ОбработкаПолученияДанныхВыбора.