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