Как реализовать немодальный ввод строки в веб-клиенте 1С при режиме совместимости 8.2.13

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

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

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

Вариант 1. Повышение или отключение режима совместимости конфигурации

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

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

  1. В дереве метаданных откроем свойства корневого элемента конфигурации.
  2. Установим свойство Режим совместимости в значение Не использовать или выберем версию не ниже Версия 8.3.3.
  3. Настроим свойство Режим использования модальности в значение Использовать с предупреждениями или Не использовать.
  4. Заменим устаревший вызов ВвестиСтроку на асинхронную процедуру ПоказатьВводСтроки с использованием объекта ОписаниеОповещения.

Посмотрим на пример реализации асинхронного ввода строки:


&НаКлиенте
Процедура ЗапроситьСтрокуУПользователя()
    Оповещение = Новый ОписаниеОповещения("ЗавершениеВводаСтроки", ЭтотОбъект);
    ПоказатьВводСтроки(Оповещение, "", "Введите значение:");
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеВводаСтроки(ВведеннаяСтрока, ДополнительныеПараметры) Экспорт
    Если ВведеннаяСтрока <> Неопределено Тогда
        // Обработка полученной строки
    КонецЕсли;
КонецПроцедуры

Вариант 2. Создание собственной формы ввода через механизм выбора

Если в силу проектных ограничений снять режим совместимости 8.2.13 невозможно, разработаем универсальную вспомогательную форму ввода (например, в составе служебной обработки). В управляемом интерфейсе передачу данных из дочернего окна в вызывающее окно организуем без использования модальности.

Рассмотрим подробнее реализацию через владельца формы и оповещение о выборе:

  1. Создадим общую форму или форму обработки с реквизитом ВведенныйТекст (тип Строка) и кнопками «ОК» и «Отмена».
  2. В свойствах созданной формы установим РежимОткрытияОкна в значение БлокироватьОкноВладельца, чтобы пользователь не мог переключиться на исходное окно до завершения ввода.
  3. В модуле формы ввода на событие нажатия кнопки «ОК» пропишем вызов оповещения о выборе:

&НаКлиенте
Процедура КомандаОК(Команда)
    ОповеститьОВыборе(ВведенныйТекст);
КонецПроцедуры

В вызывающей форме откроем созданный диалог с указанием владельца и перехватим результат:


&НаКлиенте
Процедура НачатьВводСтроки(Команда)
    ПараметрыФормы = Новый Структура("ЗакрыватьПриВыборе", Истина);
    ОткрытьФорму("Обработка.ВводСтроки.Форма.Форма", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры

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

Вариант 3. Передача введенного значения через глобальные оповещения

Выясним еще один способ взаимодействия между окнами при немодальном режиме — использование механизма глобальных оповещений открытых форм. Данный вариант удобен, если форма ввода открывается независимо от конкретного владельца.

Разберем по шагам логику отправки и перехвата события:

  1. В форме ввода строки по кнопке подтверждения отправляем системное оповещение:

&НаКлиенте
Процедура КомандаПодтвердить(Команда)
    Оповестить("ВведенаСтрокаПользователем", ВведенныйТекст, ЭтаФорма);
    Закрыть();
КонецПроцедуры
  1. В исходной форме открываем диалог обычной командой ОткрытьФорму("Обработка.ВводСтроки.Форма.Форма");.
  2. В этой же вызывающей форме переопределяем стандартный обработчик события ОбработкаОповещения:

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ВведенаСтрокаПользователем" Тогда
        ПолученныйТекст = Параметр;
    КонецЕсли;
КонецПроцедуры

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

← На главную