Как получить значение из программно открываемой формы выбора в 1С 8.3?

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

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

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

Почему не работает прямое присваивание из ОткрытьФорму

Проанализируем архитектурные особенности управляемого интерфейса:

  1. Асинхронность клиентского кода: метод ОткрытьФорму не останавливает выполнение дальнейших инструкций модуля. Платформа сразу переходит к следующей строке кода, пока диалоговое окно только инициализируется на клиенте.
  2. Отказ от модальности: использование устаревших модальных методов (например, ОткрытьФормуМодально) заблокировано в современных типовых конфигурациях при установленном свойстве конфигурации РежимИспользованияМодальности = НеИспользовать и не поддерживается в веб-клиенте.
  3. Устаревший метод ПолучитьФорму: вызов ПолучитьФорму на клиенте в управляемом приложении не рекомендуется стандартами разработки фирмы «1С».

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

Способ 1. Использование формы-владельца и события ОбработкаВыбора

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

Посмотрим на пример открытия формы выбора по нажатию команды:


&НаКлиенте
Процедура КомандаВыбратьКомиссию(Команда)
    
    ПараметрыВыбора = Новый Структура;
    ПараметрыВыбора.Вставить("РежимВыбора", Истина);
    ПараметрыВыбора.Вставить("ЗакрыватьПриВыборе", Истина);
    
    // В 3-й параметр передаем форму-владелец: ЭтотОбъект
    ОткрытьФорму("Справочник.Комиссии.ФормаВыбора", ПараметрыВыбора, ЭтотОбъект);
    
КонецПроцедуры

Теперь опишем в модуле вызывающей формы обработчик события, куда платформа вернет выбранные пользователем данные:


&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, Источник)
    
    // Проверяем тип или источник, если в форме возможно несколько разных вариантов выбора
    Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Комиссии") Тогда
        
        // Обрабатываем полученное значение и записываем в текущую строку табличной части
        ТекущиеДанные = Элементы.ТабличнаяЧастьСостав.ТекущиеДанные;
        Если ТекущиеДанные <> Неопределено Тогда
            ТекущиеДанные.Комиссия = ВыбранноеЗначение;
        Иначе
            НоваяСтрока = Объект.ТабличнаяЧастьСостав.Добавить();
            НоваяСтрока.Комиссия = ВыбранноеЗначение;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Использование механизма асинхронных оповещений (ОписаниеОповещения)

Рассмотрим современный и наиболее гибкий способ. Он позволяет не перегружать стандартную процедуру ОбработкаВыбора проверками источников, а направлять результат конкретного диалога в отдельную процедуру-обработчик с помощью объекта ОписаниеОповещения.

Разберем по шагам реализацию данного подхода:

  1. Создаем объект ОписаниеОповещения, указывая имя экспортной процедуры-обработчика и контекст формы.
  2. Передаем созданное оповещение в параметр ОповещениеОЗакрытии (7-й параметр функции ОткрытьФорму).
  3. В созданной процедуре принимаем и обрабатываем результат выбора.

Посмотрим на программный код вызова:


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

Опишем процедуру, которая выполнится в момент подтверждения выбора или закрытия формы:


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

Полезные параметры для управления формой выбора

При передаче структуры ПараметрыФормы в функцию ОткрытьФорму можно гибко управлять поведением открываемого окна выбора:

  1. РежимВыбора: значение Истина принудительно переводит форму списка в режим выбора значения.
  2. МножественныйВыбор: при значении Истина пользователь сможет выбрать сразу несколько элементов (в обработчик вернется массив ссылок).
  3. ЗакрыватьПриВыборе: управляет тем, закрывается ли окно после нажатия кнопки «Выбрать».
  4. ТекущаяСтрока: позволяет передать ссылку на объект, на который курсор в списке выбора должен спозиционироваться сразу при открытии.
  5. Отбор: структура с фильтрами, которые автоматически накладываются на динамический список формы выбора.

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

← На главную