Модуль сеанса: в каком процессе и с какими правами работает его код

· 9 мин

Содержание

Модуль сеанса в 1С 8.3 выполняется только на сервере и только в привилегированном режиме. В клиент-серверной базе его код работает в рабочем процессе rphost на сервере 1С:Предприятия. В файловой базе «сервером» служит сам процесс клиента (1cv8.exe, 1cv8c.exe), а для веб-клиента — процесс веб-сервера, где опубликована база.

На клиенте модуль сеанса не исполняется никогда. Поэтому директивы &НаКлиенте и &НаСервере в нём не пишут: контекст у модуля один, серверный. Его задача — заполнить параметры сеанса через обработчик УстановкаПараметровСеанса до того, как к ним обратится остальной код.

Зачем модулю сеанса отдельное место в архитектуре 1С

Конфигурация 1С делит код на модули с разным временем жизни и разным контекстом. Модуль сеанса стоит особняком: он один на всю конфигурацию и срабатывает для любого сеанса, а не только для пользователя с окном программы.

Что важно знать о нём в первую очередь:

  • 🧩 Один обработчик. Предопределённая процедура УстановкаПараметровСеанса(ТребуемыеПараметры) — главная и практически единственная причина существования модуля.
  • 🔒 Привилегированный режим. Код выполняется без проверки прав, поэтому он может установить любой параметр сеанса, даже если у роли пользователя нет права «Установка».
  • 🚫 Нет клиентских директив. Модуль целиком серверный, директивы компиляции в нём не нужны и не применяются.
  • 📦 Не библиотека. Процедуры модуля сеанса не вызывают из других модулей. Общую логику выносят в общий серверный модуль, а из модуля сеанса только обращаются к ней.

Где модуль находится в конфигураторе: откройте дерево конфигурации, щёлкните правой кнопкой по корню (имени конфигурации) и выберите «Открыть модуль сеанса». Там же рядом лежат модуль управляемого приложения и модуль внешнего соединения.

Модуль сеанса среди других модулей уровня приложения

МодульГде исполняетсяКогда срабатывает
Модуль сеансаСерверСтарт любого сеанса и обращение к неустановленному параметру
Модуль управляемого приложенияКлиентЗапуск тонкого, толстого (управляемое приложение) и веб-клиента
Модуль обычного приложенияКлиентЗапуск толстого клиента в режиме обычного приложения
Модуль внешнего соединенияСерверПодключение через COM (V83.COMConnector)

Модуль сеанса — единственный из четырёх, который отрабатывает для всех типов сеансов, включая фоновые и регламентные задания, HTTP- и веб-сервисы.

Как платформа решает, где исполнять код модуля сеанса

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

Два момента вызова обработчика

  1. Начало сеанса. Платформа вызывает УстановкаПараметровСеанса с параметром ТребуемыеПараметры = Неопределено. Это сигнал: сеанс только что создан.
  2. Обращение к неустановленному параметру. Если код запросил ПараметрыСеанса.ТекущаяОрганизация, а значение ещё не присвоено, платформа снова вызывает обработчик. В ТребуемыеПараметры придёт массив строк с именами нужных параметров.

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

Порядок событий при входе пользователя

Сначала на сервере создаётся сеанс и отрабатывает модуль сеанса. Только после этого на клиенте выполняются обработчики модуля управляемого приложения: ПередНачаломРаботыСистемы, затем ПриНачалеРаботыСистемы. Значит, к моменту первого клиентского события параметры сеанса, заданные на старте, уже установлены.

Если в ПриНачалеРаботыСистемы вам нужен параметр сеанса, не пытайтесь прочитать его на клиенте. Сделайте серверный вызов в общий модуль и верните значение оттуда.

Файловая и клиент-серверная база: где физически работает модуль сеанса

Код один и тот же, а процесс, который его исполняет, зависит от варианта работы базы и от типа клиента.

Вариант базы и клиентКто исполняет модуль сеанса
Файловая база, тонкий клиентПроцесс 1cv8c.exe на компьютере пользователя
Файловая база, толстый клиентПроцесс 1cv8.exe на компьютере пользователя
Файловая база, веб-клиентПроцесс веб-сервера (IIS или Apache) с модулем расширения 1С
Клиент-серверная база, любой клиентРабочий процесс rphost на сервере 1С
Клиент-серверная база, фоновое заданиеРабочий процесс rphost
COM-соединение к файловой базеПроцесс программы, создавшей соединение

Что из этого следует на практике

  • 🖥️ Файловый режим. Серверный код и клиентский код работают в одном процессе на одном компьютере. Разница между &НаСервере и &НаКлиенте здесь логическая, а не физическая. Ошибки архитектуры (лишние серверные вызовы) в файловой базе почти незаметны.
  • 🌐 Клиент-серверный режим. Модуль сеанса работает на другой машине. Пути к файлам, доступ к сетевым папкам, переменные окружения — всё это сервера 1С и учётной записи службы ragent, а не пользователя.
  • 📁 Файлы и каталоги. Если в модуле сеанса читается файл по пути C:\Settings\config.xml, в клиент-серверной базе его будут искать на диске сервера 1С. В файловой — на компьютере пользователя. Это частая причина того, что «у разработчика работает, а на рабочей базе нет».

Код, который успешно отлажен на файловой копии, не гарантирует такого же поведения в клиент-серверной базе. Права учётной записи службы сервера 1С и доступ к ресурсам проверяйте отдельно.

Скорость входа: что тормозит модуль сеанса и как этого избежать

Модуль сеанса срабатывает чаще, чем кажется. Каждое фоновое задание, каждый регламентный запуск, каждый вызов HTTP-сервиса без повторного использования сеансов — это новый сеанс и новый вызов УстановкаПараметровСеанса с Неопределено.

