При разработке управляемых форм в 1С:Предприятие 8 часто возникает задача фильтрации списка выбора. Типичный сценарий: пользователь должен выбрать сотрудника, принадлежащего определенной организации, выбранной в другом реквизите документа. Рассмотрим, почему попытка «перехватить» выбор через процедуру НачалоВыбора часто приводит к тому, что выбор значения перестает работать, и как сделать это правильно.
Когда вы переопределяете событие НачалоВыбора и устанавливаете параметр СтандартнаяОбработка = Ложь, вы берете на себя ответственность за весь процесс выбора. Вызывая ОткрытьФорму, вы создаете изолированное окно. В этот момент связь между выбранным в открытом окне элементом и исходным полем ввода разрывается, так как платформа не знает, куда именно нужно вернуть результат.
Посмотрим на пример кода, который часто приводит к ошибке:
&НаКлиенте
Процедура СоставБригадыСотрудникНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ЗначениеОтбора = Новый Структура("Подразделение", ПрочитатьЗначениеПодразделения());
ПараметрыВыбораОткрываемойФормы = Новый Структура("Отбор", ЗначениеОтбора);
ОткрытьФорму("Справочник.Сотрудники.ФормаВыбора", ПараметрыВыбораОткрываемойФормы, Элемент);
КонецПроцедуры
Здесь основной ошибкой является именно принудительное открытие формы без настройки механизмов обратной связи. Чтобы значение вернулось в поле, необходимо либо использовать ОповеститьОВыборе, либо, что гораздо эффективнее, вообще отказаться от программного вызова окна выбора.
Самый правильный и современный подход — декларативный. Вам не нужно писать код в процедуре НачалоВыбора. Платформа 1С позволяет задать параметры отбора прямо в конфигураторе:
Отбор.Подразделение.Бригада.Подразделение (или другому источнику).В этом случае СтандартнаяОбработка остается Истина, а система самостоятельно наложит фильтр на открываемую форму. Выбор будет работать штатно, возвращая значение в поле без каких-либо дополнительных усилий с вашей стороны.
Если логика отбора слишком сложная и требует вычислений, которые невозможно описать через параметры выбора, следует использовать программную настройку связи параметров. Вы можете использовать метод Элементы.ИмяПоля.ПараметрыВыбора.Установить(...).
Если же вы все-таки решили открыть форму вручную, помните о необходимости обработки выбора. Для этого используйте обработчик ОбработкаВыбора в основной форме:
&НаКлиенте
Процедура СоставБригадыСотрудникОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
// Здесь мы вручную присваиваем значение выбранного объекта в поле
Элемент.Значение = ВыбранноеЗначение;
КонецПроцедуры
При таком подходе важно, чтобы при открытии формы вы передавали параметр ЗакрыватьПриВыборе = Истина, чтобы окно автоматически закрывалось после того, как пользователь кликнет по сотруднику.
Рассмотрев ситуацию, мы выяснили, что большинство проблем с выбором в 1С возникают из-за избыточного кода. Всегда отдавайте предпочтение стандартным механизмам платформы:
Параметры выбора в свойствах элемента формы.Связи параметров выбора для динамической фильтрации.СтандартнаяОбработка = Ложь, если задачу можно решить через штатные настройки.Применяя эти советы, вы избавите себя от необходимости отлаживать взаимодействие между формами и обеспечите стабильную работу вашего приложения.