Почему в веб-клиенте не определена переменная ПараметрыСеанса и как это исправить

Программист
← На главную

При разработке или адаптации конфигураций (особенно таких как УТ 10.3) для работы в веб-клиенте программисты часто сталкиваются с ошибкой «Переменная не определена (ПараметрыСеанса)». Эта ситуация возникает при попытке обращения к глобальному контексту сервера напрямую из модуля управляемого приложения или модулей управляемых форм. В этой статье мы подробно разберем причины возникновения данной ошибки, проанализируем архитектурные особенности работы веб-клиента и выработаем надежное решение задачи.

Причина возникновения ошибки: разделение контекстов

Для начала выясним причину, по которой привычный код перестает работать. В системе 1С:Предприятие 8 реализовано строгое разделение на клиентскую и серверную части. ПараметрыСеанса — это системный набор значений, который физически хранится и управляется исключительно на стороне сервера.

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

Шаг 1. Создание серверного моста через общий модуль

Чтобы получить данные из параметров сеанса в веб-клиенте, нам необходимо организовать обращение к серверу. Разберем по шагам, как это реализовать правильно. Самый корректный способ — создать специальный общий модуль, который будет выступать посредником.

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

Проанализируем пример кода для этого модуля:


Функция ПолучитьТекущегоПользователяСеанса() Экспорт
    // Этот код выполняется на сервере, где объект ПараметрыСеанса доступен напрямую
    Возврат ПараметрыСеанса.ТекущийПользователь;
КонецФункции

Шаг 2. Вызов серверной функции из клиентского модуля

Теперь вернемся в Модуль управляемого приложения, где изначально возникла ошибка. Теперь, вместо прямого обращения к параметрам сеанса, мы будем вызывать нашу новую функцию. Рассмотрим, как изменится код:


Процедура ПриНачалеРаботыСистемы()
    // Вместо: Пользователь = ПараметрыСеанса.ТекущийПользователь;
    // Пишем обращение через общий модуль:
    ТекущийПользователь = ОбщегоНазначенияСервер.ПолучитьТекущегоПользователяСеанса();
    
    Если ЗначениеЗаполнено(ТекущийПользователь) Тогда
        Сообщить("Добро пожаловать, " + СокрЛП(ТекущийПользователь));
    КонецЕсли;
КонецПроцедуры

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

Оптимизация: использование кэширования на клиенте

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

В начале Модуля управляемого приложения объявим переменную:

Перем глТекущийПользователь Экспорт;

Затем инициализируем её при запуске:


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

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

Особенности инициализации (Модуль сеанса)

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

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


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    // Если система запрашивает инициализацию конкретного параметра
    Если ПараметрыСеанса.ТекущийПользователь = Неопределено Тогда
         // Логика поиска пользователя в справочнике по имени пользователя ОС или 1С
         ТекущийВнешнийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
         НайденныйПользователь = Справочники.Пользователи.НайтиПоНаименованию(ТекущийВнешнийПользователь.ПолноеИмя);
         
         ПараметрыСеанса.ТекущийПользователь = НайденныйПользователь;
    КонецЕсли;
КонецПроцедуры

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

Нюансы работы с УТ 10.3 в веб-клиенте

Конфигурация "Управление торговлей 10.3" изначально создавалась для обычных форм (Толстого клиента). При её публикации как веб-базы вы используете режим совместимости или частично переходите на управляемые формы. В обычном приложении код часто писался без учета разделения контекста, так как Толстый клиент имел доступ к ПараметрыСеанса почти везде.

Важный совет: Если вы адаптируете УТ 10.3, проверьте, не используются ли ПараметрыСеанса в общих модулях, у которых стоят флажки Клиент (обычное приложение). Для веб-клиента эти модули и этот код будут недоступны или будут вызывать ошибки. Всегда выносите логику получения параметров сеанса в модули с флагом Сервер.

Итоги

Подводя итог, кратко резюмируем алгоритм действий при возникновении ошибки "Переменная не определена (ПараметрыСеанса)":

Соблюдение этих правил архитектуры 1С позволит вашему приложению стабильно работать в любом браузере без досадных ошибок обращения к контексту.

← На главную