Если на старте выполняется запрос на 300 мс, а регламентные задания запускаются раз в минуту десятком штук, сервер тратит на один только модуль сеанса около 3 секунд процессорного времени в минуту. Пользователи при этом ощущают медленный вход.

Ленивая инициализация параметров

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

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

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

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

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

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

Что не стоит делать в модуле сеанса

  • ❌ Записывать данные в базу: каждый вход превратится в транзакцию и возможную блокировку.
  • ❌ Обращаться к внешним ресурсам (веб-сервисам, сетевым папкам) с долгим таймаутом. Если ресурс недоступен, сеансы будут подвисать на входе.
  • ❌ Выполнять большие запросы ради параметра, который нужен одному отчёту.

Альтернатива: модуль с повторным использованием

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

ЗадачаПараметр сеансаМодуль с повторным использованием
Ограничение доступа (RLS)✅ Нужен❌ Не подходит
Кеш справочных данныхМожно✅ Удобнее
Контроль прав на чтение и установку✅ Есть в роляхНет
Срок жизни значенияВесь сеансДо сброса кеша платформой, но не дольше сеанса

Модуль сеанса, управляемые формы и клиентский код

Управляемая форма живёт в двух контекстах: часть кода на клиенте, часть на сервере. С модулем сеанса она связана только через параметры сеанса, и доступны они лишь в серверной части.

Что можно и чего нельзя в модуле формы

  • ✅ В процедуре с директивой &НаСервере или в обработчике ПриСозданииНаСервере читать ПараметрыСеанса.ИмяПараметра, если у роли есть право «Получение».
  • ✅ Сохранить прочитанное значение в реквизит формы и затем пользоваться им на клиенте.
  • ❌ Обращаться к ПараметрыСеанса в процедуре с &НаКлиенте: на клиенте этого глобального свойства нет, модуль не скомпилируется.
  • ❌ Вызывать процедуры модуля сеанса из формы напрямую.

Типовой приём передачи значения на клиент

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Организация = ПараметрыСеанса.ОсновнаяОрганизация;
КонецПроцедуры

Организация — реквизит формы. После открытия формы его значение доступно в клиентских процедурах без лишнего серверного вызова.

Директива &НаСервереБезКонтекста тоже имеет доступ к параметрам сеанса. Она дешевле по трафику: на сервер не передаются данные формы. Для чтения одного-двух параметров по кнопке это лучший выбор.

Если параметр сеанса нужен во многих формах и на клиенте, не дублируйте серверный вызов в каждой. Соберите набор значений один раз при старте (в серверной функции, вызванной из ПриНачалеРаботыСистемы) и храните на клиенте в переменной модуля управляемого приложения.

Отладка модуля сеанса и разбор ошибок

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

Как поймать точку останова

  1. Файловая база. Запустите базу из конфигуратора командой «Начать отладку». Серверная часть работает в процессе клиента, и обработчик УстановкаПараметровСеанса остановится на точке.
  2. Клиент-серверная база . На сервере 1С должна быть включена отладка (служба запущена с ключом -debug). В конфигураторе в настройках подключения предметов отладки включите автоматическое подключение серверных предметов и, если ловите фоновые задания, — фоновых.
  3. Фоновые и регламентные задания. Для них используйте ту же автоматическую подсказку подключения. Иначе сеанс задания стартует и закончится раньше, чем вы успеете подключиться вручную.

Включение отладки на рабочем сервере требует перезапуска службы агента 1С. Перезапуск оборвёт все сеансы пользователей — делайте это вне рабочего времени или на копии базы.

Если отладчик подключить нельзя

Пишите в журнал регистрации. Это работает в любом режиме и не требует перезапуска:

ЗаписьЖурналаРегистрации("МодульСеанса.Старт",
	УровеньЖурналаРегистрации.Информация, , ,
	СтрШаблон("Тип: %1, параметры: %2",
		?(ТребуемыеПараметры = Неопределено, "начало сеанса", "запрос"),
		?(ТребуемыеПараметры = Неопределено, "-", СтрСоединить(ТребуемыеПараметры, ", "))));

Журнал открывается через Администрирование → Обслуживание → Журнал регистрации в типовых конфигурациях на БСП или из конфигуратора. Отберите события по имени МодульСеанса.Старт.

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

Ловушка рекурсии

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

Частые вопросы о модуле сеанса

Выполняется ли модуль сеанса при подключении через COM или HTTP-сервис?
Да. Он срабатывает для любого сеанса: COM-соединения, веб- и HTTP-сервисов, фоновых и регламентных заданий. Модуль внешнего соединения при COM-подключении отрабатывает дополнительно.
Можно ли в модуле сеанса показать сообщение пользователю?
Интерактивно — нет: код работает на сервере, окон там нет. Сообщение, сформированное на сервере, может не дойти до пользователя, если сеанс ещё не открыл интерфейс. Для диагностики пишите в журнал регистрации.
Отключает ли привилегированный режим модуля сеанса ограничения доступа к записям?
Да, в привилегированном режиме права и ограничения на уровне записей не проверяются. Поэтому запросы в модуле сеанса возвращают все данные, независимо от роли пользователя.
Сохраняются ли параметры сеанса после переподключения клиента?
Параметры живут, пока жив сеанс. Новый сеанс (повторный вход, разрыв и новое подключение) снова вызывает обработчик с Неопределено и заполняет параметры заново.
Можно ли изменить параметр сеанса после старта?
Да, из любого серверного кода, если у роли есть право «Установка» на этот параметр или код выполняется в привилегированном режиме.