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