Проблема с отображением интерфейса в веб-клиенте 1С: как победить пустой экран при запуске

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

Разработка и поддержка решений на управляемых формах для веб-клиента 1С:Предприятие часто преподносит неприятные сюрпризы. Одним из наиболее коварных поведений является феномен «исчезновения» или «зависания» интерфейса, когда при повторном запуске информационной базы через веб-клиент (чаще всего в браузере Google Chrome) основное окно программы открывается, но рабочая область остается пустой. При этом стоит пользователю слегка изменить размеры окна браузера (сделать resize), как интерфейс мгновенно перерисовывается и принимает надлежащий вид. В этой статье мы подробно разберем причины этой проблемы и рассмотрим практические способы ее устранения на стороне конфигурации 1С.

Выясняем техническую причину сбоя

Для начала проанализируем ситуацию и поймем, почему такое поведение характерно преимущественно для браузеров на движке Chromium (Google Chrome, Яндекс.Браузер, Opera последних версий) и не проявляется, например, в Mozilla Firefox.

Когда пользователь осуществляет первый («холодный») запуск базы в веб-клиенте, браузер последовательно загружает все необходимые ресурсы: файлы стилей, скрипты платформы, разметку. В этот момент выполнение скриптов генерации интерфейса 1С происходит синхронно с постепенным формированием объектной модели документа (DOM) и дерева стилей (CSSOM).

При повторном («горячем») запуске картина кардинально меняется. Большинство тяжелых статических файлов веб-клиента мгновенно извлекаются из локального кэша браузера. JS-код платформы 1С начинает генерировать элементы интерфейса формы с огромной скоростью. Из-за асинхронной природы движка рендеринга Blink (Chromium) возникает так называемое состояние гонки (race condition). Код 1С пытается инициализировать и отобразить элементы формы внутри контейнеров, размеры которых сам браузер еще не успел до конца просчитать.

В результате этого геометрическая высота и ширина контейнера формы (тегов div или iframe) ошибочно вычисляются браузером как 0px. Элементы интерфейса физически создаются на странице, они присутствуют в HTML-коде (что подтверждается анализом страницы через панель разработчика F12), но из-за нулевых размеров остаются невидимыми для пользователя. Как только пользователь изменяет размер окна браузера даже на один пиксель, движок Chromium получает системное прерывание и принудительно запускает механизмы Reflow (перерасчет геометрического положения) и Repaint (перерисовка элементов). В этот момент браузер корректно пересчитывает размеры всех блоков от родительского к дочерним, и форма мгновенно отображается.

Посмотрим, какими методами в среде 1С мы можем гарантированно устранить эту проблему, не заставляя пользователей вручную растягивать окна браузеров.

Способ 1. Использование рабочей области начальной страницы (рекомендуемый метод)

Если пустая область возникает при открытии формы, которая вызывается программно через метод ОткрытьФорму() в обработчике события ПриНачалеРаботыСистемы(), то самым правильным и архитектурно верным решением будет отказ от программного открытия в пользу стандартных механизмов платформы.

Разберем по шагам, как настроить отображение формы на начальной странице:

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

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

Способ 2. Отложенный запуск через обработчик ожидания

Если бизнес-логика системы требует динамического программного открытия формы именно в процессе инициализации сессии, и перенести форму на начальную страницу невозможно, мы можем прибегнуть к искусственной задержке. Это позволит браузеру гарантированно завершить построение основного интерфейса до того, как система начнет отрисовывать форму.

Для реализации этого метода модернизируем код в модуле управляемого приложения. Вместо прямого вызова открытия формы мы подключим однократный обработчик ожидания:


&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    
    // Подключаем однократный обработчик ожидания с задержкой 0.5 секунды
    ПодключитьОбработчикОжидания("Подключаемый_ОткрытьФормуСЗадержкой", 0.5, Истина);
    
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОткрытьФормуСЗадержкой() Экспорт
    
    // Данный код выполнится, когда браузер уже построит каркас интерфейса
    ПараметрыФормы = Новый Структура;
    ОткрытьФорму("Справочник.Заявки.ФормаСписка", ПараметрыФормы);
    
КонецПроцедуры

Важный нюанс: задержка в 0.1 или 0.2 секунды, которая часто рекомендуется на форумах, в условиях медленного соединения или слабой аппаратной части клиента может оказаться недостаточной. Оптимальным временем задержки, исключающим визуальное раздражение пользователя и дающим браузеру достаточный задел времени, является интервал от 0.5 до 1.0 секунды.

Способ 3. Принудительное обновление отображения данных управляемой формы

Если форма открывается, но элементы внутри нее (например, динамический список или таблицы) остаются невидимыми до клика мышкой, мы можем программно инициировать перерисовку интерфейса со стороны встроенного языка 1С. Для этого используется специализированный метод платформы ОбновитьОтображениеДанных().

Проанализируем пример использования данного метода. Разместим вызов в модуле самой открываемой формы в обработчике события ПриОткрытии:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Выполняем стандартные действия при открытии формы
    // ...
    
    // Принудительно заставляем движок веб-клиента обновить рендеринг формы
    ОбновитьОтображениеДанных();
    
КонецПроцедуры

Метод ОбновитьОтображениеДанных() отправляет веб-браузеру команду об изменении состояния элементов управления. Это стимулирует выполнение внутренних JS-скриптов платформы, отвечающих за подгонку размеров таблиц под размеры родительских форм, что во многих случаях решает проблему «белого экрана» внутри закладок.

Способ 4. Программная активизация элементов формы

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

В модуле открываемой формы напишем следующий код:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Активизируем форму в пространстве интерфейса
    Активизировать();
    
    // Если на форме есть основная таблица списка, передаем фокус на нее
    Элементы.Список.Активизировать();
    
КонецПроцедуры

Альтернативные решения на стороне клиента

В случаях, когда у разработчика нет возможности оперативно внести изменения в код конфигурации (например, база находится на поддержке без возможности изменения), решить проблему можно локальной настройкой клиентского окружения:

Подводя итог, отметим, что веб-клиент 1С — это сложная экосистема, которая сильно зависит от версий и настроек веб-браузеров. Использование штатных механизмов размещения форм (через начальную страницу) и аккуратная работа с отложенными обработчиками ожидания позволяют создавать стабильный интерфейс, который будет предсказуемо работать на любых клиентских устройствах.

← На главную