Как программно узнать пользователя, создавшего документ в 1С 8.3

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

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

Способ 1. Программный поиск автора через журнал регистрации

Журнал регистрации платформы 1С фиксирует все ключевые события информационной базы, включая создание, модификацию и проведение объектов. Мы можем программно выгрузить записи журнала в таблицу значений с помощью глобального метода ВыгрузитьЖурналРегистрации().

Для точного поиска конкретного документа в структуре фильтра используется системный параметр Данные, куда передается ссылка на документ, а также системное событие создания _$Data$_.New. Разберем пример функции, возвращающей имя пользователя:


Функция ПолучитьАвтораДокумента(СсылкаНаДокумент) Экспорт

    ТаблицаЖР = Новый ТаблицаЗначений;
    Фильтр = Новый Структура;
    Фильтр.Вставить("Данные", СсылкаНаДокумент);
    Фильтр.Вставить("Событие", "_$Data$_.New");

    ВыгрузитьЖурналРегистрации(ТаблицаЖР, Фильтр, "Дата, Пользователь, ИмяПользователя");

    Если ТаблицаЖР.Количество() > 0 Тогда
        Возврат ТаблицаЖР[0].ИмяПользователя;
    КонецЕсли;

    // Если документ создавался сразу проведением, проверяем событие _$Data$_.Post
    Фильтр.Вставить("Событие", "_$Data$_.Post");
    ВыгрузитьЖурналРегистрации(ТаблицаЖР, Фильтр, "Дата, Пользователь, ИмяПользователя");
    
    Если ТаблицаЖР.Количество() > 0 Тогда
        // Сортируем по возрастанию даты, чтобы взять самую первую запись
        ТаблицаЖР.Сортировать("Дата Возр");
        Возврат ТаблицаЖР[0].ИмяПользователя;
    КонецЕсли;

    Возврат "Не определен";

КонецФункции

Проанализируем важные технические нюансы работы с журналом регистрации:

  1. Усечение журнала: Если в базе настроено регулярное сокращение или очистка журнала регистрации, события по старым документам могут отсутствовать. В этом случае восстановить создателя невозможно.
  2. Производительность: Метод ВыгрузитьЖурналРегистрации() создает высокую нагрузку на дисковую подсистему и сервер 1С. Крайне не рекомендуется вызывать его в цикле построчно для большого количества документов. Если требуется обработать массив данных, выгружайте события журнала пачкой за заданный интервал дат.
  3. Удаленные пользователи: Если учетная запись сотрудника была физически удалена из списка пользователей информационной базы, значение в колонке Пользователь вернет Неопределено, однако текстовое представление в колонке ИмяПользователя сохранится.

Способ 2. Использование механизмов «История данных» и версионирования

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

Рассмотрим два варианта в зависимости от используемых технологий:

  1. Платформенный механизм «История данных» (в платформе 8.3.11 и выше): Если для объекта включена история данных, мы можем обратиться к менеджеру ИсторияДанных, прочитать версии объекта и взять самую раннюю (версию № 1). Объект версии хранит свойства Пользователь и ИмяПользователя.
  2. Подсистема «Версионирование объектов» БСП: Если в конфигурацию интегрирована Библиотека стандартных подсистем и для документа настроено версионирование, достаточно выполнить запрос к регистру сведений ВерсииОбъектов. Выбрав запись с минимальным номером версии для нужной ссылки, мы получим автора создания документа из поля АвторВерсии.

Способ 3. Доработка конфигурации и заполнение реквизита «Автор»

Чтобы в будущем не прибегать к тяжелым операциям чтения журнала регистрации, правильным архитектурным решением является добавление отдельного реквизита в метаданные документа.

Разберем по шагам правильную организацию этого процесса:

  1. Добавим в документ реквизит Автор (тип СправочникСсылка.Пользователи или строка).
  2. Заполним реквизит при интерактивном вводе и программном создании. Для этого в модуле объекта определим обработчик ОбработкаЗаполнения или событие ПередЗаписью:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если ЭтоНовый() И НЕ ЗначениеЗаполнено(Автор) Тогда
        // Для БСП используется метод Пользователи.ТекущийПользователь()
        // Для чистой конфигурации можно получить текущего пользователя ИБ
        Автор = ПользователиИнформационнойБазы.ТекущийПользователь();
    КонецЕсли;
    
КонецПроцедуры

Для существующих документов напишем служебную обработку, которая один раз считает авторов из журнала регистрации и запишет их в созданный реквизит. При программной перезаписи исторических данных обязательно используем флаг ОбменДанными.Загрузка = Истина, чтобы исключить повторные проверки, перепроведение и искажение движений по регистрам:


ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.Автор = НайденныйПользователь;
ДокументОбъект.Записать();

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

← На главную