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

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет
← На главную

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

Разбор ситуации: Почему очищаются поля?

Автоматическая очистка значений происходит из-за установленной связи между реквизитами на уровне метаданных. В платформе 1С свойство СвязиПараметровВыбора (ChoiceParameterLinks) отвечает за фильтрацию данных в выпадающем списке. По умолчанию платформа настроена так: если «ведущий» реквизит (например, Организация) меняется, то «зависимый» реквизит (например, Банковский счет или Сотрудник) очищается, так как старое значение может не соответствовать новым условиям фильтрации.

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

Способ 1. Изменение свойств через редактор расширения

Самый простой способ — это добавить реквизит или табличную часть в расширение и изменить настройки непосредственно в конфигураторе. Давайте пройдем по шагам:

  1. Найдите нужный объект (документ или справочник) в дереве основной конфигурации и добавьте его в расширение.
  2. Добавьте в расширение конкретный реквизит (или реквизит табличной части), поведение которого нужно изменить.
  3. В окне свойств расширенного реквизита найдите пункт Связи параметров выбора.
  4. В открывшемся окне вы увидите список связей. Здесь можно либо удалить связь вовсе, либо изменить Режим изменения связанных значений.

Важный нюанс: Если вы хотите оставить фильтрацию, но при этом запретить автоматическую очистку уже выбранного значения, попробуйте изменить режим на «Применять при пустом значении». Однако, как показывает практика, для полного контроля над логикой (особенно в типовых конфигурациях вроде БГУ или ERP) чаще требуется программный подход.

Способ 2. Программное изменение ограничений выбора (ПараметрыВыбора)

Часто требуется не просто разорвать связь, а программно ограничить список доступных для выбора элементов (например, счетов или категорий). Рассмотрим пример, когда нам нужно разрешить выбор определенных счетов в документе, которые изначально были запрещены типовой логикой.

Для этого мы будем использовать обработчик ПриСозданииНаСервере в модуле формы расширения. Разберем код, который позволяет добавить дополнительные счета в фильтр:


&НаСервере
Процедура УСД_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Создаем массив с нужными нам значениями (кодами счетов)
    НовыйМассив = Новый Массив;
    НовыйМассив.Добавить(Новый ПараметрВыбора("ОграниченияСчета", "07.1, 07.2, 02, 22.2, 90"));
    
    // Важно: свойства элементов формы принимают только ФиксированныйМассив
    ЭтотОбъект.Элементы.ЗабалансовыйСчет.ПараметрыВыбора = Новый ФиксированныйМассив(НовыйМассив);
    
КонецПроцедуры

В данном примере мы используем расширение процедуры с аннотацией &После. Обратите внимание на объект ПараметрВыбора. Первым аргументом передается имя параметра (строка, которую ожидает форма выбора), вторым — само значение ограничения. Если форма выбора поддерживает список кодов через запятую, этот метод отлично работает в конфигурациях на базе БГУ 2.0.

Способ 3. Программное управление связями (СвязиПараметровВыбора)

Если ваша задача — именно отключить «очистку» поля программно, нам нужно воздействовать на свойство СвязиПараметровВыбора элемента формы. Рассмотрим, как это сделать правильно, чтобы не нарушить работу интерфейса. Для упрощения программной доработки управляемых форм в расширениях пригодится готовый модуль для программного изменения форм.

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


&НаСервере
Процедура УСД_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Полное удаление всех связей параметров выбора для элемента
    ПустойМассив = Новый Массив;
    Элементы.ФизическоеЛицо.СвязиПараметровВыбора = Новый ФиксированныйМассив(ПустойМассив);
    
КонецПроцедуры

Проанализируем ситуацию подробнее: если связь нужно не удалить, а изменить, нам потребуется создать новый объект связи. Посмотрим на пример создания связи программно:


&НаСервере
Процедура УСД_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    МассивСвязей = Новый Массив;
    
    // ИмяПараметра - как его ждет форма выбора
    // ПутьКДанным - имя реквизита на текущей форме, от которого зависит выбор
    НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Организация", "Объект.Организация");
    МассивСвязей.Добавить(НоваяСвязь);
    
    Элементы.Сотрудник.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
    
КонецПроцедуры

Тонкости и подводные камни

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

  1. ФиксированныйМассив: Платформа 1С требует, чтобы свойства элементов формы (такие как ПараметрыВыбора) заполнялись объектами типа ФиксированныйМассив. Обычный Массив вызовет ошибку выполнения. Сначала наполняйте обычный массив, а затем конвертируйте его.
  2. Типы данных в фильтрах: Хотя в некоторых конфигурациях (как БГУ 2.0) допустимо передавать строку с кодами счетов через запятую, более надежным способом является передача массива ссылок. Это предотвратит ошибки при изменении строкового представления объектов.
  3. ПриИзменении в коде: Помните, что очистка реквизита может быть прописана не только в метаданных (через связи), но и явно в модуле формы основной конфигурации (в процедуре ПриИзменении родительского поля). В этом случае программное изменение связей не поможет — вам придется расширять обработчик ПриИзменении (через &Вместо) и комментировать или изменять логику очистки.
  4. Приоритет: Свойства, установленные программно в ПриСозданииНаСервере, имеют наивысший приоритет и перекрывают настройки, заданные в конфигураторе (как в основной конфигурации, так и в самом расширении).

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

← На главную