Как устроены параметры сеанса в 1С 8.3 и где их задавать
Содержание
Параметр сеанса в 1С — это значение, которое живёт ровно столько, сколько живёт сеанс пользователя, хранится на сервере и устанавливается кодом. Создают его в конфигураторе в ветке Общие → Параметры сеанса, а заполняют в модуле сеанса, в процедуре УстановкаПараметровСеанса.
Частое заблуждение — считать параметр сеанса «глобальной переменной, которую видно везде». Это не так. Из тонкого клиента до него не дотянуться, в базу он не пишется, а у каждой роли есть отдельные права на чтение и установку. Ниже — как это работает на практике, с кодом и типичными ловушками.
Что такое параметр сеанса и где хранится его значение
Параметр сеанса — объект метаданных конфигурации. У него есть имя, синоним и тип. Значение — нет: оно появляется только в работающем сеансе и исчезает при его завершении.
Как это устроено технически:
- 🖥️ Значение хранится на стороне сервера, в данных сеанса. В клиент-серверном варианте их держит кластер серверов 1С, в файловом — процесс, обслуживающий базу.
- 👤 У каждого сеанса свой набор значений. Два пользователя, вошедшие под одной учётной записью, получат два независимых комплекта.
- ⏱️ Время жизни — от входа до выхода. Перезапуск клиента означает новый сеанс и новые значения.
- 🔒 Изменить значение может только код на сервере. Пользователь в интерфейсе параметры сеанса не видит.
Типы допускаются ограниченные: примитивные (строка, число, дата, булево), ссылки на объекты конфигурации, ХранилищеЗначения и фиксированные коллекции — ФиксированныйМассив, ФиксированнаяСтруктура, ФиксированноеСоответствие. Обычный Массив или ТаблицаЗначений в параметр сеанса положить нельзя: значение должно быть неизменяемым.
Нужен список значений — используйте ФиксированныйМассив. Его удобно подставлять в условие В (&Параметр) в запросах и ограничениях доступа.
Как создать параметр сеанса в конфигураторе
Порядок действий для 8.3 с интерфейсом «Такси»:
- Откройте конфигуратор, дерево конфигурации.
- Разверните ветку
Общие → Параметры сеанса. - Нажмите «Добавить». Задайте имя латиницей или кириллицей без пробелов, например
ТекущийСклад. - На закладке типа данных выберите тип — например,
СправочникСсылка.Склады. - Откройте нужные роли и выдайте права на новый параметр (подробнее — в разделе про доступ).
- Откройте модуль сеанса: правой кнопкой по корню конфигурации → «Открыть модуль сеанса».
- Напишите обработчик
УстановкаПараметровСеанса. - Обновите конфигурацию базы данных.
В типовой конфигурации на поддержке не меняйте модуль сеанса напрямую — при обновлении придётся вручную сливать изменения. Добавьте параметр и обработчик через расширение конфигурации
(они доступны с платформы 8.3.6). В расширении процедуру модуля сеанса дополняют аннотацией &После или &Перед.
Модуль сеанса и обработчик УстановкаПараметровСеанса
Модуль сеанса выполняется на сервере в привилегированном режиме. Это значит, что внутри него проверка прав не мешает установить любой параметр. Платформа вызывает УстановкаПараметровСеанса в двух ситуациях.
| Когда вызывается | Что приходит в ТребуемыеПараметры |
|---|---|
| При старте сеанса | Неопределено |
| При первом обращении к параметру, который ещё не установлен | Массив имён параметров, которые нужны прямо сейчас |
Второй случай называют ленивой инициализацией. Её стоит использовать: не нужно считать на старте всё подряд, сеанс открывается быстрее.
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры = Неопределено Тогда
// Старт сеанса: ничего не считаем заранее,
// всё установится при первом обращении.
Возврат;
КонецЕсли;
Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
Если ИмяПараметра = "ТекущийСклад" Тогда
ПараметрыСеанса.ТекущийСклад = ОпределитьСкладПользователя();
ИначеЕсли ИмяПараметра = "РазрешенныеОрганизации" Тогда
Список = Новый Массив;
// ... заполняем Список ссылками на организации
ПараметрыСеанса.РазрешенныеОрганизации = Новый ФиксированныйМассив(Список);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если код обратился к параметру, а обработчик его так и не установил, платформа выдаст ошибку о том, что значение параметра сеанса не установлено. Поэтому каждая ветка обработчика должна гарантированно записать значение — хотя бы пустую ссылку.
Не вызывайте внутри обработчика код, который сам читает ещё не установленный параметр. Получится повторный вход в ленивую инициализацию, и разбирать такой стек неприятно.
В конфигурациях на БСП свой код в модуль сеанса обычно не пишут. Там модуль сеанса передаёт управление библиотеке, а прикладные параметры регистрируют через переопределяемый модуль ОбщегоНазначенияПереопределяемый, в обработчике добавления обработчиков установки параметров сеанса. Найдите его поиском по слову «ПараметровСеанса» в модуле — имя процедуры длинное, но однозначное.
Чтение, установка и сброс из кода
Обращение идёт через свойство глобального контекста ПараметрыСеанса:
Склад = ПараметрыСеанса.ТекущийСклад; // чтение
ПараметрыСеанса.ТекущийСклад = НовыйСклад; // установка (на сервере)
Где это свойство доступно:
| Контекст | Доступ к ПараметрыСеанса |
|---|---|
| Сервер (общие модули, модули объектов, серверные процедуры форм) | ✅ есть |
| Внешнее соединение | ✅ есть |
| Толстый клиент (обычное приложение) | ✅ есть |
| Тонкий клиент и веб-клиент | ❌ нет |
Чтобы получить значение в управляемой форме на клиенте, вызовите серверную функцию:
&НаСервереБезКонтекста
Функция ПолучитьТекущийСклад()
Возврат ПараметрыСеанса.ТекущийСклад;
КонецФункции
Для сброса есть метод менеджера ПараметрыСеанса.Очистить(). В него передают массив имён или строку имён через запятую; без параметра очищаются все. После очистки следующее обращение снова вызовет УстановкаПараметровСеанса. Это удобно, когда пользователю поменяли основной склад: очистили параметр — и новое значение подтянется само, без перезапуска.
ПараметрыСеанса.Очистить("ТекущийСклад");
Фоновые задания и регламентные задания
Фоновое задание выполняется в отдельном сеансе. Значения из сеанса, который его запустил, туда не переносятся: модуль сеанса отработает заново. Если заданию нужно конкретное значение, передайте его в параметрах ФоновыеЗадания.Выполнить(), а не надейтесь на параметр сеанса. То же касается регламентных заданий — они работают от имени пользователя, указанного в задании, и параметры считаются для него.
Права и области видимости параметров сеанса
У каждого параметра сеанса в роли два права:
- 👁️ Получение — код, выполняемый от имени пользователя, может читать значение;
- ✏️ Установка — код может записать новое значение.
Права проверяются при обращении вне привилегированного режима. В модуле сеанса и в коде, выполняемом в привилегированном режиме (УстановитьПривилегированныйРежим(Истина)), проверки нет.
Практическое правило: право «Установка» обычным ролям не давайте. Пусть параметр меняет только модуль сеанса или доверенный серверный код в привилегированном режиме. Право «Получение» выдавайте тем ролям, чьи запросы и ограничения доступа используют параметр.
Область видимости складывается из двух слоёв:
| Слой | Что ограничивает |
|---|---|
| Сеанс | Значение видит только этот сеанс, другие пользователи — нет |
| Контекст выполнения | Только сервер, внешнее соединение и толстый клиент |
| Роль | Права «Получение» и «Установка» |
Чем параметр сеанса отличается от констант, переменных и настроек пользователя
Выбор места хранения — главный вопрос при проектировании. Ошибка здесь стоит дороже, чем неудачный код.
| Механизм | Где хранится | Срок жизни | Общий для всех? | Типичная задача |
|---|---|---|---|---|
| Параметр сеанса | Сервер, данные сеанса | Сеанс | Нет, свой у каждого сеанса | Текущий пользователь, фильтр для RLS |
| Константа | База данных | Постоянно | Да | Учётная политика, флаг использования функции |
| Экспортная переменная модуля приложения | Клиент | Сеанс | Нет | Состояние клиентского интерфейса |
| Хранилище общих настроек | База данных | Постоянно, по пользователю | Нет | Последний выбранный отчёт, вид списка |
| Модуль с повторным использованием на время сеанса | Кеш сервера | Ограничен, кеш может сброситься | Нет | Ускорение частых вычислений |
| Сведения пользователя ИБ | Список пользователей | Постоянно | Нет | Имя, роли, способ входа |
Ключевые различия:
- 📌 Константа общая для всех пользователей и переживает перезапуск. Параметр сеанса — личный и временный.
- 📌 Переменная модуля приложения живёт на клиенте, сервер её не видит. Параметр сеанса — наоборот.
- 📌 Хранилище настроек пользователь может менять сам. Параметр сеанса без права «Установка» он не изменит.
- 📌 Кеш модуля повторного использования платформа может сбросить в любой момент. Параметр сеанса пропадает только при очистке или завершении сеанса.
Влияние на производительность
Сам механизм быстрый, но его легко перегрузить. Что реально замедляет работу:
- Тяжёлая инициализация на старте. Если при
ТребуемыеПараметры = Неопределеносчитать десяток параметров с запросами, каждый вход в программу затянется. Ленивая инициализация решает это без усилий. - Крупные значения. В клиент-серверном варианте данные сеанса хранятся и передаются внутри кластера.
ХранилищеЗначенияс мегабайтами или массив из тысяч ссылок увеличивают объём, который кластер держит на каждый сеанс. При 200 пользователях это уже заметно. - Частая перезапись. Каждая установка — изменение данных сеанса. Записывать параметр в цикле или при каждом открытии формы не нужно.
- Длинные списки в RLS. Условие
Организация В (&РазрешенныеОрганизации)с массивом из 5 элементов работает быстро. С массивом из 3000 элементов запрос к СУБД разрастается, и каждый отчёт начинает тормозить.
Для широких прав доступа лучше хранить в параметре не список объектов, а ссылку на группу доступа, а связь группы с объектами держать в регистре сведений. Условие RLS тогда соединяется с регистром, а параметр остаётся компактным.
Безопасность и изоляция данных
Параметры сеанса — основа ограничения доступа на уровне записей. В тексте ограничения RLS к ним обращаются через амперсанд:
Организация = &ТекущаяОрганизация
Для списка разрешённых значений:
Склад В (&РазрешенныеСклады)
Почему для этого используют именно параметр сеанса, а не что-то другое:
- 🛡️ Пользователь не может подменить значение: в тонком клиенте доступа к параметру нет, а права «Установка» у него нет.
- 🛡️ Значение вычисляет модуль сеанса в привилегированном режиме, то есть по правилам, которые задал разработчик, а не пользователь.
- 🛡️ Каждый сеанс изолирован: значения одного пользователя не попадают к другому, даже под одной учётной записью.
Второе применение — разделение данных. У общего реквизита-разделителя в свойствах указывают параметр сеанса, который задаёт значение разделения. Так устроены базы, где в одной информационной базе работают несколько независимых областей данных: сеанс видит только свою область, потому что параметр задаёт её номер.
Привилегированный режим отключает проверку прав. Включайте его точечно и на короткий участок кода. Если в привилегированном коде установить параметр по данным, пришедшим с клиента без проверки, пользователь получит доступ к чужим записям.
Практические сценарии
Где параметры сеанса используют чаще всего:
- 👤 Текущий пользователь. Ссылка на элемент справочника «Пользователи», соответствующий вошедшему пользователю ИБ. Определяется по
ПользователиИнформационнойБазы.ТекущийПользователь(). В конфигурациях на БСП такой параметр уже есть —ТекущийПользователь. - 🏬 Склад или подразделение по умолчанию. Подставляется в новые документы и в отборы списков.
- 🔐 Список разрешённых организаций или складов для RLS.
- 🧩 Признак режима работы — например, сеанс запущен через внешнее соединение для обмена, и часть проверок нужно пропустить.
- 🗂️ Номер области данных при работе с разделением.
Мини-кейс: кладовщик видит только свой склад
Задача: пользователь видит документы только по своему складу.
- Добавьте в справочник пользователей реквизит «Основной склад».
- Создайте параметр сеанса
ТекущийСкладтипаСправочникСсылка.Склады. - В
УстановкаПараметровСеансанайдите пользователя и запишите его склад. Если склад не заполнен — пустую ссылку. - В роли кладовщика выдайте право «Получение» на параметр.
- В той же роли на нужных документах задайте ограничение на чтение
Склад = &ТекущийСклад. - Обновите конфигурацию базы данных и проверьте под тестовым пользователем.
Если склад пользователю сменили, а он не перезашёл, вызовите ПараметрыСеанса.Очистить("ТекущийСклад") в коде записи пользователя — но учтите, что это сработает только для текущего сеанса, а не для сеанса кладовщика. Ему всё равно нужно перезайти.
Частые вопросы
Можно ли посмотреть значение параметра сеанса в отладчике?
ПараметрыСеанса.ИмяПараметра в окне «Вычислить выражение» или в табло. Если параметр ещё не установлен, обращение запустит его инициализацию.Почему параметр сеанса пустой в фоновом задании?
Можно ли изменить параметр сеанса другого пользователя?
Сколько параметров сеанса можно создать?
Можно ли использовать параметр сеанса в обычном запросе?
Запрос.УстановитьПараметр("Склад", ПараметрыСеанса.ТекущийСклад). Прямая ссылка через амперсанд на имя параметра сеанса работает только в тексте ограничений доступа.