Как ограничить выбор в поле ввода справочника в 1С:ERP через расширение?

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

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

Постановка задачи и анализ ситуации

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

Способ 1. Использование механизма «Связи параметров выбора»

Это наиболее «правильный» и декларативный метод, который поддерживается платформой на уровне метаданных. Он позволяет установить зависимость одного поля формы от другого без написания сложного программного кода. Разберем по шагам, как реализовать настройку связей параметров выбора в расширении.

Основная проблема, с которой сталкиваются разработчики при работе в расширениях — отсутствие видимости стандартных реквизитов (например, Владелец) в редакторе связей. Чтобы решить эту проблему и учесть особенности использования стандартных реквизитов в расширениях, выполним следующие действия:

  1. Добавим в расширение справочник БанковскиеСчетаОрганизаций.
  2. В свойствах справочника в расширении обязательно проверим наличие стандартного реквизита Владелец. Если его нет, его нужно добавить в расширение из основной конфигурации.
  3. В качестве типа владельца для справочника БанковскиеСчетаОрганизаций в расширении должен быть указан справочник Организации.
  4. Откроем форму элемента справочника СоглашенияСКлиентами в расширении.
  5. Найдем наше поле ввода и в палитре свойств перейдем к пункту Связи параметров выбора.
  6. Установим связь: в колонке «Параметр выбора» укажем Отбор.Владелец, а в колонке «Поле формы» — Объект.Организация.

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

Способ 2. Программная установка связей параметров выбора

Если по каким-то причинам визуальный редактор свойств в расширении не позволяет выбрать нужное поле, мы можем установить эту связь программно. Проанализируем, как это сделать в модуле формы. Оптимальным местом для этого является процедура ПриСозданииНаСервере.

Рассмотрим пример кода, который динамически устанавливает связь:


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

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

Способ 3. Обработка события «НачалоВыбора»

Иногда требуется более сложная логика, чем просто фильтрация по владельцу. В таких случаях мы используем перехват события НачалоВыбора и Автоподбор в управляемом приложении. Здесь мы можем применить различные варианты настройки отбора в форме выбора, полностью перехватить процесс открытия формы и передать в нее любые параметры. Посмотрим на реализацию этого метода:


&НаКлиенте
Процедура БанковскийСчетНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартное открытие
    
    ПараметрыВыбора = Новый Структура;
    
    // Формируем отбор по организации
    Отбор = Новый Структура("Владелец", Объект.Организация);
    ПараметрыВыбора.Вставить("Отбор", Отбор);
    
    // Можно добавить дополнительные параметры, например, выбор только активных счетов
    // Отбор.Вставить("Закрыт", Ложь);
    
    ОткрытьФорму("Справочник.БанковскиеСчетаОрганизаций.ФормаВыбора", ПараметрыВыбора, Элемент);
    
КонецПроцедуры

Этот способ дает максимальную гибкость. Например, если в организации не выбрана головная компания, мы можем программно запретить выбор счета или выдать предупреждение пользователю.

Способ 4. Обработка автоподбора

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

Разберем, как дополнить параметры автоподбора:


&НаКлиенте
Процедура БанковскийСчетАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
    
    // Указываем структуру отбора для автоподбора
    Параметры.Отбор.Вставить("Владелец", Объект.Организация);
    
КонецПроцедуры

Сохранение выбранного значения

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

Подведение итогов

Мы рассмотрели четыре способа, как ограничить выбор пользователя и предотвратить ошибки ввода в интерфейсе системы. Подведем итог: наиболее предпочтительным является Способ 1 (Связи параметров выбора), так как он работает максимально быстро и поддерживается платформой нативно. Однако при работе с расширениями критически важно следить за тем, чтобы все задействованные объекты и их связи были корректно добавлены в расширение. Если визуальная настройка недоступна, используйте Способ 2 для программной установки связи.

← На главную