В процессе работы с документами в системе 1С часто возникает задача автоматизировать аудит изменений. Одной из частых потребностей является фиксация пользователя, который последним отредактировал документ, в поле Ответственный. Рассмотрим, как реализовать эту задачу программными средствами, сохраняя корректность работы конфигурации.
Самым эффективным способом реализации данной задачи является создание Подписки на событие. Этот механизм позволяет перехватить действие записи документа до того, как данные будут сохранены в базе, и внести необходимые коррективы в реквизиты объекта.
Для реализации нам потребуется создать новую подписку в конфигураторе, указать событие ПередЗаписью и выбрать в качестве источника нужный нам вид документа (например, БанковскиеВыписки).
Давайте разберем код, который необходимо разместить в обработчике данной подписки:
Процедура ПриЗаписиОтветственногоПередЗаписью(Источник, Отказ)
// Проверяем, не происходит ли загрузка данных из внешнего источника
Если Источник.ОбменДанными.Загрузка = Истина Тогда
Возврат;
КонецЕсли;
// Проверяем, не отказано ли уже в записи
Если Отказ = Истина Тогда
Возврат;
КонецЕсли;
// Условие исключения для операции отмены проведения
Если Не Источник.РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда
Источник.Ответственный = ПараметрыСеанса.ТекущийПользователь;
КонецЕсли;
КонецПроцедуры
Разберем детально, что происходит в этом фрагменте кода:
Источник.ОбменДанными.Загрузка, чтобы наша логика не срабатывала при автоматических загрузках данных, где поле Ответственный может иметь иное значение.Отказ = Истина, мы прерываем выполнение, чтобы не нарушить целостность процесса записи.ПараметрыСеанса.ТекущийПользователь, который автоматически определяет того, кто инициировал запись в текущем сеансе работы.Иногда требуется менять ответственного только в том случае, если были изменены определенные данные. Если вам нужно проверить, изменился ли хоть какой-то реквизит документа, можно использовать сравнение текущего объекта с тем, что записано в базе данных.
Рассмотрим пример алгоритма, который позволяет определить факт внесения изменений:
МетаданныеОбъекта = Источник.Ссылка.Метаданные();
УраРеквизитИзменился = Ложь;
Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
Если Не Источник[Реквизит.Имя] = Источник.Ссылка[Реквизит.Имя] Тогда
УраРеквизитИзменился = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если УраРеквизитИзменился Тогда
Источник.Ответственный = ПараметрыСеанса.ТекущийПользователь;
КонецЕсли;
При внедрении данного решения, проанализируем следующие моменты:
Метаданные может быть ресурсоемким для документов с большим количеством полей. В таких случаях лучше явно перечислить критически важные реквизиты для проверки.Ответственный, рекомендуем включить типовое Версионирование объектов в настройках подсистем 1С. Это позволит сохранить данные о предыдущих ответственных и видеть, кто именно менял документ в прошлом.Ответственный, иначе при попытке записи система выдаст ошибку нарушения прав доступа.Используя предложенные методы, вы сможете гибко настроить процесс фиксации действий пользователей в системе 1С, обеспечив прозрачность работы с документами на вашем предприятии.