Работа с параметрами сеанса в 1С:Предприятие 8.3 — одна из ключевых задач для разработчиков и администраторов системы. Эти параметры содержат критически важную информацию: от идентификатора пользователя и прав до технических деталей подключения (например, имя компьютера или версия платформы). Без доступа к ним невозможно отладить интеграции, настроить права или диагностировать сбои в многопользовательском режиме.

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

1. Стандартные методы глобального контекста

Начнём с базовых инструментов, доступных в любом сеансе . Эти методы не требуют прав администратора и работают как в толстом, так и в тонком клиенте. Основные объекты для извлечения параметров:

  • 🔹 ПараметрыСеанса — коллекция ключ-значение с пользовательскими и системными параметрами, переданными при старте сеанса.
  • 🔹 ИнформацияОСистеме() — функция, возвращающая данные о версии платформы, режиме работы и лицензии.
  • 🔹 Пользователь — объект с информацией о текущем пользователе (имя, уникальный идентификатор, роли).

Пример кода для получения базовых параметров:

// Получение имени пользователя и ИД сеанса

ИмяПользователя = Пользователь.Имя;

ИДСеанса = УникальныйИдентификатор();

// Версия платформы и режим работы

СистемнаяИнформация = ИнформацияОСистеме();

ВерсияПлатформы = СистемнаяИнформация.ВерсияПлатформы;

РежимРаботы = СистемнаяИнформация.РежимРаботы; // "УправляемоеПриложение", "ОбычноеПриложение" и т.д.

⚠️ Внимание: Параметры из коллекции ПараметрыСеанса доступны только если они были явным образом переданы при запуске сеанса (например, через командную строку или ЗапуститьПриложение()). Системные параметры (например, ComputerName) там отсутствуют.

Для диагностики полезно вывести все доступные параметры в сообщение:

Для Каждого Параметр Из ПараметрыСеанса Цикл

Сообщить(СтрШаблон("Параметр: %1, Значение: %2", Параметр.Ключ, Параметр.Значение));

КонецЦикла;

📊 Какой клиент 1С вы используете чаще?
Толстый клиент
Тонкий клиент
Веб-клиент
Мобильное приложение

2. Работа с системными параметрами через WScript.Shell (только для Windows)

Если вам нужны технические параметры сеанса — имя компьютера, IP-адрес, домен — стандартные методы их не предоставляют. Здесь поможет интеграция с Windows Script Host через WScript.Shell. Этот способ работает только в толстом клиенте под Windows.

Пример кода для получения имени компьютера и пользователя ОС:

Попытка

WScript = Новый COMОбъект("WScript.Shell");

ИмяКомпьютера = WScript.ExpandEnvironmentStrings("%COMPUTERNAME%");

ИмяПользователяОС = WScript.ExpandEnvironmentStrings("%USERNAME%");

Сообщить(СтрШаблон("Компьютер: %1, Пользователь ОС: %2", ИмяКомпьютера, ИмяПользователяОС));

Исключение

Сообщить("Ошибка доступа к WScript.Shell: " + ОписаниеОшибки());

КонецПопытки;

  • 🖥️ %COMPUTERNAME% — имя компьютера в сети.
  • 👤 %USERNAME% — имя пользователя Windows.
  • 🌐 %USERDOMAIN% — домен или имя рабочей группы.
⚠️ Внимание: Использование WScript.Shell может быть заблокировано политиками безопасности организации. В корпоративных средах этот метод часто отключён для предотвращения выполнения произвольных скриптов.
Как обойти ограничения безопасности при работе с WScript.Shell?

Если доступ к WScript.Shell заблокирован, альтернативный способ получить имя компьютера — через временный файл:

АдресВременногоФайла = ПолучениеИмениВременногоФайла("txt");

Выполнить("cmd /c echo %COMPUTERNAME% > " + АдресВременногоФайла);

ИмяКомпьютера = Новый ЧтениеТекста(АдресВременногоФайла).ПрочитатьСтроку();

УдалитьФайлы(АдресВременногоФайла);

Этот метод менее надёжен и требует прав на запись во временную папку.

3. Использование журнала регистрации для отслеживания сеансов

Журнал регистрации фиксирует все события сеансов, включая их параметры. Это незаменимый инструмент для администраторов, когда нужно проанализировать активность пользователей или найти "зависший" сеанс. Данные хранятся в таблице _EventLog (для SQL-варианта) или в файлах логов (для файлового варианта).

