Параметры сеанса в конфигурации 1С 8.3: установка в модуле сеанса, права, RLS и отладка

· 9 мин

Содержание

Параметр сеанса в 1С — это объект метаданных из ветки Общие → Параметры сеанса, значение которого живёт ровно столько, сколько живёт сеанс пользователя. Значение задают в модуле сеанса в процедуре УстановкаПараметровСеанса, а читают на сервере через ПараметрыСеанса.Имя. Главное назначение — хранить «кто я и в каком контексте работаю» (текущий пользователь, организация, режим) и подставлять эти значения в ограничения доступа на уровне записей.

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

Что такое параметр сеанса и зачем он конфигурации

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

Для чего параметры сеанса применяют на практике:

  • 👤 Текущий пользователь — ссылка на элемент справочника Пользователи. В конфигурациях на БСП это параметр ТекущийПользователь.
  • 🔒 Ограничение доступа на уровне записей (RLS) — в тексте ограничения можно обращаться к параметру сеанса через &Имя. Это основной и самый важный сценарий.
  • 🏢 Контекст работы — основная организация, подразделение, признак «работа в режиме обмена», текущая область данных в разделённой базе.
  • ⚙️ Флаги поведения — например, «идёт загрузка данных, проверки отключены». Такой флаг ставят в начале операции и снимают в конце.
  • 🧪 Отладка и тестирование — признак тестового режима, при котором часть кода пишет подробный журнал или обходит внешние сервисы.

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

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

Шаг 1. Описать параметр в конфигураторе

  1. Откройте конфигурацию: Конфигурация → Открыть конфигурацию.
  2. В дереве метаданных раскройте Общие → Параметры сеанса.
  3. Добавьте новый элемент, задайте имя (например, ТекущийМенеджер) и тип (СправочникСсылка.Пользователи).
  4. Сохраните конфигурацию.

Тип выбирайте самый узкий. Для ссылки на пользователя — именно СправочникСсылка.Пользователи, а не составной тип «на всякий случай».

Имя давайте такое, чтобы по нему было понятно содержимое без открытия модуля сеанса: ТекущийМенеджер, ОсновнаяОрганизация, РежимЗагрузкиДанных. В доработках типовых добавляйте префикс своей компании, чтобы имя не совпало с параметром из будущего релиза.

Шаг 2. Выдать права в ролях

У параметра сеанса в ролях есть два права: Получение и Установка. Без права «Получение» чтение ПараметрыСеанса.ТекущийМенеджер под обычным пользователем закончится ошибкой с текстом Нарушение прав доступа!.

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

Шаг 3. Установить значение в модуле сеанса

Модуль сеанса открывается из контекстного меню корня конфигурации. Платформа вызывает в нём обработчик УстановкаПараметровСеанса с параметром ТребуемыеПараметры:

  • при старте сеанса в нём Неопределено;
  • при первом обращении к ещё не установленному параметру — массив строк с именами параметров, которые нужно заполнить.

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

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

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

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

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

Функция НайтиПользователяПоИмени(Имя)
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Пользователи.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Пользователи КАК Пользователи
	|ГДЕ
	|	Пользователи.Наименование = &Имя";
	Запрос.УстановитьПараметр("Имя", Имя);
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Ссылка;
	КонецЕсли;
	Возврат Справочники.Пользователи.ПустаяСсылка();
КонецФункции

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

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

Шаг 4. Прочитать значение в коде

&НаСервере
Процедура ЗаполнитьОтветственного()
	Объект.Ответственный = ПараметрыСеанса.ТекущийМенеджер;
КонецПроцедуры

Читать и писать ПараметрыСеанса можно на сервере, в толстом клиенте и во внешнем соединении. В тонком и веб-клиенте этого свойства нет: нужно вызвать серверную процедуру и вернуть значение оттуда.

Установить значение можно и вне модуля сеанса — из любого серверного кода с правом «Установка» или в привилегированном режиме. Так делают с флагами вроде РежимЗагрузкиДанных.

