К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как получить параметры сеанса на клиенте в 1С

Как получить параметры сеанса на клиенте в 1С: вызов серверных функций, кеширование, модуль сеанса, типовые ошибки и безопасные приёмы работы.

Параметры сеанса в 1С хранятся на сервере и недоступны напрямую из клиентского кода — попытка обратиться к ПараметрыСеанса в клиентском модуле приведёт к ошибке компиляции. Поэтому задача «получить параметры сеанса на клиенте» всегда решается через промежуточный слой: серверную функцию в общем модуле, которая читает значение и возвращает его клиенту.

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

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

Почему параметры сеанса недоступны на клиенте напрямую

Менеджер ПараметрыСеанса входит в состав серверного контекста прикладного решения. Значения параметров устанавливаются в модуле сеанса при старте и живут на стороне сервера в течение всего сеанса пользователя. Клиентское приложение — тонкий, толстый или веб-клиент — физически выполняется в другом процессе (а в клиент-серверном варианте — на другой машине), поэтому прямого доступа к этой памяти у него нет.

Директивы компиляции &НаКлиенте и &НаСервере жёстко разделяют доступные объекты. Если разместить обращение ПараметрыСеанса.ИмяПараметра в клиентской процедуре, конфигуратор сообщит об ошибке ещё на этапе проверки модуля — код просто не скомпилируется. Это защита, а не ограничение, которое можно обойти настройкой.

Из этого следует главный принцип: любое чтение параметра сеанса для клиента — это серверный вызов. А серверный вызов стоит ресурсов: сетевой обмен, сериализация данных, нагрузка на сервер. Поэтому архитектура решения должна минимизировать количество таких обращений.

Базовый способ: серверная функция в общем модуле

Самый простой и универсальный приём — создать общий модуль с флагом «Сервер» (и, при необходимости, «Вызов сервера») и разместить в нём функцию-обёртку. Флаги «Клиент (обычное приложение)» и «Клиент (управляемое приложение)» для такого модуля устанавливать не нужно.

Пример реализации. В общем модуле РаботаССеансом:

Функция ТекущийПользователь() Экспорт

Возврат ПараметрыСеанса.ТекущийПользователь;

КонецФункции

Вызов из клиентского кода формы:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Пользователь = РаботаССеансомВызовСервера.ТекущийПользователь();

Элементы.НадписьПользователь.Заголовок = Строка(Пользователь);

КонецПроцедуры

Обратите внимание на важное требование: чтобы общий серверный модуль был виден из клиентского кода, у него должен стоять флаг «Вызов сервера». Без него модуль компилируется только внутри серверного контекста, и обращение с клиента вызовет ошибку «Процедура или функция с указанным именем не определена».

Порядок действий для базового способа
  1. 1
    Создайте общий модуль, включите флаги «Сервер» и «Вызов сервера»
  2. 2
    Добавьте экспортную функцию, возвращающую нужный параметр сеанса
  3. 3
    В клиентском коде вызовите функцию и сохраните результат в переменную
  4. 4
    Проверьте работу под пользователем с ограниченными правами
  5. 5
    Убедитесь, что параметр реально установлен в модуле сеанса до момента вызова

Оптимизация: повторное использование возвращаемых значений

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

Для модуля с этим свойством, установленным в значение «На время сеанса», результат функции вычисляется один раз и затем берётся из кеша. Важный нюанс: такой модуль должен быть доступен и на клиенте, и на сервере — ставятся флаги «Сервер», «Клиент (управляемое приложение)», при необходимости другие клиентские флаги. Внутри функций используется конструкция:

Функция ТекущийПользователь() Экспорт

#Если Сервер Тогда

Возврат ПараметрыСеанса.ТекущийПользователь;

#Иначе

ВызватьИсключение "Вызов возможен только на сервере";

#КонецЕсли

КонецФункции

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

Альтернативы: параметры формы, настройки и глобальный контекст

Не всегда нужен именно вызов сервера. В ряде случаев задачу решают другие механизмы, и выбор зависит от того, когда и где значение требуется.

Если параметр нужен конкретной форме, его можно передать через структуру параметров при открытии: вызывающий код один раз получает значение на сервере (например, в модуле менеджера объекта) и передаёт в ОткрытьФорму. Форма читает его из Параметры в обработчике ПриСозданииНаСервере и сохраняет в реквизит формы — дальше клиент работает с локальной копией.

Для данных, которые должны сохраняться между сеансами (последние выбранные значения, настройки интерфейса), параметры сеанса вообще не подходят — они сбрасываются при завершении сеанса. Здесь правильное место хранения — ХранилищеОбщихНастроек или регистры сведений с пользовательскими настройками.

Способы доставки значения на клиент

Серверная функция в общем модуле

Универсально и просто; минус — серверный вызов при каждом обращении

