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