Почему при программном открытии формы выбора значение не возвращается в поле управляемой формы 1С?

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

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

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

Анализ причин проблемы

Когда мы программно открываем форму выбора через метод ОткрытьФорму, платформа должна точно знать, кому именно передать результат выбора. Если этот параметр опущен или указан некорректно, форма открывается в автономном режиме, и результат выбора уходит «в никуда».

Проанализируем основные причины, приводящие к потере выбранного значения:

  1. Не указан или неверно указан владелец открываемой формы: третий параметр метода ОткрытьФорму определяет приемник результата выбора. Если он не заполнен, платформа просто закрывает форму выбора без передачи данных.
  2. Не сброшена стандартная обработка: если в обработчике события НачалоВыбора не установить СтандартнаяОбработка = Ложь, платформа попытается открыть стандартное окно выбора параллельно с программным кодом.
  3. Элемент формы не связан с реквизитом: если в поле формы не заполнено свойство ПутьКДанным, платформе некуда автоматически записать результат.
  4. Несоответствие типов данных: тип реквизита формы должен строго совпадать с типом возвращаемого значения (например, СправочникСсылка.ХарактеристикиНоменклатуры).

Способ 1. Указание элемента формы в качестве владельца

Самый простой программный способ вернуть значение непосредственно в элемент управления — передать сам элемент в качестве третьего параметра метода ОткрытьФорму. Рассмотрим пример обработчика события НачалоВыбора:


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

Разберем по шагам, как работает этот механизм:

  1. Мы отключаем стандартное поведение установкой СтандартнаяОбработка = Ложь, чтобы избежать открытия дублирующей формы.
  2. Формируем структуру параметров с ключом Отбор, где указываем фильтрацию по стандартному реквизиту Владелец.
  3. Передаем переменную Элемент (элемент формы, для которого вызвано событие) в третий параметр метода ОткрытьФорму.

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

Важный нюанс: если в качестве владельца формы указать не Элемент, а ЭтаФорма, то значение не будет помещено в поле автоматически. Вместо этого управление передастся в обработчик всей формы ОбработкаВыбора, где разработчику потребуется вручную обработать полученный результат.

Способ 2. Использование асинхронного механизма через ОписаниеОповещения

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

Посмотрим на пример реализации:


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

&НаКлиенте
Процедура ПослеВыбораХарактеристики(РезультатВыбора, ДополнительныеПараметры) Экспорт
    Если ЗначениеЗаполнено(РезультатВыбора) Тогда
        Объект.ОтборХарактеристик = РезультатВыбора;
    КонецЕсли;
КонецПроцедуры

В данном сценарии при выборе элемента в открытой форме автоматически вызывается экспортная процедура ПослеВыбораХарактеристики, в которую передается выбранная ссылка. Мы явно присваиваем полученное значение нужному реквизиту объекта.

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

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

Разберем настройку по шагам:

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

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

Способ 4. Динамическая установка свойства ПараметрыВыбора

Если связь параметров выбора нельзя настроить жестко в конфигураторе (например, при сложной логике определения владельца), можно установить параметры выбора программно в событии ПриИзменении поля номенклатуры:


&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
    МассивПараметров = Новый Массив;
    МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.Владелец", Объект.Номенклатура));
    
    Элементы.ОтборХарактеристик.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
КонецПроцедуры

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

← На главную