Параметры сеанса в 1С 8.3: объект метаданных, модуль сеанса и ограничения доступа

· 9 мин

Содержание

Параметр сеанса создают в конфигураторе: ветка Общие → Параметры сеанса, кнопка «Добавить», затем задают имя и тип. Значение ему присваивают кодом на сервере, обычно в процедуре УстановкаПараметровСеанса(ТребуемыеПараметры) модуля сеанса. Читают его так же, через глобальное свойство ПараметрыСеанса.ИмяПараметра.

Механизм одинаков для любой конфигурации на платформе 8.3: Бухгалтерии, ЗУП, УТ или собственной разработки. Разница только в том, куда вписать свой код: в основную конфигурацию или в расширение.

Зачем нужны параметры сеанса и чем они отличаются от констант

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

Типичные задачи:

  • 👤 Текущий пользователь как ссылка на элемент справочника. Её ищут один раз при входе, а потом берут готовой.
  • 🏢 Список доступных организаций или складов для ограничения доступа на уровне записей (RLS).
  • ⚙️ Флаги режима работы: «идёт обмен», «работает регламентное задание», «включена отладка».
  • 🌐 Данные о рабочем месте: код подразделения или филиала, к которому привязан компьютер.

Чем параметр сеанса отличается от соседних механизмов:

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

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

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

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

Шаги создания

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

Имя выбирайте так, чтобы оно читалось в тексте ограничений доступа: ДоступныеСклады понятнее, чем Склады1. Префикс вроде Мой_ или аббревиатура компании помогает отличить свои объекты от типовых. Переименовать параметр позже можно, но придётся править все роли и модули, где он упомянут, а глобальный поиск по строке в RLS-условиях легко что-то пропустить.

Какой тип выбрать

Параметр сеанса не может иметь произвольный тип. Допустимы:

  • 🔤 примитивные: Строка, Число, Дата, Булево;
  • 🔗 ссылки на объекты: СправочникСсылка.Организации, ДокументСсылка.… и другие;
  • 📦 ФиксированныйМассив и ФиксированнаяСтруктура;
  • 🗄 ХранилищеЗначения и УникальныйИдентификатор.

Составной тип тоже разрешён. А вот обычный Массив, Структура или ТаблицаЗначений записать в параметр нельзя: платформа требует неизменяемые значения. Нужен список — оберните его в Новый ФиксированныйМассив(Массив).

Для RLS чаще всего нужен ФиксированныйМассив ссылок. Тогда условие пишется как Организация В (&ДоступныеОрганизации), и одно правило покрывает и одного, и десять разрешённых объектов.

Права в ролях

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

ПравоЧто разрешает
ПолучениеЧитать значение из кода без привилегированного режима
УстановкаПрисваивать значение из кода без привилегированного режима

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

Модуль сеанса работает в привилегированном режиме сам по себе. Поэтому, если параметр заполняется только там, право «Установка» пользователям не нужно вовсе.

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

Модуль сеанса открывают из контекстного меню корня конфигурации: пункт «Открыть модуль сеанса». Внутри размещают обработчик УстановкаПараметровСеанса. Платформа вызывает его в двух случаях:

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

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

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

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

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

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

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

		ИначеЕсли ИмяПараметра = "РежимОбмена" Тогда
			ПараметрыСеанса.РежимОбмена = Ложь;

		КонецЕсли;

	КонецЦикла;

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

