Механизм История данных, появившийся в платформе «1С:Предприятие 8.3», является мощным встроенным инструментом для отслеживания изменений объектов. Однако при его программной настройке или очистке данных разработчики часто сталкиваются с неприятной ситуацией: в списке версий записи присутствуют, но при попытке их открытия система выдает лаконичное сообщение: «Данные истории не найдены». Рассмотрим подробнее, почему это происходит и как правильно управлять историей данных, чтобы избежать подобных ошибок.
Для начала проанализируем, как именно платформа сохраняет историю. В отличие от версионирования в составе БСП (Библиотеки стандартных подсистем), где зачастую каждая версия сохраняется целиком, платформенный механизм оптимизирован для экономии места в базе данных.
Выясним причину ошибки: если мы программно удаляем старые версии, используя метод УдалитьВерсии с указанием даты порога, и под этот порог попадает та самая «базовая» версия (полный слепок), все последующие версии-дельты становятся бесполезными. Система видит запись о событии в списке, но не может «собрать» объект, так как ей не от чего оттолкнуться. Именно в этот момент мы получаем сообщение об отсутствии данных.
Рассмотрим пример кода, который часто становится причиной проблемы. Если мы хотим «обнулить» историю и используем текущую дату в качестве порога удаления, мы рискуем нарушить целостность цепочки версий:
// Опасный способ очистки истории
ПорогХранения = ТекущаяДата();
ИсторияДанных.УдалитьВерсии(ОбъектМетаданных, ПорогХранения);
В данном случае, если после этого выполнить новую запись объекта, платформа создаст версию с очередным номером (например, 12), которая будет содержать только изменения. Но базовая версия (версия 1) уже удалена. В результате версия 12 не откроется.
Если нам необходимо полностью очистить историю для конкретного документа или справочника и начать нумерацию заново, мы должны следовать строгому алгоритму. Посмотрим на правильную последовательность действий:
Проанализируем правильный код для полной очистки истории объекта:
// 1. Отключаем использование истории для документа
ИсторияДанных.УстановитьНастройки(Метаданные.Документы.МойДокумент, Неопределено);
// 2. Удаляем абсолютно все версии без привязки к дате
ИсторияДанных.УдалитьВерсии(Метаданные.Документы.МойДокумент);
// 3. Принудительно обновляем состояние (необязательно, но полезно при экспериментах)
ИсторияДанных.ОбновитьИсторию(Истина, Истина);
// 4. После этого можно заново включить настройки в конфигураторе или программно
// Новые версии начнут записываться с номера 1 и будут содержать полный слепок.
Важно помнить, что запись в историю данных происходит не всегда мгновенно. Платформа использует системную таблицу-очередь _DataHistoryQueue. Разберем этот процесс по шагам:
ОбновитьИсторию) считывает данные из очереди, сравнивает их с предыдущей версией и переносит в основную таблицу _DataHistoryVersions.Если вы только что включили историю или программно изменили объект и сразу пытаетесь открыть версию, а фоновое задание еще не отработало, вы также можете увидеть ошибку отсутствия данных. В целях отладки всегда рекомендуется вызывать обновление истории принудительно:
ИсторияДанных.ОбновитьИсторию();
Обратите внимание, что даже после удаления версий через УдалитьВерсии(Метаданные, Дата), внутренний счетчик версий платформы может не обнулиться. Если вы видите, что первая после очистки версия имеет номер 10 или 15, это верный признак того, что базовая версия была удалена некорректно. Запомните правило: полноценная работа истории возможна только тогда, когда в цепочке присутствует хотя бы одна версия с типом «Создание» (полный слепок), от которой строятся все последующие «Карандаши» (изменения).
Таким образом, для стабильной работы механизма История данных следует избегать частичного удаления старых версий без понимания структуры их хранения. Если требуется очистка — делайте её полной с предварительным отключением настроек метаданных, что гарантирует корректную инициализацию механизма при следующей записи объекта.