Параметры сеанса в 1С 8.3: объявление, заполнение, права и разбор ошибок
Содержание
Параметры сеанса в 1С устанавливают в модуле сеанса, в процедуре УстановкаПараметровСеанса(ТребуемыеПараметры). Сначала параметр объявляют в конфигураторе в ветке Общие → Параметры сеанса и задают ему тип. Затем в коде присваивают значение: ПараметрыСеанса.ТекущийПользователь = .... Значение живёт, пока жив сеанс, и у каждого сеанса оно своё.
Это механизм платформы 1С:Предприятие 8.3, он одинаков для любой конфигурации. Разница только в том, что в типовых решениях (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) заполнение уже встроено через Библиотеку стандартных подсистем, и править модуль сеанса там напрямую не нужно.
Что такое параметр сеанса и как его объявить в конфигураторе
Параметр сеанса — это именованное значение, которое платформа хранит на сервере для одного конкретного сеанса пользователя. Типичные примеры:
- 👤 текущий пользователь — ссылка на элемент справочника;
- 🏢 список организаций, к которым у пользователя есть доступ;
- 🧭 режим работы, переданный при запуске (например, «касса» или «склад»);
- 🔑 флаги, которые используют ограничения доступа на уровне записей.
Чтобы добавить параметр:
- Откройте конфигуратор, дерево конфигурации.
- Разверните ветку
Общие → Параметры сеанса. - Нажмите «Добавить», задайте имя латиницей или кириллицей без пробелов, например
ТекущаяОрганизация. - На вкладке свойств выберите тип: ссылку на справочник, строку, число, булево.
- Обновите конфигурацию базы данных (F7).
Для коллекций обычные Массив или Структура не подойдут. Используйте фиксированные типы: ФиксированныйМассив, ФиксированнаяСтруктура, ФиксированноеСоответствие.
Сразу после создания откройте нужные роли и выставьте у параметра права «Получение» и «Установка». Без права «Получение» пользователь не сможет даже прочитать значение вне привилегированного режима.
Как установить параметры сеанса в модуле сеанса
Модуль сеанса открывается из контекстного меню корня конфигурации. Он выполняется на сервере и в привилегированном режиме, поэтому проверка прав внутри него не мешает.
Платформа вызывает УстановкаПараметровСеанса в двух случаях:
| Когда вызывается | Что приходит в ТребуемыеПараметры | Что делать |
|---|---|---|
| При старте сеанса | Неопределено | Заполнить то, что нужно всегда, или ничего |
| При первом обращении к незаполненному параметру | Массив имён параметров | Заполнить именно эти параметры |
Второй случай — это ленивая инициализация. Если параметр не нужен в сеансе, платформа его не считает. Это главный приём для быстрого старта программы.
Рабочий пример для собственной конфигурации:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры = Неопределено Тогда
// Старт сеанса: ничего не считаем заранее.
// Каждый параметр заполнится при первом обращении к нему.
Возврат;
КонецЕсли;
Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
Если ИмяПараметра = "ТекущийПользователь" Тогда
ИмяПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
ПараметрыСеанса.ТекущийПользователь =
Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователяИБ, Истина);
ИначеЕсли ИмяПараметра = "РежимЗапуска" Тогда
// Значение по умолчанию; реальное придёт с клиента.
ПараметрыСеанса.РежимЗапуска = "";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Здесь важно правило: каждое имя из массива ТребуемыеПараметры должно получить значение. Если хоть одно останется пустым, при обращении к нему программа выдаст ошибку о том, что значение параметра сеанса не установлено.
Внутри обработчика не читайте параметр, который ещё не заполнен. Платформа снова вызовет УстановкаПараметровСеанса изнутри самой себя, и вы получите рекурсию или ошибку. Порядок заполнения выстраивайте так, чтобы зависимые параметры шли после тех, от которых зависят.
Если конфигурация типовая
В Бухгалтерии, ЗУП, УТ модуль сеанса передаёт управление в БСП: вызывается СтандартныеПодсистемыСервер.УстановкаПараметровСеанса(ТребуемыеПараметры). Свои параметры там добавляют не правкой этой процедуры, а через переопределяемый модуль ОбщегоНазначенияПереопределяемый, процедуру ПриДобавленииОбработчиковУстановкиПараметровСеанса. В ней регистрируют имя параметра и процедуру, которая его заполнит.
Правку лучше вынести в расширение конфигурации . Тогда обновление типовой не затрёт ваш код, и снимать конфигурацию с поддержки не придётся.
Установка параметров сеанса при запуске: ключ /C, тонкий и веб-клиент
Частая задача — открыть базу
в определённом режиме прямо из ярлыка. Для этого служит ключ командной строки /C. Строку после него платформа кладёт в глобальную переменную ПараметрЗапуска, доступную на клиенте.
Пример ярлыка тонкого клиента :
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"D:\Bases\Shop" /N"Кассир1" /C"РежимКассы"
Сам параметр сеанса из клиентского кода не установить: в управляемом приложении объект ПараметрыСеанса на клиенте недоступен. Поэтому значение передают на сервер.
Модуль управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
Если ЗначениеЗаполнено(ПараметрЗапуска) Тогда
ПараметрыСеансаВызовСервера.ЗапомнитьРежимЗапуска(ПараметрЗапуска);
КонецЕсли;
КонецПроцедуры
Общий модуль ПараметрыСеансаВызовСервера с флажками «Сервер» и «Вызов сервера»:
Процедура ЗапомнитьРежимЗапуска(Знач Режим) Экспорт
ДопустимыеРежимы = СтрРазделить("РежимКассы,РежимСклада", ",");
Если ДопустимыеРежимы.Найти(Режим) = Неопределено Тогда
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ПараметрыСеанса.РежимЗапуска = Режим;
КонецПроцедуры
Серверный вызов с привилегированным режимом может дёрнуть любой клиент. Всегда проверяйте входящее значение по списку допустимых, как в примере. Иначе пользователь подставит в /C что угодно и обойдёт ваши ограничения.
Другой вариант — дать роли право «Установка» на этот параметр и обойтись без УстановитьПривилегированныйРежим. Он проще, но тогда проверка значения тем более обязательна.
Веб-клиент
В веб-клиенте командной строки нет, ключи передают в адресе публикации. Строка для ПараметрЗапуска задаётся так:
https://server/shop/?C=РежимКассы
Дальше работает тот же код из модуля управляемого приложения. Кириллицу в адресе браузер закодирует сам, но в ссылках для рассылки надёжнее использовать латинские значения: ?C=Cashier.
Ключи запуска, которые пригодятся
| Ключ | Что делает | Когда нужен |
|---|---|---|
/C"строка" | Передаёт строку в ПараметрЗапуска | Режим работы, имя рабочего места |
/N"имя" /P"пароль" | Пользователь и пароль | Автоматический вход, служебные ярлыки |
/UC"код" | Код разрешения входа | Вход при включённой блокировке сеансов |
/DisableStartupMessages | Подавляет стартовые предупреждения | Запуск по расписанию |
/DisableStartupDialogs | Убирает диалоги при старте | Скрипты и обработки без участия человека |
/ClearCache | Очищает кэш клиента | После обновления, при странном поведении форм |
Права, ограничение доступа и блокировки
Права на параметры сеанса настраивают в ролях, как и на любой объект метаданных. Их два:
- 👁 Получение — чтение значения в обычном (непривилегированном) коде;
- ✏️ Установка — запись значения вне модуля сеанса и привилегированного режима.
Параметры сеанса в RLS
Главное применение параметров — ограничение доступа на уровне записей. В тексте ограничения роли параметр сеанса пишут через амперсанд:
ГДЕ Организация В (&ДоступныеОрганизации)
Здесь ДоступныеОрганизации — параметр сеанса типа ФиксированныйМассив. Платформа подставит его значение в каждый запрос к таблице, и пользователь увидит только свои организации.
В обычных запросах так не получится. В тексте запроса &Имя — это параметр запроса, а не сеанса. Значение передают явно:
Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
Изоляция сеансов и блокировки
Значения параметров изолированы: сеанс кассира не видит значения сеанса бухгалтера, даже если оба вошли под одним пользователем. Поэтому параметр сеанса нельзя использовать как общую «переменную» для всех пользователей. Для общего значения нужны константа или регистр сведений .
К блокировкам параметры сеанса прямого отношения не имеют, но рядом с ними настраивают ещё две вещи:
- Режим управления блокировкой данных — свойство самой конфигурации (корень дерева, палитра свойств): автоматический, управляемый или смешанный. Для работы на сервере с несколькими пользователями обычно выбирают управляемый.
- Блокировка начала сеансов — запрет на вход новым пользователям. Её включают в консоли кластера, в свойствах информационной базы: флажок блокировки, текст сообщения и код разрешения. В типовых конфигурациях то же самое есть в разделе
Администрированиепо ссылке «Блокировка работы пользователей».
Включённая блокировка с завершением активных сеансов обрывает работу пользователей без сохранения. Предупредите людей заранее и включайте её вне рабочего времени. Сами вы войдёте в базу с ключом /UC и кодом разрешения.
Как параметры сеанса влияют на производительность
Правильно настроенные параметры ускоряют работу, неправильные — тормозят каждый запрос.
Что помогает:
- ⚡ Ленивая инициализация. Не заполняйте всё при
ТребуемыеПараметры = Неопределено. Каждый расчёт при старте добавляет время входа каждому пользователю. - 🗂 Хранение вычисленного, а не сырого. Положите в параметр готовую ссылку или массив, чтобы не повторять запрос при каждом обращении.
- 🔁 Альтернатива для справочных данных — общий модуль с повторным использованием возвращаемых значений «На время сеанса». Он кэширует результат функции и не требует объявлять параметр в метаданных.
Что вредит:
- 🐢 Большие массивы в RLS. Если в
ДоступныеОрганизациилежат тысячи элементов, условиеВ (...)попадёт в каждый запрос к защищённым таблицам. Лучше ограничивать через группы доступа или регистр сопоставления. - 🧱 Тяжёлые запросы в обработчике. Любая ошибка или долгий расчёт в
УстановкаПараметровСеансасрабатывает в момент, когда пользователь открывает документ, и выглядит как «зависание формы». - 📦 Хранилище значений с крупными данными. Параметр живёт в памяти сервера весь сеанс; сто сеансов умножат объём в сто раз.
Пример: медленный вход в базу
Представьте базу на 40 пользователей, где вход занимает около 20 секунд. В обработчике при старте сеанса заполняются сразу пять параметров, и один из них собирает по регистру все склады пользователя. Перенос этого расчёта в ленивую ветку убирает его из входа: склады считаются только у тех, кто открывает складские документы.
Фоновые и регламентные задания выполняются в своих сеансах. Значения из сеанса пользователя туда не переходят: обработчик заполнения сработает заново. Нужные данные передавайте в параметрах фонового задания.
Диагностика: почему параметр сеанса не устанавливается
Начинайте с отладчика. Поставьте точку останова в УстановкаПараметровСеанса, затем в табло вычислите ПараметрыСеанса.ИмяПараметра. Если точка не срабатывает — значит, параметр уже заполнен или к нему никто не обращается.
Если отладка на сервере не включена, то в клиент-серверном варианте её включают в настройках службы сервера, а в файловой базе достаточно запуска из конфигуратора.
После любой правки модуля сеанса нужен полный перезапуск клиента. Уже открытые сеансы продолжат работать со старыми значениями до выхода.
Если для проверки придётся завершить сеансы пользователей в консоли кластера, их несохранённые данные пропадут. Делайте это после предупреждения или в нерабочее время.