Функция НайтиПользователяСправочника()

	ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
	Найденный = Справочники.Пользователи.НайтиПоРеквизиту(
		"ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
	Возврат Найденный;

КонецФункции

Функция ПолучитьДоступныеОрганизации()

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

	Массив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Организация");
	Возврат Новый ФиксированныйМассив(Массив);

КонецФункции

Справочник Пользователи с реквизитом ИдентификаторПользователяИБ и регистр ДоступКОрганизациям здесь условные: подставьте объекты своей конфигурации.

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

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

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

В Бухгалтерии, ЗУП, УТ и других типовых решениях на Библиотеке стандартных подсистем модуль сеанса уже занят. Обработчик передаёт управление подсистемам, а те заполняют свои параметры.

Свой параметр в такой базе правильнее добавлять в расширении конфигурации:

  1. Создайте в расширении новый параметр сеанса (собственный объект расширения).
  2. Дайте права на него в роли расширения.
  3. В модуле сеанса расширения добавьте УстановкаПараметровСеанса и заполните там только свой параметр.

Так обновление типовой не затрёт вашу доработку.

Изменение параметра сеанса во время работы

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

&НаСервереБезКонтекста
Процедура СменитьОрганизациюНаСервере(НоваяОрганизация)

	УстановитьПривилегированныйРежим(Истина);
	ПараметрыСеанса.ТекущаяОрганизация = НоваяОрганизация;
	УстановитьПривилегированныйРежим(Ложь);

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

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

Сброс значений

Метод ПараметрыСеанса.Сбросить() очищает значения. Ему передают массив имён параметров, которые нужно сбросить. При следующем обращении к сброшенному параметру платформа снова вызовет УстановкаПараметровСеанса, и значение пересчитается.

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

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

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

Чтение параметров сеанса и информация о самом сеансе

Чтение — обычное обращение к свойству:

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

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

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

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

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

Самый быстрый способ проверить параметры — точка останова в любом серверном коде. В окне «Вычислить выражение» (Shift+F9) введите ПараметрыСеанса.ТекущаяОрганизация и посмотрите результат. Для фиксированного массива раскройте значение в табло: видно и количество элементов, и сами ссылки.

Если отладчик недоступен, например в рабочей базе, запишите значения в журнал регистрации:

ЗаписьЖурналаРегистрации("Отладка.ПараметрыСеанса",
	УровеньЖурналаРегистрации.Информация, , ,
	"Организация: " + Строка(ПараметрыСеанса.ТекущаяОрганизация));

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

Объект СеансИнформационнойБазы

Технические данные о сеансе хранятся не в параметрах сеанса, а в объекте СеансИнформационнойБазы. Его возвращает функция ПолучитьТекущийСеансИнформационнойБазы().

Сеанс = ПолучитьТекущийСеансИнформационнойБазы();
НомерСеанса = Сеанс.НомерСеанса;
Приложение = Сеанс.ИмяПриложения;  // например, "ThinClient" или "BackgroundJob"
Начало = Сеанс.НачалоСеанса;

Эти свойства задаёт платформа, менять их нельзя. Хотите хранить что-то своё на время сеанса — заводите параметр сеанса.

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

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

Обычный запрос

В тексте запроса нельзя напрямую сослаться на параметр сеанса. Значение передают как обычный параметр запроса:

Запрос.УстановитьПараметр("Организация", ПараметрыСеанса.ТекущаяОрганизация);

В англоязычном синтаксисе это Query.SetParameter() и SessionParameters. Отсюда встречающееся в описаниях название SetParameter.

Ограничение доступа к данным (RLS)

Здесь параметры сеанса подставляются сами. В роли, в ограничении права «Чтение» для документа, пишут:

ГДЕ Организация В (&ДоступныеОрганизации)

Имя после & совпадает с именем параметра сеанса. Платформа подставит значение текущего сеанса при каждом обращении к таблице.

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

Схема компоновки данных

В СКД значение тоже передают из кода. Например, в модуле отчёта перед формированием:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

	КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
		"Организация", ПараметрыСеанса.ТекущаяОрганизация);

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

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

Ограничения и частые ошибки

Что платформа не позволит сделать:

  • ❌ записать в параметр изменяемую коллекцию (Массив, Структура, ТаблицаЗначений);
  • ❌ установить значение на клиенте;
  • ❌ задать значение по умолчанию в свойствах объекта: начальное значение даёт только код;
  • ❌ сохранить значение между сеансами: после перезахода всё считается заново.
Диагностика: выберите симптом

Ещё одна ловушка — бесконечная рекурсия. Если функция заполнения параметра А читает параметр Б, а заполнение Б читает А, сеанс зависнет на старте или упадёт. Стройте зависимости в одну сторону: «пользователь → организации → склады».

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

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

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