Анализ активности сотрудников — одна из важнейших задач для администратора системы или руководителя подразделения. В платформе 1С для этих целей предусмотрен мощный инструмент — Журнал регистрации. Однако стандартный интерфейс журнала не всегда удобен для глубокой аналитики или построения графиков. В таких случаях программисту необходимо программно получить данные, используя встроенную функцию ВыгрузитьЖурналРегистрации(). В этой статье мы подробно разберем, как правильно использовать эту функцию, как оптимизировать выгрузку и как отобразить полученные результаты на управляемой форме. Для этой задачи можно использовать готовый отчет для анализа активности и рабочего времени сотрудников.
Функция ВыгрузитьЖурналРегистрации() предназначена для программного извлечения записей из системного лога. Основная особенность заключается в том, что результат может быть выгружен либо во внешний файл (например, XML), либо во внутреннюю структуру 1С — ТаблицаЗначений. Рассмотрим синтаксис функции подробнее:
ВыгрузитьЖурналРегистрации(ИмяФайлаИлиТаблицаЗначений, Отбор, Колонки, КоличествоСобытий)
Разберем назначение каждого параметра:
ТаблицаЗначений, данные попадут в нее.Проанализируем типичную ошибку начинающих: вызов функции без параметров отбора. Если ваша база данных работает давно, объем журнала регистрации может составлять гигабайты. Попытка выгрузить всё сразу приведет к зависанию сервера или критической ошибке нехватки памяти. Поэтому всегда начинаем с создания структуры отбора. Выясним, как ограничить данные конкретным сотрудником и периодом за месяц.
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ДатаНачала", НачалоМесяца(ТекущаяДата()));
ПараметрыОтбора.Вставить("ДатаОкончания", КонецМесяца(ТекущаяДата()));
ПараметрыОтбора.Вставить("Пользователь", ИмяНужногоПользователя); // Можно передать имя строкой или ссылку
Поскольку работа с системными файлами и журналом регистрации возможна только на стороне сервера, создадим соответствующую экспортную процедуру. Мы будем использовать ТаблицуЗначений для последующей обработки данных. Обратите внимание, что для корректной работы функции переменную нужно инициализировать как новый объект ТаблицаЗначений.
&НаСервере
Процедура ПолучитьДанныеАктивностиНаСервере()
СобытияЖурнала = Новый ТаблицаЗначений;
// Определяем список колонок, чтобы не грузить лишнее (комментарии, данные и пр.)
НужныеКолонки = "Дата, Событие, Пользователь, ПредставлениеСобытия";
// Выполняем выгрузку с учетом нашего отбора
ВыгрузитьЖурналРегистрации(СобытияЖурнала, ПараметрыОтбора, НужныеКолонки);
// Теперь данные находятся в переменной СобытияЖурнала
// Мы можем программно обработать их или передать на форму
КонецПроцедуры
Рассмотрим ситуацию, когда нам нужно вывести полученные строки в таблицу на форме. В управляемом приложении мы не можем напрямую связать серверную ТаблицуЗначений с элементом интерфейса. Для этого нам необходимо создать реквизит формы (например, с именем ТаблицаРезультат) и использовать метод ЗначениеВРеквизитФормы().
Это гораздо эффективнее, чем перебирать строки в цикле и добавлять их вручную, как пытаются делать многие новички. Посмотрим на правильную реализацию:
&НаСервере
Процедура ЗагрузитьДанныеНаФорму()
СобытияЖурнала = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(СобытияЖурнала, ПараметрыОтбора);
// Важный момент: колонки ТаблицыЗначений должны совпадать с колонками реквизита формы
ЗначениеВРеквизитФормы(СобытияЖурнала, "Объект.ТаблицаРезультат");
КонецПроцедуры
Если ваша задача — не просто показать список, а составить график или произвести расчеты (например, суммарное время работы), вам потребуется обход коллекции. Разберем правильный синтаксис цикла Для каждого. Помните, что обращение к полям строки должно идти через переменную цикла, а не через саму таблицу.
Для каждого СтрокаСобытия Из СобытияЖурнала Цикл
// Пример: анализируем время входа в систему
Если СтрокаСобытия.Событие = "_$Session$_.Start" Тогда
Сообщить("Пользователь зашел в систему в: " + СтрокаСобытия.Дата);
КонецЕсли;
КонецЦикла;
Чтобы превратить сухие цифры журнала в наглядную диаграмму, выполним следующие действия:
Диаграмма.Для группировки удобно использовать объект Запрос к временной таблице, созданной из нашей ТаблицыЗначений, либо воспользоваться методом Свернуть(). Например, если нам нужно количество действий в день, мы сворачиваем таблицу по колонке "Дата" (предварительно приведя ее к началу дня) и суммируем количество записей. Для графической визуализации этих сведений отлично подойдёт инструмент для построения активности пользователя на диаграмме Ганта.
Проверьте права доступа! Для вызова функции ВыгрузитьЖурналРегистрации() у пользователя должна быть активна роль "Просмотр журнала регистрации". Если прав недостаточно, функция не вызовет исключения, но вернет абсолютно пустую таблицу значений, что часто сбивает с толку разработчиков.
Также имейте в виду формат хранения журнала. В современных версиях 1С (начиная с 8.3.5) используется формат SQLite (расширение .lgp). Это обеспечивает высокую скорость чтения, но при работе в режиме "Сервер-клиент" всегда помните о нагрузке на рабочий процесс сервера 1С при формировании больших отчетов по журналу.
Рассмотренные нами методы позволяют быстро и эффективно автоматизировать сбор статистики. Используйте структуру Отбор для минимизации нагрузки и метод ЗначениеВРеквизитФормы() для оперативного вывода данных пользователю.