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

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

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

Почему не работает программное открытие формы?

Когда вы переопределяете событие НачалоВыбора и устанавливаете параметр СтандартнаяОбработка = Ложь, вы берете на себя ответственность за весь процесс выбора. Вызывая ОткрытьФорму, вы создаете изолированное окно. В этот момент связь между выбранным в открытом окне элементом и исходным полем ввода разрывается, так как платформа не знает, куда именно нужно вернуть результат.

Посмотрим на пример кода, который часто приводит к ошибке:


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

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

Способ №1: Использование механизма «Параметры выбора» (Рекомендуемый)

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

  1. Откройте форму, в которой находится табличная часть.
  2. Перейдите к элементу формы (полю ввода), отвечающему за выбор сотрудника.
  3. Найдите свойство Параметры выбора.
  4. Добавьте новый параметр, например, Отбор.Подразделение.
  5. В качестве значения параметра укажите путь к данным — реквизиту Бригада.Подразделение (или другому источнику).

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

Способ №2: Программная настройка фильтрации

Если логика отбора слишком сложная и требует вычислений, которые невозможно описать через параметры выбора, следует использовать программную настройку связи параметров. Вы можете использовать метод Элементы.ИмяПоля.ПараметрыВыбора.Установить(...).

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


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

При таком подходе важно, чтобы при открытии формы вы передавали параметр ЗакрыватьПриВыборе = Истина, чтобы окно автоматически закрывалось после того, как пользователь кликнет по сотруднику.

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

Рассмотрев ситуацию, мы выяснили, что большинство проблем с выбором в 1С возникают из-за избыточного кода. Всегда отдавайте предпочтение стандартным механизмам платформы:

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

← На главную