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