Как устранить ошибку БИТ_РаботаСДиалогами при открытии 1С:НСИ через веб-клиент

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

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

Проанализируем техническую причину ошибки

Суть проблемы кроется в строке кода, использующей метод Предупреждение(). Давайте рассмотрим фрагмент кода, на который указывает журнал регистрации:


// Фрагмент модуля БИТ_РаботаСДиалогами в строке 1070
Предупреждение(ТекстСообщения);

В современных конфигурациях 1С:Предприятие 8.3 по умолчанию установлен режим использования модальности «Не использовать». Это требование продиктовано развитием веб-технологий и политикой безопасности современных браузеров (Chrome, Firefox, Safari), которые блокируют или некорректно обрабатывают приостановку выполнения скриптов (модальность). Метод Предупреждение является классическим модальным методом: когда он вызывается, выполнение кода на сервере или клиенте полностью останавливается до тех пор, пока пользователь не нажмет кнопку «ОК».

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

Выясним, почему проблема возникает только у одного пользователя

Часто возникает вопрос: если код общий, почему ошибка «валит» систему только у определенного сотрудника? Рассмотрим основные причины этой избирательности:

  1. Уникальные настройки пользователя: У конкретного пользователя могут быть не заполнены обязательные реквизиты (например, «Подразделение» или «Основной склад»), либо истек срок действия пароля. При входе система проверяет эти данные и пытается вывести Предупреждение. У других пользователей проверка проходит успешно, и проблемный участок кода просто не вызывается.
  2. Настройки блокировки всплывающих окон: Веб-клиент 1С эмулирует диалоговые окна через механизмы браузера. Если в браузере пользователя установлены жесткие правила блокировки pop-up окон или работают агрессивные расширения-блокировщики рекламы, механизм отображения диалогов может давать сбой.
  3. Кэширование в браузере: Локальный кэш браузера может хранить старые описания форм или скриптов. В отличие от тонкого клиента, где очистка кэша делается через параметры запуска, в веб-клиенте необходимо очищать LocalStorage и IndexedDB конкретного браузера.

Разберем способы решения проблемы

Существует несколько подходов к исправлению этой ошибки, от быстрого «обходного пути» до правильной адаптации кода под требования платформы.

Вариант 1. Замена на немодальный вывод сообщений (Быстрое решение)

Как было предложено в ходе обсуждения, самым быстрым способом является замена блокирующего вызова на простой вывод сообщения пользователю. Это позволит системе не прерывать выполнение кода и продолжить работу. Проанализируем пример изменения кода:

Было:

БИТ_РаботаСДиалогами(1070): Предупреждение(ТекстСообщения);

Стало (с использованием БСП):

ОбщегоНазначения.СообщитьИнформациюПользователю(ТекстСообщения);

В этом случае вместо всплывающего окна пользователь увидит сообщение в нижней части экрана (панель сообщений). Это безопасно для веб-клиента, так как метод Сообщить не останавливает поток исполнения кода.

Вариант 2. Использование метода ПоказатьПредупреждение (Правильное решение)

Если нам важно, чтобы пользователь обязательно увидел диалоговое окно и нажал кнопку, мы должны использовать асинхронный метод ПоказатьПредупреждение. Давайте посмотрим на пример реализации:


// Описываем оповещение, которое сработает после закрытия окна
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияПредупреждения", ЭтотОбъект);

// Вызываем немодальное окно
ПоказатьПредупреждение(Оповещение, ТекстСообщения);

// Процедура-обработчик
&НаКлиенте
Процедура ПослеЗакрытияПредупреждения(ДополнительныеПараметры) Экспорт
    // Здесь продолжается логика, которая должна была идти после Предупреждение()
КонецПроцедуры

Такой подход полностью соответствует стандартам разработки 1С для управляемых форм и будет стабильно работать в любом браузере.

Рекомендации по диагностике для системных администраторов

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

Важный момент: Если вы решили заменить код в общем модуле, помните, что БИТ_РаботаСДиалогами является частью тиражного решения. При следующем обновлении конфигурации ваши изменения могут быть затерты. Рекомендуется использовать механизм Расширений конфигурации для переопределения этого метода, чтобы сохранить поддержку основной базы.

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

← На главную