Как устроены параметры сеанса в 1С:Предприятии 8.3 и где они пригодятся разработчику

· 9 мин

Содержание

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

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

Из чего состоит механизм параметров сеанса

Механизм складывается из трёх частей, и путаница обычно начинается, когда их смешивают.

  • 🧩 Объект метаданных. Создаётся в конфигураторе: дерево конфигурации → Общие → Параметры сеанса → Добавить. У него есть имя, синоним и тип значения.
  • 📦 Менеджер ПараметрыСеанса. Свойство глобального контекста. Через него код обращается к значениям: ПараметрыСеанса.ТекущаяОрганизация.
  • ⚙️ Модуль сеанса. Открывается из контекстного меню корня конфигурации. В нём живёт обработчик УстановкаПараметровСеанса(ТребуемыеПараметры), который заполняет значения.

Тип параметра выбирают так же, как тип реквизита: примитивы, ссылки на справочники и документы, ХранилищеЗначения, фиксированные коллекции вроде ФиксированныйМассив. Изменяемые коллекции (обычный Массив, Структура) записать нельзя — сначала оберните их в фиксированный аналог.

Чем параметр сеанса не является

Термин часто путают с соседними понятиями. Короткая шпаргалка:

ЧтоГде живётСрок жизниДля чего
Параметр сеансаСервер, данные сеансаСеансОбщие для кода значения, RLS
КонстантаБаза данныхПостоянноНастройки на всю базу
Модуль с повторным использованиемКэш сервера или клиентаВремя сеанса или вызоваКэш результатов функций
ПараметрыПриложенияКлиентПока открыт клиентКэш на клиенте
ПараметрЗапускаСтрока запуска (ключ /C)СеансПередать строку извне

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

Свойства и способы доступа к ПараметрыСеанса

Обращение к значению выглядит как обращение к реквизиту:

Организация = ПараметрыСеанса.ТекущаяОрганизация;
ПараметрыСеанса.ТекущаяОрганизация = НоваяОрганизация;

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

Права на получение и установку

У каждого параметра сеанса в роли есть два права:

  1. Получение — можно читать значение.
  2. Установка — можно присваивать значение.

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

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

Где доступен менеджер

ПараметрыСеанса доступен на сервере, в толстом клиенте и во внешнем соединении. В тонком клиенте и веб-клиенте прямого обращения нет: код в процедуре с директивой &НаКлиенте его просто не увидит.

Модуль сеанса: как заполняются параметры сеанса

Платформа вызывает УстановкаПараметровСеанса в двух ситуациях:

  • 🚀 При старте сеанса — с параметром ТребуемыеПараметры = Неопределено.
  • 🔍 При обращении к ещё не установленному параметру — с массивом имён тех параметров, которые потребовались.

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

Пример обработчика с ленивым заполнением:

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)

	Если ТребуемыеПараметры = Неопределено Тогда
		// Старт сеанса: тяжёлых вычислений здесь не делаем.
		Возврат;
	КонецЕсли;

	Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл

		Если ИмяПараметра = "ТекущаяОрганизация" Тогда
			ПараметрыСеанса.ТекущаяОрганизация = ОрганизацияПоУмолчаниюПользователя();

		ИначеЕсли ИмяПараметра = "РазрешенныеСклады" Тогда
			Склады = СкладыТекущегоПользователя(); // возвращает Массив
			ПараметрыСеанса.РазрешенныеСклады = Новый ФиксированныйМассив(Склады);

		КонецЕсли;

	КонецЦикла;

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

Функции ОрганизацияПоУмолчаниюПользователя() и СкладыТекущегоПользователя() здесь условные — это ваш код, который читает регистр настроек или справочник.

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

Если конфигурация построена на БСП

В типовых БП 3.0, ЗУП 3.1, УТ 11 модуль сеанса уже занят: оттуда вызывается обработчик Библиотеки стандартных подсистем. Сами типовые параметры сеанса (например, ТекущийПользователь) заполняет библиотека.

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

Работа с параметрами сеанса в клиент-серверном коде

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

&НаСервереБезКонтекста
Функция ТекущаяОрганизацияСеанса()
	Возврат ПараметрыСеанса.ТекущаяОрганизация;
КонецФункции

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

Параметры сеанса в запросах и RLS

Здесь кроется частая ошибка. В обычном запросе из кода параметр сеанса не подставляется сам: его надо передать явно.

Запрос = Новый Запрос;
Запрос.Текст =
	"ВЫБРАТЬ
	|	Остатки.Номенклатура,
	|	Остатки.КоличествоОстаток
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад В (&Склады)) КАК Остатки";
Запрос.УстановитьПараметр("Склады", ПараметрыСеанса.РазрешенныеСклады);

Имя регистра в примере условное, подставьте своё.

А вот в тексте ограничения доступа на уровне записей параметры сеанса доступны напрямую по имени через &. Условие для роли может выглядеть так:

