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