Как открыть форму при начале работы в веб-клиенте 1С и чем это отличается от веб-сервиса?

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

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

Анализ ситуации: Веб-сервис или Веб-клиент?

Прежде всего, проанализируем терминологию, так как в обсуждении часто возникает путаница. Если мы говорим о веб-сервисе (SOAP или HTTP), то в нем в принципе невозможно открыть форму. Веб-сервис — это программный интерфейс для обмена данными между системами. У него нет визуального интерфейса. Вызов метода веб-сервиса — это короткий сеанс на сервере: получили данные, обработали, вернули ответ.

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

Разбор ошибки: ПередНачаломРаботыСистемы или ПриНачалеРаботыСистемы?

Рассмотрим типичный код, который часто пытаются использовать программисты в МодулеУправляемогоПриложения:


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

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

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

Пошаговое решение для реализации формы регистрации

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

  1. Откройте Модуль управляемого приложения.
  2. Найдите или создайте процедуру ПриНачалеРаботыСистемы.
  3. Добавьте проверку условий, при которых должна открываться форма.
  4. Используйте метод ОткрытьФорму.

Посмотрим на пример правильной реализации:


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

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

Инициализация данных: Параметры сеанса и Модуль сеанса

Часто открытие формы регистрации — это лишь следствие того, что какие-то данные о пользователе не заполнены. Проанализируем, где лучше всего проверять необходимость открытия формы. Для этого идеально подходит Модуль сеанса и событие УстановкаПараметровСеанса.

Почему это важно? Событие УстановкаПараметровСеанса срабатывает всегда: и для веб-клиента, и для веб-сервисов, и для обычных сеансов. Здесь мы можем вычислить статус пользователя на стороне сервера и записать его в ПараметрыСеанса. А уже в интерфейсном модуле (ПриНачалеРаботыСистемы) мы просто прочитаем готовый флаг.

Пример в модуле сеанса:


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    // Допустим, у нас есть параметр сеанса "НужнаРегистрация" (Булево)
    ТекущийПользователь = Пользователи.ТекущийПользователь();
    ПараметрыСеанса.НужнаРегистрация = ТекущийПользователь.ТребуетЗаполненияДанных;
КонецПроцедуры

Затем в модуле управляемого приложения:


Процедура ПриНачалеРаботыСистемы()
    Если ПараметрыСеанса.НужнаРегистрация Тогда
        ОткрытьФорму("ОбщаяФорма.ФормаРегистрации");
    КонецЕсли;
КонецПроцедуры

Особенности безопасности при публикации базы в вебе

Разберем ситуацию, упомянутую в обсуждении: насколько безопасно выставлять базу 1С "наружу" через веб-сервер. Когда вы публикуете информационную базу для доступа через веб-клиент, вы фактически открываете точку входа в вашу корпоративную систему из глобальной сети.

Основные рекомендации по безопасности:

Резюме

Подведем итоги. Если ваша цель — интерактивная форма в браузере, забудьте про термин "веб-сервис" в данном контексте, вам нужен веб-клиент. Для открытия формы используйте исключительно событие ПриНачалеРаботыСистемы, так как более ранние события не позволяют работать с интерфейсными окнами. Для оптимизации работы и поддержки веб-сервисов (если они появятся в будущем) выносите логику проверки состояния пользователя в Модуль сеанса. Такой подход обеспечит стабильную работу системы как в тонком клиенте, так и в любом современном браузере.

← На главную