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

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

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

Разберем типичную ошибку при программной установке свойства СвязиПараметровВыбора, выясним причину её возникновения и подробно рассмотрим правильный алгоритм настройки.

Анализ проблемы: почему связь параметров выбора не работает

Рассмотрим ситуацию: в табличную часть документа динамически добавлены две колонки — Номенклатура_Врем (ссылка на справочник Номенклатура) и Характеристика_Врем (ссылка на подчиненный справочник ХарактеристикиНоменклатуры). Задача заключается в том, чтобы список выбора характеристик автоматически фильтровался по владельцу — текущей номенклатуре в строке.

Посмотрим на пример кода, в котором была допущена ошибка:


// Ошибочный вариант:
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "Элементы.Товары.ТекущиеДанные.Характеристика_Врем", РежимИзмененияСвязанногоЗначения.Очищать);
НовыйМассив = Новый Массив();
НовыйМассив.Добавить(НоваяСвязь);
НовыеСвязи = Новый ФиксированныйМассив(НовыйМассив);
ПолеВвода.СвязиПараметровВыбора = НовыеСвязи;

Проанализируем причину неработоспособности этого кода. Конструктор объекта СвязьПараметраВыбора принимает три параметра:

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

В приведенном ошибочном коде в качестве второго параметра был передан путь к самой характеристике ("Элементы.Товары.ТекущиеДанные.Характеристика_Врем"), то есть поле пыталось отфильтровать само себя по собственному значению. Для фильтрации характеристик по владельцу источником данных должна выступать номенклатура.

Правильное решение и рабочий пример кода

Исправим путь к данным источника: укажем имя колонки с номенклатурой. Полный рабочий код настройки элемента поля ввода выглядит следующим образом:


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

// Свойство СвязиПараметровВыбора принимает исключительно ФиксированныйМассив
МассивСвязей = Новый Массив;
МассивСвязей.Добавить(НоваяСвязь);

ПолеХарактеристика = Элементы.ТоварыХарактеристика_Врем;
ПолеХарактеристика.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);

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

Важные технические особенности механизма СвязиПараметровВыбора

Разберем по шагам ключевые правила и тонкости, о которых важно помнить при программной работе со связями выбора в управляемых формах:

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

Альтернативные способы фильтрации при сложных зависимостях

Механизм СвязиПараметровВыбора предназначен для простого равенства значений. Если алгоритм отбора зависит от сложной бизнес-логики (например, учет общих и индивидуальных характеристик, проверка дополнительных опций номенклатуры), стандартной связи может быть недостаточно. Рассмотрим два альтернативных подхода:

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