При администрировании и аудите информационных систем на базе платформы 1С часто возникает необходимость проанализировать активность конкретного сотрудника. Типичная задача — быстро и точно получить список всех дат и времени, когда пользователь запускал программу за длительный промежуток времени (месяц, квартал или год). Если база данных активно используется, журнал регистрации разрастается до огромных размеров, и простой просмотр всех событий становится неэффективным. В этой статье мы подробно разберем, как решить эту задачу различными методами — от штатных средств интерфейса до прямого анализа файлов данных.
Начнем с базового метода, который доступен любому администратору непосредственно в режиме предприятия. Часто пользователи ошибочно полагают, что в стандартных отборах журнала регистрации нет возможности отфильтровать только события входа. Давайте разберем по шагам, как правильно настроить этот фильтр:
_$Session$_.Start.После применения отбора система скроет все технологические операции, транзакции, проведение документов и оставит на экране исключительно строки запуска программы выбранным сотрудником. Однако этот способ имеет ограничение: если журнал регистрации слишком велик, интерактивное окно может "зависнуть" из-за нехватки оперативной памяти клиента. Для просмотра входов и начала сеансов выбранного пользователя по сохранившемуся журналу подойдёт график работы пользователей. Он показывает даты, время и компьютеры, но полнота истории ограничена журналом, а совместимость с 8.3 не проверена.
Для обхода ограничений интерфейса и быстрой обработки больших объемов данных мы можем написать простую внешнюю обработку. Платформа 1С предоставляет мощный метод ВыгрузитьЖурналРегистрации(), который позволяет применить жесткий фильтр еще на этапе чтения физического файла журнала с диска, что значительно ускоряет процесс.
Рассмотрим пример кода, реализующий такую выгрузку:
Фильтр = Новый Структура;
Фильтр.Вставить("ДатаНачала", НачалоПериода);
Фильтр.Вставить("ДатаОкончания", КонецПериода);
Фильтр.Вставить("Пользователь", ИмяСотрудника); // Имя пользователя в ИБ
Фильтр.Вставить("Событие", "_$Session$_.Start"); // Системное имя начала сеанса
ТаблицаСобытий = Новый TablicaZnacheniy;
// Выгружаем только необходимые нам колонки для экономии памяти сервера
ВыгрузитьЖурналРегистрации(ТаблицаСобытий, Фильтр, "Дата, Пользователь, Компьютер");
Проанализируем этот код подробнее. Передавая третьим параметром строку "Дата, Пользователь, Компьютер", мы сообщаем платформе, что нам не нужны тяжелые метаданные (например, комментарии или данные транзакций). Метод возвращает легкую таблицу значений, которую мы можем моментально вывести на форму или сохранить в файл.
Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), вам не нужно изобретать велосипед. В программе уже заложены готовые специализированные отчеты администратора. Давайте посмотрим, где их найти:
Эти отчеты автоматически обращаются к журналу регистрации, выбирают события типа Сеанс.Начало и формируют наглядную статистику в разрезе дней, рабочих мест и времени активности сотрудников. Это наиболее удобный вариант для бизнес-аналитиков и руководителей подразделений.
В современных версиях платформы 1С (начиная с 8.3.5 и до версии 8.3.22 по умолчанию) журнал регистрации хранится в формате базы данных SQLite в файле 1Cv8.lgd. Если у вас файловая база или есть доступ к каталогу логов сервера, мы можем прочитать данные напрямую в обход запуска 1С.
Для этого выполним следующие действия:
1Cv8.lgd, расположенный в папке 1Cv8Log вашей информационной базы.EventLog.Пример высокоэффективного SQL-запроса для мгновенной выборки дат запуска программы:
SELECT datetime(date/10000 - 11644473600, 'unixepoch') AS EventTime, userCode
FROM EventLog
WHERE eventId = (SELECT id FROM EventCodes WHERE name = '_$Session$_.Start')
AND userCode = (SELECT id FROM UserCodes WHERE name = 'ИмяСотрудника')
ORDER BY date DESC;
Этот метод работает со скоростью СУБД и позволяет извлечь даты входов за секунды даже из логов объемом в десятки гигабайт. Также этот файл можно подключить в конфигураторе через механизм Внешних источников данных и писать аналогичные запросы на встроенном языке 1С.
Если ваша база данных использует классический текстовый формат журнала регистрации (файлы с расширением .lgp), то совет выгрузить все логи в Microsoft Excel окажется нежизнеспособным — файлы за длительный период могут весить гигабайты, а Excel имеет жесткий лимит в 1 048 576 строк. Вместо этого задействуем консоль PowerShell, которая умеет выполнять потоковый поиск по файлам на диске.
Откроем консоль PowerShell и выполним следующую команду:
Select-String -Path "C:\PathToBase\1Cv8Log\*.lgp" -Pattern "ИмяПользователя" | Select-String -Pattern "_$Session$_.Start"
Выясним причину эффективности этого способа: PowerShell не загружает файл целиком в оперативную память. Он сканирует текстовые файлы построчно, сначала отбирая строки с именем нужного сотрудника, а затем фильтруя их по маркеру начала сеанса. Вы получите готовый текстовый список дат входов за считанные секунды.