Механизм История данных — это встроенная возможность платформы «1С:Предприятие 8.3», которая позволяет отслеживать изменения объектов (справочников, документов и др.) на уровне системных таблиц СУБД. В отличие от версионирования в составе БСП (Библиотеки стандартных подсистем), платформенный механизм работает быстрее и асинхронно, что снижает нагрузку на основную транзакцию записи. В этой статье мы разберем, как включить этот механизм, где найти визуальные средства работы с ним и как управлять процессом программно.
Часто разработчики ошибочно полагают, что платформенное версионирование предоставляет только программный интерфейс (API). На самом деле, платформа содержит встроенные формы для просмотра истории изменений. Рассмотрим, как их найти.
Если для объекта включена история данных, в управляемой форме этого объекта (например, документа или элемента справочника) стандартно доступна команда История изменений. Чтобы ее найти, выполните следующие действия:
В открывшемся окне можно увидеть список всех сохраненных версий, автора изменений, дату и номер версии. Платформа также позволяет сравнивать две произвольные версии объекта, выделяя измененные реквизиты. Кроме того, реализована возможность перехода на выбранную версию (откат данных), если у пользователя достаточно прав.
Для того чтобы механизм начал работать, его необходимо активировать для конкретных объектов метаданных. Проанализируем, какие настройки для этого требуются:
Документ.РеализацияТоваровУслуг).Важный нюанс: Платформенное версионирование поддерживает справочники, документы, планы видов характеристик, счета и задачи. Однако оно не работает для регистров. Если вам нужно отслеживать изменения в записях регистров сведений или накопления, придется использовать другие методы (например, БСП).
Одной из главных особенностей «Истории данных» является ее асинхронность. При записи объекта данные о версии не записываются в финальные таблицы истории мгновенно. Они попадают в специальную очередь. Это сделано для того, чтобы не замедлять работу пользователя в момент нажатия кнопки «Записать и закрыть».
Для того чтобы данные из очереди превратились в доступные версии, необходимо выполнять обновление истории. Рассмотрим, как это реализовать. Обычно в системе настраивается регламентное задание, которое с определенной периодичностью выполняет программный код:
// Пример вызова обновления очереди истории данных
ИсторияДанных.ОбновитьДанные();
Без выполнения этого метода версии в интерфейсе «История изменений» появляться не будут, так как очередь останется необработанной. Рекомендуется настраивать регламентное задание с интервалом от нескольких минут до часа, в зависимости от интенсивности работы пользователей.
Иногда требуется более тонкая настройка, чем просто «записывать всё». Разберем основные возможности встроенного языка для работы с историей.
1. Принудительное создание версии. Если вы программно меняете объект и хотите зафиксировать версию даже в том случае, если платформа считает изменения незначительными, используйте метод СоздатьВерсию():
СсылкаНаОбъект = Справочники.Контрагенты.НайтиПоКоду("001");
ИсторияДанных.СоздатьВерсию(СсылкаНаОбъект);
2. Получение данных на определенную дату. Вы можете программно «заглянуть в прошлое», получив состояние объекта на нужный момент времени:
Выборка = ИсторияДанных.ВыбратьВерсии(СсылкаНаОбъект);
Пока Выборка.Следующий() Цикл
// Анализируем структуру версии
ДанныеВерсии = ИсторияДанных.ПрочитатьВерсию(СсылкаНаОбъект, Выборка.НомерВерсии);
КонецЦикла;
3. Отключение версионирования в транзакции. Документация не рекомендует выполнять тяжелые операции с историей данных внутри транзакции записи объекта, так как это может привести к блокировкам. Если вы выполняете массовую загрузку данных, например при переносе данных между похожими конфигурациями 1С, версионирование лучше временно отключить или оставить его обработку на долю регламентного задания.
Даже если механизм включен и очередь обрабатывается, пользователи не увидят историю без соответствующих прав. Проанализируем необходимые роли:
Поскольку история данных хранится в системных таблицах СУБД, она может существенно увеличить размер базы со временем. Выясним, как управлять объемом этих данных. В отличие от БСП, в платформе нет готовой настройки «удалять через 30 дней». Разработчик должен сам реализовать процедуру очистки, используя метод УдалитьВерсии().
Рассмотрим пример кода для удаления версий старше определенной даты:
ГраницаОчистки = ТекущаяДата() - (60 * 60 * 24 * 365); // Удаляем данные старше года
ИсторияДанных.УдалитьВерсии(ГраницаОчистки);
Резюме: Платформенное версионирование — мощный и производительный инструмент. Его использование в самописных конфигурациях или проектах, где не внедрена БСП, оправдано минимальными затратами на внедрение: достаточно установить флаг в конфигураторе и добавить одно регламентное задание для обновления очереди.