Параметры сеанса в конфигурации 1С 8.3: установка в модуле сеанса, права, RLS и отладка
Содержание
Параметр сеанса в 1С — это объект метаданных из ветки Общие → Параметры сеанса, значение которого живёт ровно столько, сколько живёт сеанс пользователя. Значение задают в модуле сеанса в процедуре УстановкаПараметровСеанса, а читают на сервере через ПараметрыСеанса.Имя. Главное назначение — хранить «кто я и в каком контексте работаю» (текущий пользователь, организация, режим) и подставлять эти значения в ограничения доступа на уровне записей.
Типичная ситуация: разработчик дописывает в типовую конфигурацию отбор «показывать менеджеру только его клиентов». Передавать текущего пользователя в каждый запрос вручную долго и ненадёжно. Параметр сеанса решает задачу один раз: значение вычисляется при входе, а RLS и серверный код берут его готовым.
Что такое параметр сеанса и зачем он конфигурации
Параметр сеанса — это переменная уровня сеанса, описанная в конфигурации как объект метаданных. У него есть имя, синоним и тип. Значение у каждого сеанса своё: два пользователя, вошедшие одновременно, видят разные значения одного и того же параметра.
Для чего параметры сеанса применяют на практике:
- 👤 Текущий пользователь — ссылка на элемент справочника
Пользователи. В конфигурациях на БСП это параметрТекущийПользователь. - 🔒 Ограничение доступа на уровне записей (RLS) — в тексте ограничения можно обращаться к параметру сеанса через
&Имя. Это основной и самый важный сценарий. - 🏢 Контекст работы — основная организация, подразделение, признак «работа в режиме обмена», текущая область данных в разделённой базе.
- ⚙️ Флаги поведения — например, «идёт загрузка данных, проверки отключены». Такой флаг ставят в начале операции и снимают в конце.
- 🧪 Отладка и тестирование — признак тестового режима, при котором часть кода пишет подробный журнал или обходит внешние сервисы.
Значение параметра не сохраняется в базе. Пользователь закрыл программу — значение пропало. Следующий вход начнёт с пустого параметра, и модуль сеанса вычислит его заново.
Как создать параметр сеанса и задать ему значение
Шаг 1. Описать параметр в конфигураторе
- Откройте конфигурацию:
Конфигурация → Открыть конфигурацию. - В дереве метаданных раскройте
Общие → Параметры сеанса. - Добавьте новый элемент, задайте имя (например,
ТекущийМенеджер) и тип (СправочникСсылка.Пользователи). - Сохраните конфигурацию.
Тип выбирайте самый узкий. Для ссылки на пользователя — именно СправочникСсылка.Пользователи, а не составной тип «на всякий случай».
Имя давайте такое, чтобы по нему было понятно содержимое без открытия модуля сеанса: ТекущийМенеджер, ОсновнаяОрганизация, РежимЗагрузкиДанных. В доработках типовых добавляйте префикс своей компании, чтобы имя не совпало с параметром из будущего релиза.
Шаг 2. Выдать права в ролях
У параметра сеанса в ролях есть два права: Получение и Установка. Без права «Получение» чтение ПараметрыСеанса.ТекущийМенеджер под обычным пользователем закончится ошибкой с текстом Нарушение прав доступа!.
Дайте «Получение» тем ролям, чьему коду нужно значение. «Установку» обычным ролям не выдавайте: значение задаёт модуль сеанса, а он выполняется в привилегированном режиме, так что права пользователя ему не нужны.
Шаг 3. Установить значение в модуле сеанса
Модуль сеанса открывается из контекстного меню корня конфигурации. Платформа вызывает в нём обработчик УстановкаПараметровСеанса с параметром ТребуемыеПараметры:
- при старте сеанса в нём
Неопределено; - при первом обращении к ещё не установленному параметру — массив строк с именами параметров, которые нужно заполнить.
Второй вариант даёт ленивую инициализацию: тяжёлые значения вычисляются только тогда, когда они реально понадобились.
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры = Неопределено Тогда
// Старт сеанса: заполняем только лёгкие параметры
ПараметрыСеанса.РежимЗагрузкиДанных = Ложь;
Возврат;
КонецЕсли;
Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
Если ИмяПараметра = "ТекущийМенеджер" Тогда
ПараметрыСеанса.ТекущийМенеджер = НайтиПользователяПоИмени(ИмяПользователя());
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция НайтиПользователяПоИмени(Имя)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Пользователи.Ссылка КАК Ссылка
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.Наименование = &Имя";
Запрос.УстановитьПараметр("Имя", Имя);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
Возврат Справочники.Пользователи.ПустаяСсылка();
КонецФункции
Поиск по наименованию здесь — упрощение для примера. В рабочей конфигурации пользователя ищут по идентификатору пользователя информационной базы, а не по имени.
Если в модуле сеанса не обработать имя параметра из ТребуемыеПараметры, обращение к нему завершится ошибкой, и форма или отчёт не откроются у всех пользователей.
Шаг 4. Прочитать значение в коде
&НаСервере
Процедура ЗаполнитьОтветственного()
Объект.Ответственный = ПараметрыСеанса.ТекущийМенеджер;
КонецПроцедуры
Читать и писать ПараметрыСеанса можно на сервере, в толстом клиенте и во внешнем соединении. В тонком и веб-клиенте этого свойства нет: нужно вызвать серверную процедуру и вернуть значение оттуда.
Установить значение можно и вне модуля сеанса — из любого серверного кода с правом «Установка» или в привилегированном режиме. Так делают с флагами вроде РежимЗагрузкиДанных.
Типовые конфигурации на БСП
В БП 3.0, ЗУП 3.1, УТ 11 модуль сеанса почти пустой: он передаёт управление в СтандартныеПодсистемыСервер.УстановкаПараметровСеанса(ТребуемыеПараметры). Свои параметры БСП заполняет сама, а прикладные подключаются через обработчики подсистем. Дорабатывая типовую, не переписывайте модуль сеанса целиком — добавьте свою ветку для своего параметра, лучше в расширении.
Параметры сеанса, глобальные переменные и другие способы хранения
Под «запомнить значение на время работы» в 1С подходит несколько механизмов. Путать их не стоит: у каждого своё место исполнения и время жизни.
| Механизм | Где живёт | Срок жизни | Виден в RLS | Когда брать |
|---|---|---|---|---|
| Параметр сеанса | Сервер, данные сеанса | До конца сеанса | Да | Контекст пользователя, ограничения доступа |
| Экспортная переменная модуля управляемого приложения | Клиент | До закрытия клиента | Нет | Клиентские флаги, кэш для интерфейса |
| Общий модуль с повторным использованием «На время сеанса» | Сервер или клиент | До конца сеанса (кэш может сбрасываться) | Нет | Кэш редко меняющихся вычислений |
| Константа | База данных | Постоянно, общая для всех | Нет | Настройка на всю базу |
| Регистр сведений, хранилище настроек | База данных | Постоянно, по ключу | Нет | Настройки конкретного пользователя |
| Временное хранилище | Сервер | Пока жива форма или до явного удаления | Нет | Передача больших данных между клиентом и сервером |
Ключевые отличия параметра сеанса от глобальной переменной:
- 🖥️ Глобальная переменная клиентского модуля недоступна на сервере. Параметр сеанса — серверный объект.
- 🔐 На параметр сеанса можно ссылаться в тексте ограничения доступа. Переменную туда не передать никак.
- 🛡️ На параметр раздаются права, а глобальную переменную может поменять любой клиентский код.
Отличие от временных файлов: временный файл переживёт сеанс, если его не удалить, и лежит на конкретном компьютере. Для контекста пользователя файл — неудачный выбор.
Практические сценарии применения
Ограничение доступа по менеджеру
В роли «Менеджер» у справочника Контрагенты в ограничении доступа на чтение пишут условие:
ГДЕ ОсновнойМенеджер = &ТекущийМенеджер
Платформа подставит значение параметра сеанса текущего пользователя. Отбор работает в любом запросе, отчёте и списке без доработки кода.
В конфигурациях на БСП ограничения пишут через шаблоны и механизм групп доступа, а не напрямую. Прямое условие в роли типовой конфигурации сломает совместимость с обновлениями.
Флаг режима загрузки
При массовой загрузке документов проверки в модулях объектов только мешают. Флаг в параметре сеанса отключает их на время операции:
ПараметрыСеанса.РежимЗагрузкиДанных = Истина;
Попытка
ЗагрузитьДокументы(Данные);
Исключение
ПараметрыСеанса.РежимЗагрузкиДанных = Ложь;
ВызватьИсключение;
КонецПопытки;
ПараметрыСеанса.РежимЗагрузкиДанных = Ложь;
Флаг обязательно снимают и при ошибке, иначе до конца сеанса пользователь работает без проверок.
Контекст для фоновых заданий и обмена
Фоновое задание запускается в отдельном сеансе. Модуль сеанса в нём отрабатывает заново, и значения «родительского» сеанса туда не переходят. Если заданию нужна организация или пользователь, передавайте их параметрами задания и при необходимости устанавливайте в самом задании.
Признак тестового режима
Параметр ТестовыйРежим типа Булево заполняют по ключу запуска или по роли пользователя. Код отправки во внешние сервисы проверяет его и вместо реальной отправки пишет в журнал регистрации. На рабочей базе параметр всегда Ложь.
Ограничения параметров сеанса
- 📦 Тип значения. Параметр хранит сериализуемые значения: примитивы, ссылки, фиксированные коллекции (
ФиксированныйМассив,ФиксированнаяСтруктура),ХранилищеЗначения. Обычный массив или таблицу значений напрямую не положить — их заворачивают в фиксированную коллекцию или в хранилище. - 🔁 Фиксированные коллекции неизменяемы. Чтобы добавить элемент в
ФиксированныйМассивиз параметра, создают обычный массив, меняют его и записывают новый фиксированный. - 🐢 Частая запись. В клиент-серверном варианте данные сеанса хранятся кластером. Запись параметра в цикле на каждую строку — заметная лишняя нагрузка. Пишите один раз, читайте сколько угодно.
- 🧱 Объём. Кладите туда ссылки и короткие значения, а не выгрузки на мегабайты.
- 🚫 Нет на тонком клиенте. Любое чтение — через серверный вызов.
- 🔄 Нет наследования. Фоновые задания, внешние соединения и сеансы обмена получают свои значения из модуля сеанса.
Альтернативы для случаев, когда эти ограничения мешают, приведены в таблице выше.
Как отладить проблемы с параметрами сеанса
Посмотреть текущее значение
- Запустите базу в режиме отладки из конфигуратора.
- Поставьте точку останова в серверной процедуре, где используется параметр.
- Когда отладчик остановится, откройте «Вычислить выражение» (
Shift+F9) и введитеПараметрыСеанса.ТекущийМенеджер.
В клиент-серверной базе остановка в серверном коде сработает, только если отладка на сервере включена. Без этого отладчик пропустит точки в серверных модулях.
Поймать момент установки
Поставьте точку останова в первой строке УстановкаПараметровСеанса. Сразу видно, с чем пришёл вызов: Неопределено на старте или массив имён при ленивой инициализации. Если параметр в массиве, но ветки для него в коде нет, — причина ошибки найдена.
Диагностика по симптомам
Если нужно проверить значение у работающего пользователя без отладчика, временно запишите его в журнал регистрации через ЗаписьЖурналаРегистрации в модуле сеанса. После диагностики уберите запись.
Частые вопросы о параметрах сеанса
Можно ли добавить параметр сеанса в расширение?
Меняется ли параметр у других пользователей, если я его установил?
Можно ли использовать параметр сеанса в обычном запросе?
&Имя — только в тексте ограничения доступа. В обычный запрос значение передают методом УстановитьПараметр.