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