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

· 9 мин

Содержание

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

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

Зачем нужен параметр сеанса и чем он отличается от других способов хранить значение

У параметра сеанса три свойства, которых нет у обычной переменной модуля:

  • 🔒 значение доступно в шаблонах и условиях RLS (ограничения доступа к данным на уровне записей);
  • 🧭 значение одно на весь сеанс и видно во всех серверных вызовах, а не только в одном модуле;
  • 🛡️ чтение и установку можно ограничить правами ролей.

Если ни одно из этих свойств не нужно, часто удобнее другие механизмы. Сравнение:

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

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

Как объявить параметр сеанса в конфигураторе

Начните с описания объекта метаданных. Это занимает пару минут.

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

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

Значение параметра сеанса не может меняться «изнутри», поэтому изменяемые коллекции туда не кладут. Допустимы:

  • 🔢 примитивы: Строка, Число, Дата, Булево;
  • 📎 ссылки на объекты: СправочникСсылка.Организации, СправочникСсылка.Пользователи и т.п.;
  • 📦 фиксированные коллекции: ФиксированныйМассив, ФиксированнаяСтруктура, ФиксированноеСоответствие;
  • 🗄️ ХранилищеЗначения, если нужно положить что-то нестандартное.

Составной тип тоже разрешён. Например, ссылка на пользователя или на внешнего пользователя — так сделано в типовых конфигурациях на БСП.

Массив, Структура, ТаблицаЗначений в список типов параметра сеанса не входят. Нужен список — используйте ФиксированныйМассив и собирайте его из обычного массива.

Права ролей

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

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

Заполнение значения при входе: модуль сеанса

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

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

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

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

Логика вызова такая:

  • при старте сеанса платформа вызывает процедуру с параметром Неопределено;
  • если код обратился к параметру, который ещё не заполнен, платформа вызывает процедуру повторно и передаёт массив имён недостающих параметров.

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

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

Если конфигурация построена на БСП

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

  1. Откройте общий модуль ОбщегоНазначенияПереопределяемый.
  2. Найдите процедуру ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики).
  3. Добавьте строку соответствия «имя параметра → процедура-обработчик»:
Обработчики.Вставить("ТекущаяОрганизация", "МойМодульСервер.УстановкаПараметровСеанса");
  1. В своём общем серверном модуле опишите экспортную процедуру:
Процедура УстановкаПараметровСеанса(Знач ИмяПараметра, УстановленныеПараметры) Экспорт

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

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

Строка УстановленныеПараметры.Добавить(...) сообщает библиотеке, что параметр заполнен, и обработчик не будет вызван ещё раз.

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

Чтение параметра на сервере и на клиенте

Объект ПараметрыСеанса существует только на сервере. На клиенте строка ПараметрыСеанса.ТекущаяОрганизация вызовет ошибку компиляции или выполнения.

На сервере

В модуле объекта, менеджера, в серверной процедуре формы или в серверном общем модуле пишите напрямую:

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

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

В запросах

В обычный запрос параметр сеанса сам не подставляется. Передайте его явно:

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

В ограничениях доступа (RLS)

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

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

Это главная причина, по которой разработчики заводят параметры сеанса.

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

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

На клиенте

Сделайте серверную функцию в общем модуле с флагами «Сервер» и «Вызов сервера»:

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

С клиента вызывайте МойМодульВызовСервера.ТекущаяОрганизация(). Каждый такой вызов — обращение к серверу. Если значение нужно часто, поставьте модулю повторное использование «На время сеанса» или получите значение один раз при открытии формы и сохраните в реквизит формы.

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

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

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

Без привилегированного режима нужно право «Установка» у роли пользователя.

Сброс к исходному значению

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

Изменение содержимого фиксированной коллекции

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

Настройки = Новый Структура(ПараметрыСеанса.НастройкиОбмена);
Настройки.Вставить("РежимЗагрузки", Истина);
ПараметрыСеанса.НастройкиОбмена = Новый ФиксированнаяСтруктура(Настройки);

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

Где видно значение и сколько оно живёт

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

Практические следствия:

  • 👥 у каждого пользователя свои значения, даже под одной учётной записью в двух окнах — это два сеанса;
  • ⚙️ фоновое задание — отдельный сеанс: в нём модуль сеанса отрабатывает заново, а значения, которые вы поменяли в сеансе пользователя на лету, туда не переходят. Нужное значение передайте параметром задания;
  • 🌐 веб-сервисы и HTTP-сервисы тоже открывают сеансы, и модуль сеанса для них выполняется;
  • 🔁 при повторном использовании сеансов HTTP-сервиса значения могут сохраниться от предыдущего вызова — не полагайтесь на «чистый» старт.
Где выполняется кодДоступ к ПараметрыСеанса
Сервер (модули объектов, менеджеров, серверные общие модули)Да
Форма, директивы &НаСервере, &НаСервереБезКонтекстаДа
Форма, &НаКлиентеНет, только через вызов сервера
Модуль приложения, клиентские общие модулиНет
Текст ограничения доступа ролиДа, через &Имя
Фоновое заданиеДа, но значения инициализируются заново

Ошибки при работе с параметрами сеанса и как их избежать

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

Несколько правил, которые экономят время на отладке:

  • 📏 Кладите в параметр сеанса маленькие значения: ссылку, флаг, короткую строку. Данные сеанса хранятся на сервере 1С и передаются между рабочими процессами, большой объём замедляет работу.
  • 🧩 Не ставьте параметру сеанса роль глобального кэша для таблиц и выборок. Для этого есть модули с повторным использованием.
  • 🔄 Обработчик установки должен быть идемпотентным: повторный вызов даёт тот же результат и не пишет в базу.
  • 🚫 Не пишите в модуле сеанса код, который может упасть на пустой базе (первый запуск, загрузка .dt). Ошибка в УстановкаПараметровСеанса не даст войти в программу никому.
  • 🧪 После добавления параметра проверьте вход под пользователем с минимальной ролью, а не только под администратором: администратор с полными правами скрывает проблемы с правом «Получение».

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

Можно ли добавить параметр сеанса без снятия конфигурации с поддержки?
Да. Объявите параметр сеанса в расширении конфигурации и заполните его через перехват процедуры БСП ПриДобавленииОбработчиковУстановкиПараметровСеанса с аннотацией &После.
Сохраняется ли значение параметра сеанса после перезапуска 1С?
Нет. Значение живёт только в текущем сеансе. Если нужно запомнить выбор пользователя, сохраните его в хранилище настроек, а при входе читайте оттуда в обработчике установки.
Почему в фоновом задании параметр сеанса другой, чем у пользователя?
Фоновое задание запускается в новом сеансе, и значения заполняются заново модулем сеанса. Передавайте нужное значение в задание параметром.
Можно ли использовать параметр сеанса в схеме компоновки данных?
Напрямую — нет. Заполните параметр СКД в коде значением из ПараметрыСеанса на сервере. RLS при этом применяется к данным отчёта автоматически.
Сколько параметров сеанса можно создать?
Жёсткого практического предела нет: в типовых конфигурациях их десятки. Ограничивайте не количество, а объём данных в каждом параметре.