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