Склад В (&РазрешенныеСклады)

Платформа сама возьмёт значение из текущего сеанса. Именно ради этого механизма параметры сеанса чаще всего и заводят.

Фоновые задания и внешние соединения

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

То же касается COM-соединения и внешнего соединения: у каждого свой сеанс и свои значения.

Как параметры сеанса влияют на производительность и блокировки

Значения параметров хранятся в данных сеанса на сервере. В клиент-серверном варианте кластер держит их в памяти и сохраняет в каталоге сеансовых данных (snccntx внутри каталога кластера). Отсюда несколько практических правил.

  • 🐘 Не храните крупные объекты. Таблица на десятки тысяч строк в ХранилищеЗначения раздувает данные каждого сеанса. При сотне пользователей это ощутимая память и диск сервера.
  • ⏱️ Не делайте тяжёлое на старте. Всё, что выполняется при ТребуемыеПараметры = Неопределено, пользователь ждёт при каждом входе. Запросы — только в ленивых ветках.
  • 🔁 Не переписывайте значение в цикле. Чтение дешёвое, запись обновляет данные сеанса. Если значение меняется на каждом шаге, ему место в локальной переменной.
  • 🧮 Держите RLS-списки компактными. Фиксированный массив из пяти складов в условии В (&...) работает быстро. Массив из тысяч ссылок утяжеляет каждый запрос к защищённой таблице.

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

Сценарии использования параметров сеанса на практике

Где параметры сеанса действительно экономят труд:

  1. Текущий пользователь. Ссылка на элемент справочника «Пользователи», найденная по имени пользователя информационной базы. Её используют формы, отчёты и RLS. В БСП это уже сделано.
  2. Ограничение по организациям или складам. Список разрешённых значений в фиксированном массиве и условие RLS по нему. Пользователь видит только свои документы.
  3. Режим работы сеанса. Признак «сеанс запущен обменом» или «идёт загрузка данных», чтобы подписки на события не выполняли лишних проверок. Устанавливается в начале обмена и сбрасывается по окончании.
  4. Кэш редко меняющихся настроек. Например, рабочая дата или основная валюта, если её пересчёт дорогой.

Мини-кейс: пользователь сменил организацию

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

ИменаПараметров = Новый Массив;
ИменаПараметров.Добавить("ТекущаяОрганизация");
ПараметрыСеанса.Сбросить(ИменаПараметров);

При следующем обращении обработчик заново прочитает настройку. Перезаход не нужен.

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

Перед добавлением нового параметра сеанса
Выполнено: 0 / 6

Диагностика и администрирование сеансов

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

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

  1. Запустите конфигуратор и начните отладку (F5) или подключитесь к уже работающему сеансу через меню отладки.
  2. Поставьте точку останова в любом серверном коде.
  3. Когда выполнение остановится, вычислите выражение ПараметрыСеанса.ТекущаяОрганизация (Shift+F9).

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

Список сеансов на сервере

Для анализа нагрузки и подвисших сеансов используйте консоль администрирования кластера или утилиту rac. Список сеансов с лицензиями выводит rac session list --licenses (после rac cluster list, чтобы узнать идентификатор кластера). Остальные ключи смотрите в rac help.

Каталог сеансовых данных snccntx иногда советуют очистить при сбоях сервера. Это делается только при остановленной службе агента сервера 1С, в нерабочее время: все сеансы пользователей оборвутся, несохранённые данные пропадут.

Типичные ошибки разработчика

  • ❌ Обращение к ПараметрыСеанса из процедуры &НаКлиенте в управляемой форме — метод не найден, нужен серверный вызов.
  • ❌ Присваивание обычного Массив — ошибка типа, нужен ФиксированныйМассив.
  • ❌ Ветка обработчика забыла присвоить значение при пустых данных — ошибка при первом обращении.
  • ❌ Расчёт на то, что фоновое задание унаследует значения пользователя.
  • ❌ Ожидание, что параметр сеанса подставится в обычный запрос сам без УстановитьПараметр.

Частые вопросы о параметрах сеанса

Сохраняются ли параметры сеанса после перезапуска 1С?
Нет. Значение живёт только в рамках одного сеанса. При новом входе обработчик установки заполнит его заново.
Видит ли другой пользователь значение моего параметра сеанса?
Нет. У каждого сеанса свои значения, даже если это один и тот же пользователь, открывший два окна.
Работают ли параметры сеанса в файловой базе?
Да. Механизм одинаков в файловом и клиент-серверном варианте, различается только место хранения данных сеанса.
Можно ли добавить параметр сеанса в типовую конфигурацию без снятия с поддержки?
Да, через расширение конфигурации. Там же добавляется обработчик, который заполняет значение.
Почему изменение настройки пользователя не применилось сразу?
Параметр сеанса уже был заполнен старым значением. Сбросьте его методом Сбросить() с именем параметра или перезайдите в программу.