В процессе разработки часто возникает задача зафиксировать время начала работы пользователя в системе. Это может потребоваться для сбора аналитики, контроля длительности работы или протоколирования действий. Разберем по шагам, какими средствами платформы 1С:Предприятие 8 можно решить эту задачу, выясним частые ошибки при работе со списком соединений и рассмотрим наиболее надежные варианты реализации.
Нередко разработчики пытаются получить дату запуска через вызов метода ПолучитьСоединенияИнформационнойБазы() или ПолучитьСеансыИнформационнойБазы(), обращаясь напрямую к первому элементу массива:
МассивСеансов = ПолучитьСеансыИнформационнойБазы();
Сообщить(МассивСеансов[0].НачалоСеанса);
Проанализируем, почему такой подход в реальной информационной базе приводит к ошибкам:
НомерСеанса = 1, справедливо исключительно для первого подключения сразу после перезапуска службы кластера серверов 1С. В процессе эксплуатации номер сеанса непрерывно увеличивается.Чтобы корректно определить дату старта именно текущего сеанса средствами системного администрирования, необходимо сопоставить текущий номер сеанса со списком активных сеансов базы. Выясним алгоритм действий:
НомерСеансаИнформационнойБазы().ПолучитьСеансыИнформационнойБазы(), возвращающий массив объектов СеансИнформационнойБазы.НачалоСеанса.Посмотрим на пример программной реализации на сервере:
&НаСервере
Функция ПолучитьДатуНачалаТекущегоСеанса()
ТекущийНомер = НомерСеансаИнформационнойБазы();
МассивСеансов = ПолучитьСеансыИнформационнойБазы();
Для Каждого ТекСеанс Из МассивСеансов Цикл
Если ТекСеанс.НомерСеанса = ТекущийНомер Тогда
Возврат ТекСеанс.НачалоСеанса;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Важные ограничения данного метода:
ПолучитьСеансыИнформационнойБазы() и ПолучитьСоединенияИнформационнойБазы() требуют наличия административных полномочий (права «Администрирование» или «Администрирование данных»). Если функцию вызовет пользователь с ограниченными правами, платформа выбросит исключение нарушения прав доступа.НомерСеансаИнформационнойБазы() не может быть вызвана напрямую на клиенте — она доступна только в серверном контексте.Если дату запуска программы требуется использовать в различных алгоритмах конфигурации для любого пользователя вне зависимости от его прав доступа, наиболее надежным решением является использование параметра сеанса. Рассмотрим подробнее шаги по его настройке:
ВремяНачалаСеанса и типом Дата (состав даты: Дата и время).МодульСеанса в обработчике события УстановкаПараметровСеанса прописываем инициализацию значения:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры = Неопределено
Или ТребуемыеПараметры.Найти("ВремяНачалаСеанса") <> Неопределено Тогда
ПараметрыСеанса.ВремяНачалаСеанса = ТекущаяДатаСеанса();
КонецЕсли;
КонецПроцедуры
После этого значение ПараметрыСеанса.ВремяНачалаСеанса можно быстро и безопасно считывать в любом серверном модуле без необходимости запрашивать административные списки соединений.
Когда требуется знать время старта исключительно в клиентском интерфейсе, проще всего зафиксировать его при запуске программы в модуле управляемого приложения:
ПриНачалеРаботыСистемы сохраняем текущее время в глобальную переменную модуля или во временное хранилище параметров клиента:
Перем ВремяЗапускаКлиента Экспорт;
Процедура ПриНачалеРаботыСистемы()
ВремяЗапускаКлиента = ТекущаяДата();
КонецПроцедуры
Такой вариант не создает лишней нагрузки на сервер и доступен при любых правах текущего пользователя.
Если конфигурацию изменять нельзя (типовая база без возможности добавления параметров сеанса), а у пользователя есть доступ к журналу регистрации, дату старта можно извлечь из системного лога. Для этого используется метод ВыгрузитьЖурналРегистрации() с отбором по событию _$Session$_.Start и текущему номеру сеанса. Однако данный метод является ресурсоемким и рекомендуется только для редких регламентных проверок или отчетов аудита.