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