Чтобы извлечь параметры сеанса из журнала, выполните следующий запрос (для SQL-базы):

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| EventLog.Сеанс КАК ИДСеанса,

| EventLog.Пользователь КАК Пользователь,

| EventLog.Компьютер КАК Компьютер,

| МАКСИМУМ(EventLog.ДатаСобытия) КАК ПоследняяАктивность

|ИЗ

| РегистрСведений.ЖурналРегистрации КАК EventLog

|ГДЕ

| EventLog.Сеанс = &ТекущийСеанс

|СГРУППИРОВАТЬ ПО

| EventLog.Сеанс,

| EventLog.Пользователь,

| EventLog.Компьютер";

Запрос.УстановитьПараметр("ТекущийСеанс", УникальныйИдентификатор());

Результат = Запрос.Выполнить();

Для файлового варианта параметры сеанса можно найти в логах по пути:

  • 📁 %APPDATA%\1C\1Cv8\logs\ — журналы тонкого клиента.
  • 📁 C:\Program Files\1cv8\conf\logs\ — журналы сервера 1С:Предприятие.
Параметр Где хранится в журнале Пример значения
Идентификатор сеанса Поле Сеанс a1b2c3d4-5678-90ef-1234-567890abcdef
Имя пользователя Поле Пользователь ИвановИван
Имя компьютера Поле Компьютер PC-IVANOV
IP-адрес Поле Адрес (только для клиент-серверного варианта) 192.168.1.100
💡

Чтобы ускорить поиск по журналам, используйте утилиту 1CLogViewer (входит в состав платформы). Она позволяет фильтровать записи по идентификатору сеанса, дате и типу события.

4. Программное получение параметров через расширения конфигурации

Если вам нужны расширенные параметры (например, список открытых форм, текущие блокировки или переменные сеанса), стандартных методов будет недостаточно. В этом случае поможет расширение конфигурации с использованием рефлексии или внутренних механизмов платформы.

Пример кода для получения списка открытых форм в текущем сеансе:

// Требует прав "Администрирование" или запуска в режиме "Конфигуратор"

Формы = Новый Массив;

Для Каждого Окно Из Окна.Окна Цикл

Если ТипЗнч(Окно) = Тип("Форма") Тогда

Формы.Добавить(Окно.Имя);

КонецЕсли;

КонецЦикла;

Для доступа к переменным сеанса (глобальным или модульным) можно использовать следующий подход:

// Получение значения глобальной переменной (если известно её имя)

ЗначениеПеременной = ГлобальныйКонтекст.Получить("ИмяПеременной");

// Альтернативный способ через Метаданные (требует прав на чтение метаданных)

Метаданные = Метаданные.ПолучитьМетаданные();

ПеременныеМодуля = Метаданные.ГлобальныйМодуль.Переменные;

⚠️ Внимание: Работа с внутренними объектами платформы (например, Окна или ГлобальныйКонтекст) не документирована и может измениться в новых версиях . Используйте эти методы только для отладки, а не в продакшн-коде.

Изучить документацию по рефлексии в 1С|Создать тестовое расширение в конфигураторе|Проверить права доступа (требуется "Администрирование")|Сделать резервную копию базы перед экспериментами|Тестировать только на копии рабочей базы-->

5. Получение параметров сеанса через HTTP-сервисы (для веб-клиента)

Если вы работаете с веб-клиентом или REST-интеграциями, параметры сеанса можно извлечь через HTTP-заголовки или специальные сервисы. Например, при обращении к через браузер в заголовках запроса передаются:

  • 🆔 X-1C-SessionID — идентификатор сеанса.
  • 👤 X-1C-UserName — имя пользователя.
  • 🖥️ X-1C-ComputerName — имя компьютера (если доступно).

Пример кода для получения заголовков на стороне сервера (в модуле HTTP-сервиса):

Функция ПолучениеПараметровСеансаИзЗаголовков(Запрос)

Заголовки = Запрос.Заголовки;

Результат = Новый Структура;

Результат.Вставить("SessionID", Заголовки.Получить("X-1C-SessionID"));

Результат.Вставить("UserName", Заголовки.Получить("X-1C-UserName"));

Результат.Вставить("ComputerName", Заголовки.Получить("X-1C-ComputerName"));

Возврат Результат;

КонецФункции

Для клиентской части (JavaScript в веб-клиенте) параметры сеанса доступны через объект window.top:

