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