Модуль сеанса: в каком процессе и с какими правами работает его код
Содержание
Модуль сеанса в 1С 8.3 выполняется только на сервере и только в привилегированном режиме. В клиент-серверной базе его код работает в рабочем процессе rphost на сервере 1С:Предприятия. В файловой базе «сервером» служит сам процесс клиента (1cv8.exe, 1cv8c.exe), а для веб-клиента — процесс веб-сервера, где опубликована база.
На клиенте модуль сеанса не исполняется никогда. Поэтому директивы &НаКлиенте и &НаСервере в нём не пишут: контекст у модуля один, серверный. Его задача — заполнить параметры сеанса через обработчик УстановкаПараметровСеанса до того, как к ним обратится остальной код.
Зачем модулю сеанса отдельное место в архитектуре 1С
Конфигурация 1С делит код на модули с разным временем жизни и разным контекстом. Модуль сеанса стоит особняком: он один на всю конфигурацию и срабатывает для любого сеанса, а не только для пользователя с окном программы.
Что важно знать о нём в первую очередь:
- 🧩 Один обработчик. Предопределённая процедура
УстановкаПараметровСеанса(ТребуемыеПараметры)— главная и практически единственная причина существования модуля. - 🔒 Привилегированный режим. Код выполняется без проверки прав, поэтому он может установить любой параметр сеанса, даже если у роли пользователя нет права «Установка».
- 🚫 Нет клиентских директив. Модуль целиком серверный, директивы компиляции в нём не нужны и не применяются.
- 📦 Не библиотека. Процедуры модуля сеанса не вызывают из других модулей. Общую логику выносят в общий серверный модуль, а из модуля сеанса только обращаются к ней.
Где модуль находится в конфигураторе: откройте дерево конфигурации, щёлкните правой кнопкой по корню (имени конфигурации) и выберите «Открыть модуль сеанса». Там же рядом лежат модуль управляемого приложения и модуль внешнего соединения.
Модуль сеанса среди других модулей уровня приложения
| Модуль | Где исполняется | Когда срабатывает |
|---|---|---|
| Модуль сеанса | Сервер | Старт любого сеанса и обращение к неустановленному параметру |
| Модуль управляемого приложения | Клиент | Запуск тонкого, толстого (управляемое приложение) и веб-клиента |
| Модуль обычного приложения | Клиент | Запуск толстого клиента в режиме обычного приложения |
| Модуль внешнего соединения | Сервер | Подключение через COM (V83.COMConnector) |
Модуль сеанса — единственный из четырёх, который отрабатывает для всех типов сеансов, включая фоновые и регламентные задания, HTTP- и веб-сервисы.
Как платформа решает, где исполнять код модуля сеанса
Здесь всё проще, чем в модулях форм. Платформа не выбирает контекст по директивам: модуль сеанса компилируется только для сервера. Вопрос «где выполняется» сводится к вопросу «где в этой базе находится сервер».
Два момента вызова обработчика
- Начало сеанса. Платформа вызывает
УстановкаПараметровСеансас параметромТребуемыеПараметры = Неопределено. Это сигнал: сеанс только что создан. - Обращение к неустановленному параметру. Если код запросил
ПараметрыСеанса.ТекущаяОрганизация, а значение ещё не присвоено, платформа снова вызывает обработчик. ВТребуемыеПараметрыпридёт массив строк с именами нужных параметров.
Второй вызов — основа «ленивой» инициализации. Тяжёлые параметры можно не считать на старте, а заполнять только тогда, когда они действительно понадобились.
Порядок событий при входе пользователя
Сначала на сервере создаётся сеанс и отрабатывает модуль сеанса. Только после этого на клиенте выполняются обработчики модуля управляемого приложения: ПередНачаломРаботыСистемы, затем ПриНачалеРаботыСистемы. Значит, к моменту первого клиентского события параметры сеанса, заданные на старте, уже установлены.
Если в ПриНачалеРаботыСистемы вам нужен параметр сеанса, не пытайтесь прочитать его на клиенте. Сделайте серверный вызов в общий модуль и верните значение оттуда.
Файловая и клиент-серверная база: где физически работает модуль сеанса
Код один и тот же, а процесс, который его исполняет, зависит от варианта работы базы и от типа клиента.
| Вариант базы и клиент | Кто исполняет модуль сеанса |
|---|---|
| Файловая база, тонкий клиент | Процесс 1cv8c.exe на компьютере пользователя |
| Файловая база, толстый клиент | Процесс 1cv8.exe на компьютере пользователя |
| Файловая база, веб-клиент | Процесс веб-сервера (IIS или Apache) с модулем расширения 1С |
| Клиент-серверная база, любой клиент | Рабочий процесс rphost на сервере 1С |
| Клиент-серверная база, фоновое задание | Рабочий процесс rphost |
| COM-соединение к файловой базе | Процесс программы, создавшей соединение |
Что из этого следует на практике
- 🖥️ Файловый режим. Серверный код и клиентский код работают в одном процессе на одном компьютере. Разница между
&НаСервереи&НаКлиентездесь логическая, а не физическая. Ошибки архитектуры (лишние серверные вызовы) в файловой базе почти незаметны. - 🌐 Клиент-серверный режим. Модуль сеанса работает на другой машине. Пути к файлам, доступ к сетевым папкам, переменные окружения — всё это сервера 1С и учётной записи службы
ragent, а не пользователя. - 📁 Файлы и каталоги. Если в модуле сеанса читается файл по пути
C:\Settings\config.xml, в клиент-серверной базе его будут искать на диске сервера 1С. В файловой — на компьютере пользователя. Это частая причина того, что «у разработчика работает, а на рабочей базе нет».
Код, который успешно отлажен на файловой копии, не гарантирует такого же поведения в клиент-серверной базе. Права учётной записи службы сервера 1С и доступ к ресурсам проверяйте отдельно.
Скорость входа: что тормозит модуль сеанса и как этого избежать
Модуль сеанса срабатывает чаще, чем кажется. Каждое фоновое задание, каждый регламентный запуск, каждый вызов HTTP-сервиса без повторного использования сеансов — это новый сеанс и новый вызов УстановкаПараметровСеанса с Неопределено.
Если на старте выполняется запрос на 300 мс, а регламентные задания запускаются раз в минуту десятком штук, сервер тратит на один только модуль сеанса около 3 секунд процессорного времени в минуту. Пользователи при этом ощущают медленный вход.
Ленивая инициализация параметров
На старте ставьте только то, что нужно почти каждому сеансу и считается быстро. Остальное — по запросу:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры = Неопределено Тогда
// Начало сеанса: только дешёвые параметры
ПараметрыСеанса.ТекущийПользователь = НастройкиСервер.ПользовательПоИмени(ИмяПользователя());
Возврат;
КонецЕсли;
Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
Если ИмяПараметра = "ОсновнаяОрганизация" Тогда
ПараметрыСеанса.ОсновнаяОрганизация = НастройкиСервер.ОрганизацияПоУмолчанию();
ИначеЕсли ИмяПараметра = "ДоступныеСклады" Тогда
ПараметрыСеанса.ДоступныеСклады = НастройкиСервер.ФиксированныйСписокСкладов();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Здесь НастройкиСервер — ваш общий серверный модуль. Процедуры в нём пишутся как обычные экспортные функции, поэтому их можно вызывать и отлаживать отдельно. Для массива складов используйте фиксированный тип (ФиксированныйМассив): параметр сеанса не хранит изменяемые коллекции.
Что не стоит делать в модуле сеанса
- ❌ Записывать данные в базу: каждый вход превратится в транзакцию и возможную блокировку.
- ❌ Обращаться к внешним ресурсам (веб-сервисам, сетевым папкам) с долгим таймаутом. Если ресурс недоступен, сеансы будут подвисать на входе.
- ❌ Выполнять большие запросы ради параметра, который нужен одному отчёту.
Альтернатива: модуль с повторным использованием
Если значение нужно только для чтения и не участвует в ограничениях доступа на уровне записей, параметр сеанса не обязателен. Общий серверный модуль со свойством «Повторное использование возвращаемых значений: На время сеанса» кеширует результат функции. Первый вызов считает значение, следующие берут его из кеша.
| Задача | Параметр сеанса | Модуль с повторным использованием |
|---|---|---|
| Ограничение доступа (RLS) | ✅ Нужен | ❌ Не подходит |
| Кеш справочных данных | Можно | ✅ Удобнее |
| Контроль прав на чтение и установку | ✅ Есть в ролях | Нет |
| Срок жизни значения | Весь сеанс | До сброса кеша платформой, но не дольше сеанса |
Модуль сеанса, управляемые формы и клиентский код
Управляемая форма живёт в двух контекстах: часть кода на клиенте, часть на сервере. С модулем сеанса она связана только через параметры сеанса, и доступны они лишь в серверной части.
Что можно и чего нельзя в модуле формы
- ✅ В процедуре с директивой
&НаСервереили в обработчикеПриСозданииНаСерверечитатьПараметрыСеанса.ИмяПараметра, если у роли есть право «Получение». - ✅ Сохранить прочитанное значение в реквизит формы и затем пользоваться им на клиенте.
- ❌ Обращаться к
ПараметрыСеансав процедуре с&НаКлиенте: на клиенте этого глобального свойства нет, модуль не скомпилируется. - ❌ Вызывать процедуры модуля сеанса из формы напрямую.
Типовой приём передачи значения на клиент
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Организация = ПараметрыСеанса.ОсновнаяОрганизация;
КонецПроцедуры
Организация — реквизит формы. После открытия формы его значение доступно в клиентских процедурах без лишнего серверного вызова.
Директива &НаСервереБезКонтекста тоже имеет доступ к параметрам сеанса. Она дешевле по трафику: на сервер не передаются данные формы. Для чтения одного-двух параметров по кнопке это лучший выбор.
Если параметр сеанса нужен во многих формах и на клиенте, не дублируйте серверный вызов в каждой. Соберите набор значений один раз при старте (в серверной функции, вызванной из ПриНачалеРаботыСистемы) и храните на клиенте в переменной модуля управляемого приложения.
Отладка модуля сеанса и разбор ошибок
Модуль сеанса неудобен для отладки тем, что отрабатывает очень рано — ещё до того, как пользователь увидел окно программы. Точка останова в нём срабатывает, только если отладчик уже подключён к серверному предмету отладки в момент создания сеанса.
Как поймать точку останова
- Файловая база. Запустите базу из конфигуратора командой «Начать отладку». Серверная часть работает в процессе клиента, и обработчик
УстановкаПараметровСеансаостановится на точке. - Клиент-серверная база
. На сервере 1С должна быть включена отладка (служба запущена с ключом
-debug). В конфигураторе в настройках подключения предметов отладки включите автоматическое подключение серверных предметов и, если ловите фоновые задания, — фоновых. - Фоновые и регламентные задания. Для них используйте ту же автоматическую подсказку подключения. Иначе сеанс задания стартует и закончится раньше, чем вы успеете подключиться вручную.
Включение отладки на рабочем сервере требует перезапуска службы агента 1С. Перезапуск оборвёт все сеансы пользователей — делайте это вне рабочего времени или на копии базы.
Если отладчик подключить нельзя
Пишите в журнал регистрации. Это работает в любом режиме и не требует перезапуска:
ЗаписьЖурналаРегистрации("МодульСеанса.Старт",
УровеньЖурналаРегистрации.Информация, , ,
СтрШаблон("Тип: %1, параметры: %2",
?(ТребуемыеПараметры = Неопределено, "начало сеанса", "запрос"),
?(ТребуемыеПараметры = Неопределено, "-", СтрСоединить(ТребуемыеПараметры, ", "))));
Журнал открывается через Администрирование → Обслуживание → Журнал регистрации в типовых конфигурациях на БСП или из конфигуратора. Отберите события по имени МодульСеанса.Старт.
Ловушка рекурсии
Внутри обработчика можно случайно обратиться к другому, ещё не установленному параметру. Тогда платформа вызовет УстановкаПараметровСеанса повторно для него. Если и в этой ветке есть обращение к первому параметру, а он ещё не присвоен, вызовы зациклятся. Присваивайте значения в таком порядке, чтобы зависимый параметр читал уже установленный.