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