При разработке систем учета заявок и поручений часто возникает необходимость не просто хранить текущее состояние документа, но и видеть всю хронологию событий: кто создал задачу, как менялся исполнитель, когда произошла переадресация и кто в итоге ее выполнил. В контексте конфигурации 1С:Документооборот и систем на базе БСП (Библиотека стандартных подсистем) существует несколько подходов к решению этой задачи. Рассмотрим их подробно, проанализируем плюсы и минусы каждого метода и разберем по шагам реализацию.
Если ваша основная цель — аудит изменений реквизитов (например, кто и когда изменил поле Исполнитель или Адресат), самым быстрым решением будет подключение документа к подсистеме Версионирование объектов. Этот механизм уже встроен в большинство современных типовых конфигураций.
Рассмотрим алгоритм подключения самописного документа к версионированию:
Использовать версионирование объектов.ВерсионируемыеОбъектыОбъект (название может незначительно отличаться в зависимости от версии БСП) и добавить в его состав наш самописный документ.ЗаписатьВерсиюОбъекта. Обычно это происходит автоматически при правильной настройке определяемых типов.Версионировать при записи.Проанализируем ситуацию: Версионирование отлично подходит для ответа на вопрос "Что изменилось в этом поле?". Однако оно неэффективно для построения статистических отчетов (например, "среднее количество переадресаций в месяц"), так как данные хранятся в сжатом XML-формате в регистре ВерсииОбъектов. Для извлечения данных в отчет системе придется программно распаковывать каждую версию, что крайне медленно.
Если документ по своей сути является заявкой, которая движется между сотрудниками, то правильнее использовать объекты типа БизнесПроцесс и Задача. В 1С:Документообороте это базовый механизм.
Разберем логику работы этого механизма:
Вместо того чтобы менять реквизиты в одном и том же документе, мы запускаем процесс. На каждом этапе процесса система создает объект ЗадачаИсполнителя. Рассмотрим пример жизненного цикла:
Выясним преимущество: Каждая задача — это отдельная запись в базе со своим временем создания, исполнения и исполнителем. Это позволяет строить любые статистические отчеты запросом к таблице задач, не прибегая к сложным манипуляциям с историей изменений. Вы всегда сможете увидеть цепочку: Задача 1 (Адресат А) -> Задача 2 (Адресат Б) -> Задача 3 (Исполнитель В).
Если переход на бизнес-процессы кажется слишком сложным, а версионирование не дает нужной аналитики, проанализируем вариант с созданием собственного регистра истории. Это "золотая середина" для получения быстрой статистики.
Создадим непериодический регистр сведений ИсторияИзмененийЗаявок со следующими измерениями и ресурсами:
Для записи данных воспользуемся подпиской на событие ПередЗаписью. Проанализируем пример кода, который фиксирует смену исполнителя:
Процедура ПередЗаписьюЗаявкиДляИстории(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Получаем старые данные из базы для сравнения
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если Источник.ЭтоНовый() Тогда
// Логируем создание документа
Иначе
СтарыйОбъект = Источник.Ссылка.ПолучитьОбъект();
Если Источник.Исполнитель <> СтарыйОбъект.Исполнитель Тогда
// Зафиксируем переадресацию
Запись = РегистрыСведений.ИсторияИзмененийЗаявок.СоздатьМенеджерЗаписи();
Запись.Объект = Источник.Ссылка;
Запись.ДатаИзменения = ТекущаяДатаСеанса();
Запись.АвторИзменений = Пользователи.ТекущийПользователь();
Запись.Событие = "Переадресация";
Запись.СтароеЗначение = СтарыйОбъект.Исполнитель;
Запись.НовоеЗначение = Источник.Исполнитель;
Запись.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Использование ОбменДанными.Загрузка в коде выше критически важно для того, чтобы история не записывалась повторно при обмене данными или выполнении регламентных операций.
Подведем итог:
Для реализации качественной статистики (как в Сообщении 7 темы форума) мы рекомендуем комбинацию: использование бизнес-процессов для логики работы и стандартных отчетов по задачам для анализа эффективности отделов. Это позволит избежать "велосипедов" и обеспечит высокую производительность системы даже при больших объемах данных.