Параметр сеанса в 1С 8.3: объявить, заполнить при входе и читать на сервере
Содержание
Чтобы добавить параметр сеанса в 1С, откройте конфигуратор, в дереве метаданных разверните ветку Общие → Параметры сеанса, нажмите «Добавить», задайте имя и тип. Затем пропишите заполнение значения в модуле сеанса, в процедуре УстановкаПараметровСеанса, и дайте ролям право на получение. После этого значение читается на сервере как ПараметрыСеанса.ИмяПараметра.
Параметр сеанса — это переменная, которая живёт ровно один сеанс пользователя. Её заполняют один раз при входе и потом читают из любого серверного кода и из ограничений доступа на уровне записей. Типичный пример — текущий пользователь, текущая организация, признак «работаем в режиме обмена».
Зачем нужен параметр сеанса и чем он отличается от других способов хранить значение
У параметра сеанса три свойства, которых нет у обычной переменной модуля:
- 🔒 значение доступно в шаблонах и условиях RLS (ограничения доступа к данным на уровне записей);
- 🧭 значение одно на весь сеанс и видно во всех серверных вызовах, а не только в одном модуле;
- 🛡️ чтение и установку можно ограничить правами ролей.
Если ни одно из этих свойств не нужно, часто удобнее другие механизмы. Сравнение:
| Механизм | Где живёт значение | Когда подходит |
|---|---|---|
| Параметр сеанса | Данные сеанса на сервере | Нужен в RLS, нужен контроль прав, значение «на весь сеанс» |
| Общий модуль с повторным использованием «На время сеанса» | Кэш платформы | Вычисляемые справочные данные, без RLS |
| Константа | База данных | Значение общее для всех пользователей и переживает перезапуск |
| Хранилище общих настроек | База данных | Персональная настройка пользователя между сеансами |
| Глобальная переменная модуля приложения | Клиент | Только клиентские данные одного сеанса |
Если значение понадобится в ограничении доступа к данным, выбора нет: в тексте RLS работают только параметры сеанса.
Как объявить параметр сеанса в конфигураторе
Начните с описания объекта метаданных. Это занимает пару минут.
- Откройте конфигуратор и включите редактирование конфигурации:
Конфигурация → Поддержка → Настройка поддержки, если конфигурация на поддержке, либо сразу работайте в расширении. - В дереве метаданных разверните
Общие → Параметры сеанса. - Нажмите «Добавить» (или клавишу
Insert). - Заполните Имя латиницей или кириллицей без пробелов, например
ТекущаяОрганизация. Синоним — человекочитаемое название. - На вкладке типа выберите тип значения.
- Сохраните конфигурацию и обновите конфигурацию базы данных (
F7).
Какой тип выбрать
Значение параметра сеанса не может меняться «изнутри», поэтому изменяемые коллекции туда не кладут. Допустимы:
- 🔢 примитивы:
Строка,Число,Дата,Булево; - 📎 ссылки на объекты:
СправочникСсылка.Организации,СправочникСсылка.Пользователии т.п.; - 📦 фиксированные коллекции:
ФиксированныйМассив,ФиксированнаяСтруктура,ФиксированноеСоответствие; - 🗄️
ХранилищеЗначения, если нужно положить что-то нестандартное.
Составной тип тоже разрешён. Например, ссылка на пользователя или на внешнего пользователя — так сделано в типовых конфигурациях на БСП.
Массив, Структура, ТаблицаЗначений в список типов параметра сеанса не входят. Нужен список — используйте ФиксированныйМассив и собирайте его из обычного массива.
Права ролей
У каждой роли для параметра сеанса есть два права: Получение и Установка. Откройте нужную роль, найдите в дереве ветку Параметры сеанса и отметьте права.
Обычно пользователю дают только «Получение». Установку оставляют коду в привилегированном режиме.
Заполнение значения при входе: модуль сеанса
Значение задают в модуле сеанса. Откройте его так: правый клик по корню конфигурации → «Открыть модуль сеанса». В нём есть предопределённая процедура-обработчик:
Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса)
Если ИменаПараметровСеанса = Неопределено Тогда
// Вызов при старте сеанса: заполняем то, что нужно сразу
ПараметрыСеанса.ТекущаяОрганизация = ОрганизацияПоУмолчанию();
Иначе
// Ленивая инициализация: платформа просит конкретные параметры
Для Каждого Имя Из ИменаПараметровСеанса Цикл
Если Имя = "ТекущаяОрганизация" Тогда
ПараметрыСеанса.ТекущаяОрганизация = ОрганизацияПоУмолчанию();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Логика вызова такая:
- при старте сеанса платформа вызывает процедуру с параметром
Неопределено; - если код обратился к параметру, который ещё не заполнен, платформа вызывает процедуру повторно и передаёт массив имён недостающих параметров.
Второй вариант — ленивая инициализация. Она экономит время входа: тяжёлые параметры считаются только тогда, когда реально понадобились.
Модуль сеанса выполняется в привилегированном режиме. Поэтому внутри него не нужно отдельно давать право «Установка» и можно читать данные, на которые у пользователя нет прав.
Если конфигурация построена на БСП
В типовых конфигурациях (Бухгалтерия, ЗУП, УТ и другие на Библиотеке стандартных подсистем) модуль сеанса трогать не нужно. Там он передаёт управление в СтандартныеПодсистемыСервер.УстановкаПараметровСеанса, а обработчики регистрируются в переопределяемом модуле.
- Откройте общий модуль
ОбщегоНазначенияПереопределяемый. - Найдите процедуру
ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики). - Добавьте строку соответствия «имя параметра → процедура-обработчик»:
Обработчики.Вставить("ТекущаяОрганизация", "МойМодульСервер.УстановкаПараметровСеанса");
- В своём общем серверном модуле опишите экспортную процедуру:
Процедура УстановкаПараметровСеанса(Знач ИмяПараметра, УстановленныеПараметры) Экспорт
Если ИмяПараметра = "ТекущаяОрганизация" Тогда
ПараметрыСеанса.ТекущаяОрганизация = ОрганизацияПоУмолчанию();
УстановленныеПараметры.Добавить(ИмяПараметра);
КонецЕсли;
КонецПроцедуры
Строка УстановленныеПараметры.Добавить(...) сообщает библиотеке, что параметр заполнен, и обработчик не будет вызван ещё раз.
В типовой конфигурации на поддержке удобнее делать всё в расширении: объявить параметр сеанса там и перехватить процедуру ПриДобавленииОбработчиковУстановкиПараметровСеанса через аннотацию &После. Тогда обновления типовой не затрут вашу доработку.
Чтение параметра на сервере и на клиенте
Объект ПараметрыСеанса существует только на сервере. На клиенте строка ПараметрыСеанса.ТекущаяОрганизация вызовет ошибку компиляции или выполнения.
На сервере
В модуле объекта, менеджера, в серверной процедуре формы или в серверном общем модуле пишите напрямую:
Организация = ПараметрыСеанса.ТекущаяОрганизация;
У пользователя должно быть право «Получение». Если его нет и вы не в привилегированном режиме, будет ошибка нарушения прав доступа.
В запросах
В обычный запрос параметр сеанса сам не подставляется. Передайте его явно:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| Док.Организация = &Организация";
Запрос.УстановитьПараметр("Организация", ПараметрыСеанса.ТекущаяОрганизация);
В ограничениях доступа (RLS)
В тексте ограничения доступа роли параметр сеанса пишется через амперсанд, и платформа подставляет его сама:
ГДЕ Организация = &ТекущаяОрганизация
Это главная причина, по которой разработчики заводят параметры сеанса.
Пример из практики: у пользователя в карточке хранится основная организация. При входе обработчик кладёт её в ТекущаяОрганизация, а роль «Менеджер» получает ограничение на документы реализации по этому параметру. В итоге менеджер видит в списках, отчётах и подборах только документы своей организации — без единой строчки кода в формах.
Чтобы проверить, что подставляется в ограничение, остановитесь отладчиком в любой серверной процедуре и вычислите выражение ПараметрыСеанса.ТекущаяОрганизация в окне «Вычислить выражение» (Shift+F9). Если значение пустое, ограничение отфильтрует все строки, и пользователь увидит пустой список.
На клиенте
Сделайте серверную функцию в общем модуле с флагами «Сервер» и «Вызов сервера»:
Функция ТекущаяОрганизация() Экспорт
Возврат ПараметрыСеанса.ТекущаяОрганизация;
КонецФункции
С клиента вызывайте МойМодульВызовСервера.ТекущаяОрганизация(). Каждый такой вызов — обращение к серверу. Если значение нужно часто, поставьте модулю повторное использование «На время сеанса» или получите значение один раз при открытии формы и сохраните в реквизит формы.
Изменение значения во время работы
Значение можно поменять в любой момент из серверного кода. Пример: пользователь выбрал в форме другую организацию, и нужно, чтобы RLS и отчёты сразу работали по ней.
&НаСервереБезКонтекста
Процедура СменитьОрганизациюНаСервере(НоваяОрганизация)
УстановитьПривилегированныйРежим(Истина);
ПараметрыСеанса.ТекущаяОрганизация = НоваяОрганизация;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Без привилегированного режима нужно право «Установка» у роли пользователя.
Сброс к исходному значению
Метод ПараметрыСеанса.Очистить() сбрасывает значения. Ему можно передать имя параметра или массив имён. После сброса первое же обращение снова вызовет УстановкаПараметровСеанса, и значение пересчитается.
Изменение содержимого фиксированной коллекции
Поменять элемент внутри ФиксированнаяСтруктура нельзя. Схема всегда одна: скопировать в обычную коллекцию, изменить, зафиксировать и присвоить заново.
Настройки = Новый Структура(ПараметрыСеанса.НастройкиОбмена);
Настройки.Вставить("РежимЗагрузки", Истина);
ПараметрыСеанса.НастройкиОбмена = Новый ФиксированнаяСтруктура(Настройки);
Смена параметра, который участвует в RLS, сразу меняет видимость данных. Открытые формы списков могут показывать старые строки до обновления. Перед массовой сменой проверьте, что пользователь не потеряет доступ к документу, который сейчас редактирует.
Где видно значение и сколько оно живёт
Значение существует, пока жив сеанс. Закрыли программу, сеанс завершился по таймауту или его завершил администратор — значения пропадают. В базу они не записываются.
Практические следствия:
- 👥 у каждого пользователя свои значения, даже под одной учётной записью в двух окнах — это два сеанса;
- ⚙️ фоновое задание — отдельный сеанс: в нём модуль сеанса отрабатывает заново, а значения, которые вы поменяли в сеансе пользователя на лету, туда не переходят. Нужное значение передайте параметром задания;
- 🌐 веб-сервисы и HTTP-сервисы тоже открывают сеансы, и модуль сеанса для них выполняется;
- 🔁 при повторном использовании сеансов HTTP-сервиса значения могут сохраниться от предыдущего вызова — не полагайтесь на «чистый» старт.
| Где выполняется код | Доступ к ПараметрыСеанса |
|---|---|
| Сервер (модули объектов, менеджеров, серверные общие модули) | Да |
Форма, директивы &НаСервере, &НаСервереБезКонтекста | Да |
Форма, &НаКлиенте | Нет, только через вызов сервера |
| Модуль приложения, клиентские общие модули | Нет |
| Текст ограничения доступа роли | Да, через &Имя |
| Фоновое задание | Да, но значения инициализируются заново |
Ошибки при работе с параметрами сеанса и как их избежать
УстановкаПараметровСеанса не заполнил этот параметр. Проверьте, что имя параметра обрабатывается и в ветке Неопределено, и в цикле по ИменаПараметровСеанса. В БСП — что обработчик зарегистрирован в ПриДобавленииОбработчиковУстановкиПараметровСеанса и добавляет имя в УстановленныеПараметры.ПараметрыСеанса вызван в клиентском коде. Перенесите чтение в серверную функцию общего модуля с флагом «Вызов сервера».Массив вместо ФиксированныйМассив или ссылку другого справочника. Приведите значение к объявленному типу.ИменаПараметровСеанса.Несколько правил, которые экономят время на отладке:
- 📏 Кладите в параметр сеанса маленькие значения: ссылку, флаг, короткую строку. Данные сеанса хранятся на сервере 1С и передаются между рабочими процессами, большой объём замедляет работу.
- 🧩 Не ставьте параметру сеанса роль глобального кэша для таблиц и выборок. Для этого есть модули с повторным использованием.
- 🔄 Обработчик установки должен быть идемпотентным: повторный вызов даёт тот же результат и не пишет в базу.
- 🚫 Не пишите в модуле сеанса код, который может упасть на пустой базе (первый запуск, загрузка
.dt). Ошибка вУстановкаПараметровСеансане даст войти в программу никому. - 🧪 После добавления параметра проверьте вход под пользователем с минимальной ролью, а не только под администратором: администратор с полными правами скрывает проблемы с правом «Получение».
Частые вопросы
Можно ли добавить параметр сеанса без снятия конфигурации с поддержки?
ПриДобавленииОбработчиковУстановкиПараметровСеанса с аннотацией &После.Сохраняется ли значение параметра сеанса после перезапуска 1С?
Почему в фоновом задании параметр сеанса другой, чем у пользователя?
Можно ли использовать параметр сеанса в схеме компоновки данных?
ПараметрыСеанса на сервере. RLS при этом применяется к данным отчёта автоматически.