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

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

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

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

Выясняем причины ошибки «Недопустимое значение»

Проанализируем ситуацию, в которой оказывается разработчик. Присвоение фиксированного массива связей параметров выбора объекту поля формы вызывает исключение. При этом отладчик показывает, что тип присваиваемого значения верный — ФиксированныйМассив, содержащий объект типа СвязьПараметраВыбора. В чем же кроется ошибка?

Основных причин некорректного поведения платформы здесь три:

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

Рассмотрим подробнее, как правильно обойти эти подводные камни и реализовать корректный алгоритм.

Где именно выполнять программную модификацию?

Единственным правильным местом для программного добавления реквизитов, элементов формы и настройки их свойств (включая связи параметров выбора) является предопределенный обработчик ПриСозданииНаСервере.

В момент выполнения этой процедуры структура формы уже полностью подготовлена на сервере, но сама форма еще не отправлена клиенту для отрисовки. Это позволяет один раз бесконфликтно перестроить структуру данных формы без лишних клиент-серверных вызовов и мерцания интерфейса.

Разберем по шагам правильную реализацию задачи

Посмотрим на пример решения задачи, где в табличную часть Счетчики внешней обработки нам нужно динамически добавить колонку Счетчик с типом ссылки на справочник из расширения СправочникСсылка.Расш1_Счетчики. При этом выбор счетчика должен быть ограничен физическим лицом, указанным в текущей строке этой же табличной части (реквизит ФизЛицо).

Для реализации этой логики выполним следующие шаги в обработчике ПриСозданииНаСервере:

Шаг 1. Программное добавление реквизита в структуру Табличной Части

Сначала нам необходимо расширить структуру данных табличной части на форме, добавив в нее новый реквизит нужного типа.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Подготовим массив добавляемых реквизитов формы
    ДобавляемыеРеквизиты = Новый Массив;
    
    // Описываем новый реквизит. 
    // Четвертый параметр - это путь к реквизиту в ТЧ: "Объект.ИмяТабличнойЧасти"
    НовыйРеквизит = Новый РеквизитФормы(
        "Счетчик", 
        Новый ОписаниеТипов("СправочникСсылка.Расш1_Счетчики"), 
        "Объект.Счетчики", 
        "Счетчик"
    );
    ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
    
    // Применяем изменения структуры данных формы
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Шаг 2. Создание элемента управления (колонки) в таблице на форме

После того как структура данных успешно изменена, добавим визуальный элемент на форму — поле ввода в таблицу.


// Добавляем элемент управления в коллекцию элементов формы
// Третьим параметром передаем родительский элемент - саму таблицу "Счетчики"
ЭлементКолонка = Элементы.Добавить("СчетчикиСчетчик", Тип("ПолеФормы"), Элементы.Счетчики);
    
// Связываем элемент формы с добавленным ранее реквизитом данных
ЭлементКолонка.ПутьКДанным = "Объект.Счетчики.Счетчик";
    
// Определяем вид поля как поле ввода
ЭлементКолонка.Вид = ВидПоляФормы.ПолеВвода;

Шаг 3. Настройка связи параметров выбора

Теперь перейдем к ключевому моменту — установке отбора. Нам нужно связать поле выбора счетчика с полем физического лица в текущей строке. Для связи параметров выбора внутри строк табличной части платформа 1С поддерживает два рабочих варианта указания пути к данным источника.

Вариант 1. Через элементы формы (Рекомендуемый)
Используем обращение к текущим данным таблицы формы. Обратите внимание на слитное написание свойства ТекущиеДанные:

"Элементы.Счетчики.ТекущиеДанные.ФизЛицо"

Вариант 2. Через прямой путь к данным объекта
Мы можем указать путь к реквизиту табличной части напрямую через структуру объекта:

"Объект.Счетчики.ФизЛицо"

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

Проанализируем программный код настройки связи параметров выбора:


    // Создаем массив для будущих связей параметров выбора
    МассивСвязей = Новый Массив;
    
    // Определяем имя параметра отбора (обычно это "Отбор.Владелец", если связь идет по владельцу)
    ИмяПараметраОтбора = "Отбор.Владелец";
    
    // Задаем корректный путь к данным реквизита-ограничителя
    ПутьКДаннымОграничителя = "Объект.Счетчики.ФизЛицо"; 
    // Альтернативный вариант: ПутьКДаннымОграничителя = "Элементы.Счетчики.ТекущиеДанные.ФизЛицо";
    
    // Инициализируем связь параметра выбора
    НоваяСвязь = Новый СвязьПараметраВыбора(ИмяПараметраОтбора, ПутьКДаннымОграничителя);
    МассивСвязей.Добавить(НоваяСвязь);
    
    // Преобразуем массив в фиксированный и назначаем свойству элемента формы
    ЭлементКолонка.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
    
КонецПроцедуры

Важные нюансы и особенности

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

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

← На главную