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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки часто возникает задача зафиксировать время начала работы пользователя в системе. Это может потребоваться для сбора аналитики, контроля длительности работы или протоколирования действий. Разберем по шагам, какими средствами платформы 1С:Предприятие 8 можно решить эту задачу, выясним частые ошибки при работе со списком соединений и рассмотрим наиболее надежные варианты реализации.

Ошибочный подход: выбор по фиксированному индексу массива

Нередко разработчики пытаются получить дату запуска через вызов метода ПолучитьСоединенияИнформационнойБазы() или ПолучитьСеансыИнформационнойБазы(), обращаясь напрямую к первому элементу массива:


МассивСеансов = ПолучитьСеансыИнформационнойБазы();
Сообщить(МассивСеансов[0].НачалоСеанса);

Проанализируем, почему такой подход в реальной информационной базе приводит к ошибкам:

  1. Порядок элементов в массиве не гарантирован: нулевым элементом массива может оказаться сеанс фонового задания, регламентная процедура, соединение через веб-сервис или сеанс совершенно другого пользователя.
  2. Сквозная нумерация сеансов: предположение о том, что текущий запуск имеет НомерСеанса = 1, справедливо исключительно для первого подключения сразу после перезапуска службы кластера серверов 1С. В процессе эксплуатации номер сеанса непрерывно увеличивается.

Способ 1. Определение даты через метод ПолучитьСеансыИнформационнойБазы

Чтобы корректно определить дату старта именно текущего сеанса средствами системного администрирования, необходимо сопоставить текущий номер сеанса со списком активных сеансов базы. Выясним алгоритм действий:

  1. На стороне сервера получаем номер активного сеанса с помощью функции НомерСеансаИнформационнойБазы().
  2. Вызываем метод ПолучитьСеансыИнформационнойБазы(), возвращающий массив объектов СеансИнформационнойБазы.
  3. В цикле находим сеанс, номер которого совпадает с текущим, и считываем его свойство НачалоСеанса.

Посмотрим на пример программной реализации на сервере:


&НаСервере
Функция ПолучитьДатуНачалаТекущегоСеанса()
    ТекущийНомер = НомерСеансаИнформационнойБазы();
    МассивСеансов = ПолучитьСеансыИнформационнойБазы();
    
    Для Каждого ТекСеанс Из МассивСеансов Цикл
        Если ТекСеанс.НомерСеанса = ТекущийНомер Тогда
            Возврат ТекСеанс.НачалоСеанса;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Неопределено;
КонецФункции

Важные ограничения данного метода:

  1. Методы ПолучитьСеансыИнформационнойБазы() и ПолучитьСоединенияИнформационнойБазы() требуют наличия административных полномочий (права «Администрирование» или «Администрирование данных»). Если функцию вызовет пользователь с ограниченными правами, платформа выбросит исключение нарушения прав доступа.
  2. Функция НомерСеансаИнформационнойБазы() не может быть вызвана напрямую на клиенте — она доступна только в серверном контексте.

Способ 2. Использование параметра сеанса (рекомендуемый способ)

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

  1. В дереве метаданных конфигурации в ветке Общие > Параметры сеанса создаем новый параметр с именем ВремяНачалаСеанса и типом Дата (состав даты: Дата и время).
  2. В общем модуле МодульСеанса в обработчике события УстановкаПараметровСеанса прописываем инициализацию значения:

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    Если ТребуемыеПараметры = Неопределено 
       Или ТребуемыеПараметры.Найти("ВремяНачалаСеанса") <> Неопределено Тогда
        ПараметрыСеанса.ВремяНачалаСеанса = ТекущаяДатаСеанса();
    КонецЕсли;
КонецПроцедуры

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

Способ 3. Фиксация времени на клиенте при старте приложения

Когда требуется знать время старта исключительно в клиентском интерфейсе, проще всего зафиксировать его при запуске программы в модуле управляемого приложения:

  1. Открываем Модуль управляемого приложения.
  2. В процедуре ПриНачалеРаботыСистемы сохраняем текущее время в глобальную переменную модуля или во временное хранилище параметров клиента:

Перем ВремяЗапускаКлиента Экспорт;

Процедура ПриНачалеРаботыСистемы()
    ВремяЗапускаКлиента = ТекущаяДата();
КонецПроцедуры

Такой вариант не создает лишней нагрузки на сервер и доступен при любых правах текущего пользователя.

Способ 4. Получение данных из журнала регистрации

Если конфигурацию изменять нельзя (типовая база без возможности добавления параметров сеанса), а у пользователя есть доступ к журналу регистрации, дату старта можно извлечь из системного лога. Для этого используется метод ВыгрузитьЖурналРегистрации() с отбором по событию _$Session$_.Start и текущему номеру сеанса. Однако данный метод является ресурсоемким и рекомендуется только для редких регламентных проверок или отчетов аудита.

← На главную