Как устроены параметры сеанса в 1С 8.3 и где их задавать

· 10 мин

Содержание

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

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

Что такое параметр сеанса и где хранится его значение

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

Как это устроено технически:

  • 🖥️ Значение хранится на стороне сервера, в данных сеанса. В клиент-серверном варианте их держит кластер серверов 1С, в файловом — процесс, обслуживающий базу.
  • 👤 У каждого сеанса свой набор значений. Два пользователя, вошедшие под одной учётной записью, получат два независимых комплекта.
  • ⏱️ Время жизни — от входа до выхода. Перезапуск клиента означает новый сеанс и новые значения.
  • 🔒 Изменить значение может только код на сервере. Пользователь в интерфейсе параметры сеанса не видит.

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

Нужен список значений — используйте ФиксированныйМассив. Его удобно подставлять в условие В (&Параметр) в запросах и ограничениях доступа.

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

Порядок действий для 8.3 с интерфейсом «Такси»:

  1. Откройте конфигуратор, дерево конфигурации.
  2. Разверните ветку Общие → Параметры сеанса.
  3. Нажмите «Добавить». Задайте имя латиницей или кириллицей без пробелов, например ТекущийСклад.
  4. На закладке типа данных выберите тип — например, СправочникСсылка.Склады.
  5. Откройте нужные роли и выдайте права на новый параметр (подробнее — в разделе про доступ).
  6. Откройте модуль сеанса: правой кнопкой по корню конфигурации → «Открыть модуль сеанса».
  7. Напишите обработчик УстановкаПараметровСеанса.
  8. Обновите конфигурацию базы данных.

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

Модуль сеанса и обработчик УстановкаПараметровСеанса

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

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

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

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

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

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

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

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

		КонецЕсли;

	КонецЦикла;

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

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

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

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

Чтение, установка и сброс из кода

Обращение идёт через свойство глобального контекста ПараметрыСеанса:

Склад = ПараметрыСеанса.ТекущийСклад;          // чтение
ПараметрыСеанса.ТекущийСклад = НовыйСклад;      // установка (на сервере)

Где это свойство доступно:

КонтекстДоступ к ПараметрыСеанса
Сервер (общие модули, модули объектов, серверные процедуры форм)✅ есть
Внешнее соединение✅ есть
Толстый клиент (обычное приложение)✅ есть
Тонкий клиент и веб-клиент❌ нет

Чтобы получить значение в управляемой форме на клиенте, вызовите серверную функцию:

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

Для сброса есть метод менеджера ПараметрыСеанса.Очистить(). В него передают массив имён или строку имён через запятую; без параметра очищаются все. После очистки следующее обращение снова вызовет УстановкаПараметровСеанса. Это удобно, когда пользователю поменяли основной склад: очистили параметр — и новое значение подтянется само, без перезапуска.

ПараметрыСеанса.Очистить("ТекущийСклад");

Фоновые задания и регламентные задания

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

Права и области видимости параметров сеанса

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

  • 👁️ Получение — код, выполняемый от имени пользователя, может читать значение;
  • ✏️ Установка — код может записать новое значение.

Права проверяются при обращении вне привилегированного режима. В модуле сеанса и в коде, выполняемом в привилегированном режиме (УстановитьПривилегированныйРежим(Истина)), проверки нет.

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

Область видимости складывается из двух слоёв:

СлойЧто ограничивает
СеансЗначение видит только этот сеанс, другие пользователи — нет
Контекст выполненияТолько сервер, внешнее соединение и толстый клиент
РольПрава «Получение» и «Установка»

Чем параметр сеанса отличается от констант, переменных и настроек пользователя

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

МеханизмГде хранитсяСрок жизниОбщий для всех?Типичная задача
Параметр сеансаСервер, данные сеансаСеансНет, свой у каждого сеансаТекущий пользователь, фильтр для RLS
КонстантаБаза данныхПостоянноДаУчётная политика, флаг использования функции
Экспортная переменная модуля приложенияКлиентСеансНетСостояние клиентского интерфейса
Хранилище общих настроекБаза данныхПостоянно, по пользователюНетПоследний выбранный отчёт, вид списка
Модуль с повторным использованием на время сеансаКеш сервераОграничен, кеш может сброситьсяНетУскорение частых вычислений
Сведения пользователя ИБСписок пользователейПостоянноНетИмя, роли, способ входа

