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

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

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

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

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

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

Что такое параметры сеанса и когда они нужны

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

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

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

Как объявить параметр сеанса в конфигураторе

Откройте конфигуратор и в дереве конфигурации найдите ветку «Общие → Параметры сеанса». Добавьте новый элемент, задайте имя без пробелов (например, ТекущийПользователь) и выберите тип значения. Тип может быть примитивным (строка, число, булево, дата) или ссылочным — например, СправочникСсылка.Пользователи.

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

Учтите, что изменение состава параметров сеанса требует обновления конфигурации базы данных. В файловом варианте это делается через «Конфигурация → Обновить конфигурацию базы данных», в клиент-серверном — с монопольным доступом или в динамическом режиме, если структура метаданных позволяет.

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

Инициализация в модуле сеанса

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

Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса) Экспорт

Если ИменаПараметровСеанса <> Неопределено

И ИменаПараметровСеанса.Найти("ТекущийПользователь") <> Неопределено Тогда

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

Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя());

КонецЕсли;

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

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

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

Чтение выполняется обращением через точку: ТекПользователь = ПараметрыСеанса.ТекущийПользователь;. Это работает в любом серверном контексте: модуле объекта, общем модуле с признаком «Сервер», модуле формы в серверной процедуре, веб-сервисе, регламентном задании. Запись выполняется аналогично присваиванием, если логика предполагает смену значения внутри сеанса.

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

// Общий модуль РаботаССеансом, флаги: Сервер, Вызов сервера

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

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

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

// Клиентский код

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

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

bsl
// Серверный контекст
ТекПользователь = ПараметрыСеанса.ТекущийПользователь;
Сообщить("Сеанс пользователя: " + ТекПользователь);

Типовые сценарии использования

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

Определение текущего пользователя в обработчиках

В подписках на события записи документов и справочников часто нужно зафиксировать автора изменения. Вместо поиска пользователя по имени в каждом обработчике один раз установите ссылку в параметре сеанса и читайте её: Объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;. Это убирает лишние запросы к справочнику пользователей при массовой записи.

Признак обмена данными

При загрузке данных из другой базы многие проверки (контроль остатков, заполнение по умолчанию) должны быть отключены. Для этого в стандартных механизмах используется параметр ОбменДанными.Загрузка у объекта, но для собственных механизмов удобно завести отдельный параметр сеанса типа «Булево» и устанавливать его на время загрузки, проверяя в подписках.

Настройки, зависящие от подразделения

Если пользователи разных филиалов работают с разными складами или кассами по умолчанию, храните ссылку на подразделение в параметре сеанса и используйте её в обработчиках «ПриСозданииНаСервере» для подстановки значений в новые документы. При смене настройки пользователю достаточно перезайти в базу — параметр переинициализируется.

Если значение параметра должно меняться без перезахода пользователя (например, смена кассы в течение дня), не полагайтесь только на параметр сеанса: дублируйте значение в регистре сведений настроек пользователя, а параметр используйте как кэш, который обновляется после записи настройки.
ПЗ
Практическое замечание

Проверка результата и типичные ошибки

Проверить, что параметр установлен и читается корректно, проще всего через внешнюю обработку с серверной процедурой, которая выводит значение через Сообщить(), либо через консоль кода. Дополнительно убедитесь, что тип значения совпадает с объявленным: присвоение строки параметру с типом «СправочникСсылка» вызовет ошибку приведения типов.

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

Типичные ошибки
01
Чтение параметра на клиенте напрямую — ошибка компиляции, нужен серверный вызов
02
Отсутствие ветки для имени в УстановкаПараметровСеанса — ошибка неинициализированного значения при первом чтении
03
Тяжёлые запросы в модуле сеанса — медленный вход всех пользователей в базу
04
Хранение в параметре таблиц значений и больших структур — лишний расход памяти на каждый сеанс
05
Исключение в обработчике без попытки-исключения — пользователь не может войти в базу
Контрольные точки

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

Чтение параметра в серверном коде
Норма

Возвращается значение объявленного типа

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

Ошибка «неинициализированное значение» или несовпадение типа

Вход нового пользователя
Норма

Вход выполняется быстро, параметр заполнен

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

Долгий вход или ошибка в модуле сеанса

Два сеанса одновременно
Норма

У каждого сеанса своё значение параметра

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

Значения пересекаются — значит, данные хранятся не в параметре сеанса

Ограничения и альтернативы

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

Второе ограничение — состав типов. Параметр сеанса не может иметь тип «ТаблицаЗначений», «ДеревоЗначений» и ряд других несериализуемых типов; для ссылочных типов значение должно существовать в базе. Третий момент: в механизме разделения данных (SaaS) параметры сеанса инициализируются в контексте разделителя, и код обработчика должен это учитывать.

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

Что выбрать для хранения данных

Параметр сеанса

Значение на время сеанса, частое чтение из серверного кода. Не сохраняется между сеансами.

Регистр сведений настроек

Постоянные настройки пользователя, которые должны переживать перезаход. Требует запроса при чтении.

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

Пользовательские настройки интерфейса и отчётов без создания отдельных метаданных.

Константа

Значение, общее для всей базы, а не для отдельного сеанса.

Часто задаваемые вопросы

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

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

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

Платформа вызывает обработчик УстановкаПараметровСеанса с именем этого параметра. Если обработчик его не установил, при чтении возникает ошибка о попытке получения неинициализированного значения. Поэтому для каждого объявленного параметра должна быть ветка инициализации в модуле сеанса.

Видны ли параметры сеанса другому пользователю?

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

Как изменить значение параметра внутри сеанса?

Прямым присваиванием в серверном коде: ПараметрыСеанса.ИмяПараметра = НовоеЗначение. Новое значение действует до конца сеанса или до следующей перезаписи. После перезахода пользователя параметр снова получит значение из обработчика инициализации.

Почему после добавления параметра пользователи не могут войти в базу?

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

Можно ли хранить в параметре сеанса список значений или структуру?

Составные несериализуемые типы вроде таблиц значений недоступны. Допустимы примитивные типы и ссылки на объекты базы. Если нужен набор значений, храните ссылку на объект-владелец данных и читайте детали запросом при необходимости.

Итог

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

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