// Получение идентификатора сеанса в браузере

var sessionId = window.top.external.sessionId;

console.log("Session ID:", sessionId);

💡

HTTP-заголовки с параметрами сеанса доступны только в веб-клиенте и при работе через REST. В толстом или тонком клиенте эти данные не передаются.

6. Альтернативные способы: файлы lock и временные данные

В редких случаях, когда стандартные методы недоступны (например, при восстановлении после сбоя), параметры сеанса можно извлечь из временных файлов или файлов блокировок. Эти методы требуют прямого доступа к серверу или рабочей станции.

Основные источники:

  • 🔒 Файлы .lock в каталоге базы (например, 1Cv8.lck) — содержат информацию о блокировках и активных сеансах.
  • 📄 Файл 1Cv8.log — может хранить трассировку сеансов с идентификаторами.
  • 🗃️ Папка %TEMP%\1C\1Cv8\ — временные файлы сеансов (например, ses{ID}.tmp).

Пример анализа файла блокировки (для файлового варианта):

// Путь к файлу блокировки (зависит от версии платформы)

ПутьКФайлу = "C:\Program Files\1cv8\srvinfo\reg_1541\1Cv8.lck";

// Чтение файла в двоичном режиме

ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);

Читатель = Новый ЧтениеДанных(ДвоичныеДанные);

ТекстФайла = Читатель.ПрочитатьСтроку(1000); // Читаем первые 1000 символов

// Поиск идентификатора сеанса (формат зависит от версии 1С)

Поиск = СтроковыеФункции.Найти(ТекстФайла, "Session=");

Если Поиск <> 0 Тогда

ИДСеанса = Сред(ТекстФайла, Поиск + 8, 36); // UUID обычно 36 символов

Сообщить("Найден сеанс: " + ИДСеанса);

КонецЕсли;

⚠️ Внимание: Структура файлов .lock и .log не документирована и может изменяться между версиями . Используйте этот метод только в крайних случаях, когда другие способы недоступны.
💡

Анализ временных файлов сеансов — это "метод последней надежды". Он требует остановки сервера 1С и может привести к повреждению данных при некорректных действиях.

FAQ: Частые вопросы о параметрах сеанса 1С

Можно ли получить параметры сеанса другого пользователя?

Да, но для этого требуются права администратора. В клиент-серверном варианте можно использовать запрос к системной таблице v8sessions (для PostgreSQL) или sys.sessions (для MSSQL). Пример:

ВЫБРАТЬ

session_id КАК ИДСеанса,

user_name КАК Пользователь,

host_name КАК Компьютер,

application_name КАК Клиент

ИЗ

v8sessions;

В файловом варианте это невозможно без прямого доступа к файлам блокировок.

Как передать параметры в сеанс при запуске 1С?

Параметры передаются через командную строку или функцию ЗапуститьПриложение(). Пример:

// Запуск 1С с передачей параметров

ЗапуститьПриложение("C:\Program Files\1cv8\8.3.20.1500\bin\1cv8.exe",

"/IBName ""Demo"" /N ""Иванов"" /P ""123"" /Param1 ""Значение1"" /Param2 ""Значение2""");

В сеансе параметры будут доступны через коллекцию ПараметрыСеанса.

Почему функция ИнформацияОСистеме() возвращает пустые значения?

Это типичная проблема при работе в веб-клиенте или мобильном приложении, где часть системной информации скрыта по соображениям безопасности. Также проверьте:

  • 🔹 Права текущего пользователя (требуется роль с доступом к системной информации).
  • 🔹 Режим совместимости конфигурации (в старых режимах часть функций отключена).
Как узнать, какой клиент используется в текущем сеансе (толстый/тонкий/веб)?

Используйте функцию ТипКлиентскогоПриложения():

ТипКлиента = ТипКлиентскогоПриложения();

Сообщить(СтрШаблон("Текущий клиент: %1", ТипКлиента));

// Возможные значения: ТолстыйКлиент, ТонкийКлиент, ВебКлиент, МобильноеПриложение

Можно ли изменить параметры сеанса программно?

Нет, большинство параметров сеанса (например, УникальныйИдентификатор() или Пользователь.Имя) доступны только для чтения. Однако вы можете:

  • 🔹 Добавлять собственные параметры в коллекцию ПараметрыСеанса при запуске.
  • 🔹 Модифицировать переменные сеанса (если они объявлены в глобальном модуле).