Как автоматически менять ответственного в документе на пользователя, который внес последние изменения?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет Финансы и профессиональные услуги
← На главную

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

Решение через подписку на событие

Самым эффективным способом реализации данной задачи является создание Подписки на событие. Этот механизм позволяет перехватить действие записи документа до того, как данные будут сохранены в базе, и внести необходимые коррективы в реквизиты объекта.

Для реализации нам потребуется создать новую подписку в конфигураторе, указать событие ПередЗаписью и выбрать в качестве источника нужный нам вид документа (например, БанковскиеВыписки).

Давайте разберем код, который необходимо разместить в обработчике данной подписки:


Процедура ПриЗаписиОтветственногоПередЗаписью(Источник, Отказ)
    // Проверяем, не происходит ли загрузка данных из внешнего источника
    Если Источник.ОбменДанными.Загрузка = Истина Тогда
        Возврат;
    КонецЕсли;

    // Проверяем, не отказано ли уже в записи
    Если Отказ = Истина Тогда
        Возврат;
    КонецЕсли;

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

Разберем детально, что происходит в этом фрагменте кода:

  1. Проверка обмена данными: Мы используем Источник.ОбменДанными.Загрузка, чтобы наша логика не срабатывала при автоматических загрузках данных, где поле Ответственный может иметь иное значение.
  2. Проверка отказа: Если в других подписках уже установлен флаг Отказ = Истина, мы прерываем выполнение, чтобы не нарушить целостность процесса записи.
  3. Фильтрация режимов: Мы ограничиваем действие кода так, чтобы ответственный не менялся при обычном снятии документа с проведения, если это не требуется бизнес-логикой.
  4. Установка пользователя: Мы обращаемся к ПараметрыСеанса.ТекущийПользователь, который автоматически определяет того, кто инициировал запись в текущем сеансе работы.

Как отследить изменение конкретных реквизитов

Иногда требуется менять ответственного только в том случае, если были изменены определенные данные. Если вам нужно проверить, изменился ли хоть какой-то реквизит документа, можно использовать сравнение текущего объекта с тем, что записано в базе данных.

Рассмотрим пример алгоритма, который позволяет определить факт внесения изменений:


МетаданныеОбъекта = Источник.Ссылка.Метаданные();
УраРеквизитИзменился = Ложь;

Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
    Если Не Источник[Реквизит.Имя] = Источник.Ссылка[Реквизит.Имя] Тогда
        УраРеквизитИзменился = Истина;
        Прервать;
    КонецЕсли;
КонецЦикла;

Если УраРеквизитИзменился Тогда
    Источник.Ответственный = ПараметрыСеанса.ТекущийПользователь;
КонецЕсли;

Важные рекомендации по реализации

При внедрении данного решения, проанализируем следующие моменты:

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

← На главную