Ключевые различия:

  • 📌 Константа общая для всех пользователей и переживает перезапуск. Параметр сеанса — личный и временный.
  • 📌 Переменная модуля приложения живёт на клиенте, сервер её не видит. Параметр сеанса — наоборот.
  • 📌 Хранилище настроек пользователь может менять сам. Параметр сеанса без права «Установка» он не изменит.
  • 📌 Кеш модуля повторного использования платформа может сбросить в любой момент. Параметр сеанса пропадает только при очистке или завершении сеанса.
Где хранить значение?

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

Сам механизм быстрый, но его легко перегрузить. Что реально замедляет работу:

  1. Тяжёлая инициализация на старте. Если при ТребуемыеПараметры = Неопределено считать десяток параметров с запросами, каждый вход в программу затянется. Ленивая инициализация решает это без усилий.
  2. Крупные значения. В клиент-серверном варианте данные сеанса хранятся и передаются внутри кластера. ХранилищеЗначения с мегабайтами или массив из тысяч ссылок увеличивают объём, который кластер держит на каждый сеанс. При 200 пользователях это уже заметно.
  3. Частая перезапись. Каждая установка — изменение данных сеанса. Записывать параметр в цикле или при каждом открытии формы не нужно.
  4. Длинные списки в RLS. Условие Организация В (&РазрешенныеОрганизации) с массивом из 5 элементов работает быстро. С массивом из 3000 элементов запрос к СУБД разрастается, и каждый отчёт начинает тормозить.

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

Безопасность и изоляция данных

Параметры сеанса — основа ограничения доступа на уровне записей. В тексте ограничения RLS к ним обращаются через амперсанд:

Организация = &ТекущаяОрганизация

Для списка разрешённых значений:

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

Почему для этого используют именно параметр сеанса, а не что-то другое:

  • 🛡️ Пользователь не может подменить значение: в тонком клиенте доступа к параметру нет, а права «Установка» у него нет.
  • 🛡️ Значение вычисляет модуль сеанса в привилегированном режиме, то есть по правилам, которые задал разработчик, а не пользователь.
  • 🛡️ Каждый сеанс изолирован: значения одного пользователя не попадают к другому, даже под одной учётной записью.

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

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

Практические сценарии

Где параметры сеанса используют чаще всего:

  • 👤 Текущий пользователь. Ссылка на элемент справочника «Пользователи», соответствующий вошедшему пользователю ИБ. Определяется по ПользователиИнформационнойБазы.ТекущийПользователь(). В конфигурациях на БСП такой параметр уже есть — ТекущийПользователь.
  • 🏬 Склад или подразделение по умолчанию. Подставляется в новые документы и в отборы списков.
  • 🔐 Список разрешённых организаций или складов для RLS.
  • 🧩 Признак режима работы — например, сеанс запущен через внешнее соединение для обмена, и часть проверок нужно пропустить.
  • 🗂️ Номер области данных при работе с разделением.

Мини-кейс: кладовщик видит только свой склад

Задача: пользователь видит документы только по своему складу.

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

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

Частые вопросы

Можно ли посмотреть значение параметра сеанса в отладчике?
Да. В режиме отладки на сервере вычислите выражение ПараметрыСеанса.ИмяПараметра в окне «Вычислить выражение» или в табло. Если параметр ещё не установлен, обращение запустит его инициализацию.
Почему параметр сеанса пустой в фоновом задании?
Фоновое задание — отдельный сеанс. Модуль сеанса там отрабатывает заново и может вернуть другое значение. Нужное значение передайте в параметрах задания.
Можно ли изменить параметр сеанса другого пользователя?
Нет. Код имеет доступ только к параметрам своего сеанса. Чтобы изменения применились у другого пользователя, ему нужно начать новый сеанс.
Сколько параметров сеанса можно создать?
Жёсткого практического предела для обычной конфигурации нет: в типовых их десятки. Ограничивает не количество, а объём значений и стоимость их вычисления.
Можно ли использовать параметр сеанса в обычном запросе?
Да, но в тексте запроса его нужно передать как обычный параметр: Запрос.УстановитьПараметр("Склад", ПараметрыСеанса.ТекущийСклад). Прямая ссылка через амперсанд на имя параметра сеанса работает только в тексте ограничений доступа.