Часто программисты 1С сталкиваются с ситуацией, когда код, исправно функционирующий в тонком клиенте, отказывается работать при запуске приложения через браузер. Рассмотрим подробнее одну из таких проблем: переопределенный обработчик ПередНачаломРаботыСистемы игнорируется в веб-клиенте, из-за чего не удается применить метод УстановитьРежимОсновногоОкна для задания нужного вида интерфейса (например, скрыть панели или открыть рабочее место).
Проанализируем ситуацию по шагам: выясним, почему отладчик не останавливается в нужной процедуре, как назначение расширения конфигурации влияет на инициализацию приложения и какие ограничения накладывают сами веб-браузеры на перерисовку окон.
Для начала давайте посмотрим на правила использования функции, которая задает вид главного окна приложения. Метод УстановитьРежимОсновногоОкна (на английском SetMainWindowMode) имеет жесткое ограничение: он может быть вызван только внутри обработчика события ПередНачаломРаботыСистемы модуля управляемого приложения.
Если мы попытаемся перенести этот код, например, в ПриНачалеРаботыСистемы, платформа выдаст ошибку или проигнорирует команду. Почему разработчики 1С сделали именно так? Логика заключается в том, что режим главного окна (отображение панелей разделов, навигации, командного интерфейса) определяется самой сутью сеанса пользователя. Платформа должна получить эти настройки до того, как начнет формировать и отрисовывать каркас интерфейса. Когда срабатывает ПриНачалеРаботыСистемы, главное окно уже инициализировано, и менять его каркас поздно.
Пример корректного вызова в модуле приложения:
Процедура ПередНачаломРаботыСистемы(Отказ)
// Устанавливаем режим основного окна без лишних панелей
КлиентскоеПриложение.УстановитьРежимОсновногоОкна(РежимОсновногоОкнаКлиентскогоПриложения.РабочееМесто);
КонецПроцедуры
При работе в веб-клиенте нужно учитывать не только архитектуру 1С, но и политики безопасности современных браузеров (Chrome, Firefox, Safari и др.). Браузеры запрещают программному коду радикально менять отображение экрана или перехватывать управление без прямого действия со стороны пользователя.
Например, если вы хотите установить режим ПолноэкранноеРабочееМесто, веб-клиент 1С не сможет автоматически развернуть окно на весь экран сразу при старте. Сначала пользователю будет показано промежуточное диалоговое окно с предупреждением, и только после ручного клика пользователя произойдет переход в полноэкранный режим. В тонком клиенте таких строгих ограничений безопасности нет, поэтому там интерфейс перестраивается мгновенно и без дополнительных вопросов.
Если с синтаксисом все верно, но отладчик все равно не останавливается в процедуре ПередНачаломРаботыСистемы при запуске веб-клиента, перейдем к механизму расширений. Как показывает практика, проблема кроется в назначении расширения, в котором вы переопределяете данный обработчик.
Механизм 1С всегда применяет расширения к информационной базе в строгой очередности:
Методом научного перебора было установлено: если переопределение процедуры ПередНачаломРаботыСистемы находится в расширении с назначением Адаптация, вызов в веб-клиенте может просто не произойти. При этом в тонком клиенте этот же код отрабатывает без нареканий.
Как решить проблему: перенесите код переопределения модуля приложения в расширение с назначением Исправление. За счет высшего приоритета платформа успеет корректно применить измененный код на самом раннем этапе инициализации старта веб-клиента, и обработчик сработает.
Стоит отметить, что подобное странное поведение — это известный баг конкретных версий платформы 1С. В частности, ошибка ярко проявляется на платформе версии 8.3.22.1704. В этой ветке наблюдались нестабильности при чтении платформой кэша расширений непосредственно в браузере. Самые ранние события приложения игнорировались, если находились на уровнях «Адаптации» или «Дополнения».
Если вы столкнулись с подобной проблемой, у вас есть два пути решения:
Исправление (как описано выше). Это быстрый обходной маневр, который заставит код работать "здесь и сейчас".Таким образом, мы детально разобрали, почему могут возникать сложности с переопределением стартовых процедур через расширения в веб-клиенте, и нашли практические способы обхода этой ошибки платформы.