Типовые конфигурации на БСП

В БП 3.0, ЗУП 3.1, УТ 11 модуль сеанса почти пустой: он передаёт управление в СтандартныеПодсистемыСервер.УстановкаПараметровСеанса(ТребуемыеПараметры). Свои параметры БСП заполняет сама, а прикладные подключаются через обработчики подсистем. Дорабатывая типовую, не переписывайте модуль сеанса целиком — добавьте свою ветку для своего параметра, лучше в расширении.

Параметры сеанса, глобальные переменные и другие способы хранения

Под «запомнить значение на время работы» в 1С подходит несколько механизмов. Путать их не стоит: у каждого своё место исполнения и время жизни.

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

Ключевые отличия параметра сеанса от глобальной переменной:

  • 🖥️ Глобальная переменная клиентского модуля недоступна на сервере. Параметр сеанса — серверный объект.
  • 🔐 На параметр сеанса можно ссылаться в тексте ограничения доступа. Переменную туда не передать никак.
  • 🛡️ На параметр раздаются права, а глобальную переменную может поменять любой клиентский код.

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

Практические сценарии применения

Ограничение доступа по менеджеру

В роли «Менеджер» у справочника Контрагенты в ограничении доступа на чтение пишут условие:

ГДЕ ОсновнойМенеджер = &ТекущийМенеджер

Платформа подставит значение параметра сеанса текущего пользователя. Отбор работает в любом запросе, отчёте и списке без доработки кода.

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

Флаг режима загрузки

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

ПараметрыСеанса.РежимЗагрузкиДанных = Истина;
Попытка
	ЗагрузитьДокументы(Данные);
Исключение
	ПараметрыСеанса.РежимЗагрузкиДанных = Ложь;
	ВызватьИсключение;
КонецПопытки;
ПараметрыСеанса.РежимЗагрузкиДанных = Ложь;

Флаг обязательно снимают и при ошибке, иначе до конца сеанса пользователь работает без проверок.

Контекст для фоновых заданий и обмена

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

Признак тестового режима

Параметр ТестовыйРежим типа Булево заполняют по ключу запуска или по роли пользователя. Код отправки во внешние сервисы проверяет его и вместо реальной отправки пишет в журнал регистрации. На рабочей базе параметр всегда Ложь.

Где хранить значение?

Ограничения параметров сеанса

  • 📦 Тип значения. Параметр хранит сериализуемые значения: примитивы, ссылки, фиксированные коллекции (ФиксированныйМассив, ФиксированнаяСтруктура), ХранилищеЗначения. Обычный массив или таблицу значений напрямую не положить — их заворачивают в фиксированную коллекцию или в хранилище.
  • 🔁 Фиксированные коллекции неизменяемы. Чтобы добавить элемент в ФиксированныйМассив из параметра, создают обычный массив, меняют его и записывают новый фиксированный.
  • 🐢 Частая запись. В клиент-серверном варианте данные сеанса хранятся кластером. Запись параметра в цикле на каждую строку — заметная лишняя нагрузка. Пишите один раз, читайте сколько угодно.
  • 🧱 Объём. Кладите туда ссылки и короткие значения, а не выгрузки на мегабайты.
  • 🚫 Нет на тонком клиенте. Любое чтение — через серверный вызов.
  • 🔄 Нет наследования. Фоновые задания, внешние соединения и сеансы обмена получают свои значения из модуля сеанса.

Альтернативы для случаев, когда эти ограничения мешают, приведены в таблице выше.

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

Посмотреть текущее значение

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

В клиент-серверной базе остановка в серверном коде сработает, только если отладка на сервере включена. Без этого отладчик пропустит точки в серверных модулях.

Поймать момент установки

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

Диагностика по симптомам

Диагностика: выберите симптом

Если нужно проверить значение у работающего пользователя без отладчика, временно запишите его в журнал регистрации через ЗаписьЖурналаРегистрации в модуле сеанса. После диагностики уберите запись.

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

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