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