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

· 9 мин

Содержание

Параметр сеанса в 1С устанавливают на сервере простым присваиванием: ПараметрыСеанса.ТекущаяОрганизация = Организация;. Штатное место для этого — процедура УстановкаПараметровСеанса(ТребуемыеПараметры) в модуле сеанса. Платформа вызывает её при старте сеанса и каждый раз, когда код читает параметр, которому ещё не присвоено значение.

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

Что такое параметр сеанса и сколько он живёт

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

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

МеханизмГде хранитсяКто видитСколько живёт
Параметр сеансана сервере, в данных сеансатолько этот сеансдо завершения сеанса
Константав базевсе пользователипока не изменят
Глобальная переменная модуля приложенияна клиентетолько клиент этого сеансадо закрытия клиента
Модуль с повторным использованиемкэш на клиенте или сервереэтот сеанспо времени кэша или до конца сеанса
Хранилище настроекв базепо пользователюпока не удалят

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

  • 👤 текущий пользователь (ссылка на элемент справочника Пользователи);
  • 🏢 организация или подразделение, с которыми человек работает весь день;
  • 🔒 значения для ограничения доступа на уровне записей (RLS);
  • ⚙️ признаки режима работы: обмен, загрузка данных, работа в модели сервиса.

Главное свойство, ради которого их заводят, — доступ из текста ограничений RLS. Константу или переменную модуля в шаблон ограничения не подставить, а параметр сеанса подставляется через &ИмяПараметра.

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

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

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

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

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

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

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

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

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

	// Ленивая установка: платформа передала имена параметров,
	// к которым обратились, но которые ещё пусты
	Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
		Если ИмяПараметра = "ТекущаяОрганизация" Тогда
			ПараметрыСеанса.ТекущаяОрганизация = ОрганизацияПоУмолчанию();
		КонецЕсли;
	КонецЦикла;

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

Функция ОрганизацияПоУмолчанию()

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

	Если Выборка.Следующий() Тогда
		Возврат Выборка.Ссылка;
	КонецЕсли;
	Возврат Справочники.Организации.ПустаяСсылка();

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

Как платформа вызывает обработчик:

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

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

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

Синтаксис присваивания и смена значения в работе

Кроме модуля сеанса, значение можно поменять в любом серверном коде. Синтаксис тот же:

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

Типичная задача — пользователь выбрал на начальной странице другую организацию, и весь дальнейший учёт должен идти от неё. Клиентский код сам параметр не видит: в тонком клиенте и веб-клиенте объекта ПараметрыСеанса нет вообще. Нужен серверный вызов.

Общий модуль РаботаСПараметрамиСеанса, флажки Сервер и Вызов сервера:

Процедура УстановитьТекущуюОрганизацию(Организация) Экспорт

	Если Не ЗначениеЗаполнено(Организация) Тогда
		ВызватьИсключение НСтр("ru = 'Не выбрана организация'");
	КонецЕсли;

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

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

Функция ТекущаяОрганизация() Экспорт

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

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

Вызов из формы:

&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
	РаботаСПараметрамиСеанса.УстановитьТекущуюОрганизацию(Объект.Организация);
КонецПроцедуры

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

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

Как это работает в клиент-серверном варианте

Значения параметров сеанса хранит сервер 1С в данных сеанса. В файловом варианте логика та же, просто «сервер» работает внутри процесса клиента.

Что из этого следует для разработчика:

  • 🖥️ Тонкий клиент и веб-клиент. Прямого доступа нет. Только через серверную функцию, как в примере выше.
  • 🧱 Толстый клиент, обычное приложение. ПараметрыСеанса доступны и в клиентском коде, но переносить такой код в управляемое приложение придётся с переделкой. Лучше сразу писать через сервер.
  • 🔁 Фоновые задания. Каждое задание — отдельный сеанс. Параметры родительского сеанса оно не наследует: для него снова сработает УстановкаПараметровСеанса. Нужное значение передавайте в параметрах задания и при необходимости присваивайте в начале процедуры задания.
  • 🔌 Внешнее соединение, HTTP-сервисы, регламентные задания. Тоже самостоятельные сеансы со своей инициализацией. Пользователь в регламентном задании может быть не задан, поэтому код установки должен это переживать без ошибки.

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

Установка параметров сеанса в конфигурациях на БСП

В БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на Библиотеке стандартных подсистем модуль сеанса уже занят. Он передаёт управление в СтандартныеПодсистемыСервер.УстановкаПараметровСеанса. Править модуль сеанса типовой конфигурации не нужно: это усложнит обновления.

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

Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт

	Обработчики.Вставить("ТекущаяОрганизация",
		"МойМодульСервер.УстановкаПараметровСеанса");

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

Сам обработчик в своём серверном общем модуле:

Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт

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

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

Добавление имени в УстановленныеПараметры сообщает БСП, что параметр готов. В ключе соответствия можно указать маску со звёздочкой, например "МойПрефикс*", тогда один обработчик будет отвечать за группу параметров.

В доработках через расширение параметр сеанса добавляют в самом расширении. Подписку на установку делают так же, через заимствованный ОбщегоНазначенияПереопределяемый и аннотацию &После к процедуре ПриДобавленииОбработчиковУстановкиПараметровСеанса. Типовой код остаётся нетронутым.

Параметр сеанса в запросах и ограничениях доступа

В тексте ограничения доступа на уровне записей параметр сеанса пишут через амперсанд:

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

Платформа подставит значение сама. Если параметр пуст в момент проверки, сработает ленивая установка из модуля сеанса.

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

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

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

Ошибки при установке и чтении параметров

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

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

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

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

Что помогает:

  1. Ленивая установка. При ТребуемыеПараметры = Неопределено ставьте минимум. Остальное — по требованию, через массив имён.
  2. Лёгкие значения. Храните ссылку, а не структуру с десятком полей. Реквизиты по ссылке дочитывайте там, где они нужны.
  3. Редкая запись. Каждое присваивание меняет данные сеанса на сервере. Не перезаписывайте параметр в цикле и не используйте его как счётчик.
  4. Кэш на клиенте. Если клиенту значение нужно часто, оберните чтение в общий модуль с повторным использованием возвращаемых значений на время сеанса. Тогда серверный вызов будет один. При смене значения кэш сбрасывают методом ОбновитьПовторноИспользуемыеЗначения().
  5. Нет запросов к внешним системам. HTTP-запрос в обработчике установки при недоступном сервисе затянет вход на время таймаута.

Когда параметр сеанса НЕ нужен:

  • значение требуется в одной форме — хватит реквизита формы;
  • значение общее для всех пользователей — это константа;
  • значение должно пережить перезапуск программы — это настройка пользователя в хранилище настроек.

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

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