Модуль с повторным использованием значений

Оптимально для частых обращений к неизменным данным; требует контроля актуальности кеша

Передача через параметры формы

Подходит, когда значение нужно одной форме; не работает для глобального доступа из любого места

Хранилище общих настроек

Для данных, переживающих сеанс; не заменяет параметры сеанса для служебных служебных признаков текущей сессии

Проверка результата и отладка

После внедрения механизма убедитесь, что значение действительно доходит до клиента и соответствует ожиданиям. Самая частая ситуация «не работает» — параметр сеанса не установлен: обработчик УстановкаПараметровСеанса либо не заполнил его, либо завершился с исключением до нужной строки.

Проверьте значение на сервере через отладчик: поставьте точку останова в серверной функции и посмотрите ПараметрыСеанса.ИмяПараметра в табло. Пустое значение ссылочного типа или Неопределено указывают на проблему в модуле сеанса. Полезно также временно вывести значение через Сообщить на сервере — сообщение дойдёт до клиента.

Дополнительная проверка — запуск под другим пользователем. Параметры сеанса часто зависят от ролей и настроек пользователя, и под администратором всё может выглядеть корректно, тогда как у рядового пользователя параметр пуст или отличается.

Контрольные точки

Как проверить результат

Значение на клиенте
Норма

Совпадает со значением в отладчике на сервере

Тревожный признак

Неопределено или пустая ссылка — параметр не установлен в модуле сеанса

Количество серверных вызовов
Норма

Один вызов при использовании повторного использования значений

Тревожный признак

Вызов при каждом обращении — кеш не работает или не настроен

Поведение под обычным пользователем
Норма

Значение корректно для всех ролей

Тревожный признак

Работает только под администратором — ошибка в логике установки параметра

Типичные ошибки и ограничения

Первая ошибка — попытка обратиться к ПараметрыСеанса из клиентского модуля. Даже если код написан в форме без явной директивы, в управляемом приложении контекст по умолчанию клиентский, и компиляция завершится ошибкой. Решение — только серверная обёртка.

Вторая ошибка — забытый флаг «Вызов сервера» у общего модуля. Модуль компилируется, серверный код его видит, а клиент получает «метод не определён». Третья частая проблема — передача несериализуемых типов: если серверная функция возвращает объект, который нельзя передать между сервером и клиентом (например, Запрос или СOMОбъект), вызов упадёт с ошибкой сериализации. Возвращайте простые типы, ссылки, структуры и массивы из допустимых значений.

Отдельно стоит упомянуть безопасность: не возвращайте на клиент служебные параметры, которые пользователь не должен видеть или подделывать. Всё, что попало на клиент, теоретически доступно для чтения и подмены, поэтому критичные проверки прав всегда дублируйте на сервере.

Типичные ошибки
01
Обращение к ПараметрыСеанса в клиентском коде — ошибка компиляции модуля
02
Отсутствие флага «Вызов сервера» — клиент не видит функцию общего модуля
03
Возврат несериализуемых типов — падение вызова с ошибкой передачи данных
04
Частые серверные вызовы без кеширования — замедление открытия форм и лишняя нагрузка
05
Доверие клиентскому значению при проверке прав — потенциальная уязвимость

FAQ

Можно ли изменить параметр сеанса с клиента?

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

Почему функция общего модуля не видна из клиентского кода?

Проверьте два флага в свойствах общего модуля: «Сервер» должен быть включён, а «Вызов сервера» — обязательно установлен. Без второго флага модуль доступен только внутри серверного контекста.

Как получить текущего пользователя без обращения к параметрам сеанса?

На сервере доступна функция ПользователиИнформационнойБазы.ТекущийПользователь(), а в типовых конфигурациях — функции модуля Пользователи. На клиент значение всё равно придётся передавать серверным вызовом, но источник данных может отличаться от параметров сеанса.

Что делать, если параметр сеанса пустой при вызове?

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

Когда использовать «На время вызова» вместо «На время сеанса»?

«На время вызова» кеширует результат только в пределах одного обращения к серверу — это безопасный вариант для данных, которые могут измениться между вызовами. «На время сеанса» выбирайте только для гарантированно неизменных в течение сеанса значений.

Влияет ли число параметров сеанса на производительность?

Сами по себе параметры сеанса хранятся в памяти сервера и почти не влияют на скорость. Производительность страдает от лишних серверных вызовов при их чтении с клиента и от тяжёлой логики в УстановкаПараметровСеанса, которая выполняется при каждом старте сеанса.

Итог

Что важно запомнить

Параметры сеанса читаются только на сервере; на клиент их доставляет серверная функция общего модуля с флагом «Вызов сервера». Для частых обращений применяйте повторное использование возвращаемых значений, возвращайте только сериализуемые типы, а проверки прав всегда дублируйте на сервере.