Проблемы перехода на механизм истории данных

25.06.26

Разработка - Механизмы платформы 1С

Платформенный механизм "История данных". Возможные проблемы при переходе на использование механизма.

Механизм истории данных существует уже не первый год. Не буду перечислять его преимущества и недостатки, а остановлюсь на проблемах, с которыми столкнулась в процессе и по результатам перехода.

 

1. Перенос существующих версий БПС в историю данных

Что привело к проблеме: большой объем переносимых данных, перенос не по порядку периода версий.

В нашей компании активно использовался механизм версионирования БСП, и при переходе на историю данных было принято решение о сохранении накопленных данных. Изначально решили перенести данные за последние 3 месяца. Однако после перехода все-таки потребовалось продублировать историю полностью. Сама по себе процедура переноса работе не мешала, но по некоторым объектам получилась ситуация, когда порядок версий по периоду не соответствовал порядку номеров версий.

Казалось бы, проблема не критичная – исходные номера версий фиксировались в комментарии, а сортировку по дате можно при желании реализовать в существующей форме «История изменений истории данных», но при тестировании удаления версий с «истекшим сроком годности» выяснилось, что удаление версий до даты работает скорее от номера версии, чем от даты удаления.

Воспроизведу пример на базе конфигурации «Демо БСП»

История объекта до удаления:

 

 

Выполнен метод:

ИсторияДанных.УдалитьВерсии(ОбъектМетаданных, ГраницаУдаления);

Где

ОбъектМетаданных = Метаданные.Справочники._ДемоКонтрагенты

ГраницаУдаления = 01.01.2015

Результат выполнения

 

 

Ожидала, что будут удалены версии с 6 по 8, но похоже, что удаление происходит по номерам версий. То есть складывается впечатление, что метод получает номер первой версии, которая не попадает в указанный период (или последнюю, которая попадает) и удаляет все версии с номерами меньше найденной.

Эта проблема у нас осталась нерешенной – от удаления отказались.

 

2. Использование расширений и новые реквизиты объекта

В процессе работы обратила внимание на то, что для некоторых объектов метаданных, по которым включена история данных, в данные версии не попадают значения реквизитов, добавленных после включения истории. Происходило это не для всех объектов, большинство работало так, как заявлено в документации.

В первую очередь были проверены настройки объекта на предмет включения новых реквизитов в историю и новые реквизиты отражались там как включенные. А вот в результате выполнения метода

ИсторияДанных.ПолучитьМетаданные();

в структуре возвращаемых полей нужного реквизита не было. После череды проверок с анализом таблицы СУБД _DataHistoryMetadata удалось выяснить следующее:

В случае, когда для объекта включена история данных, объект добавлен в расширение (в нашем случае в расширение не добавлялись реквизиты объекта) и по этому объекту добавляется реквизит в основной конфигурации, этот реквизит может не попасть в структуру метаданных истории данных и будет отсутствовать в версии данных.

Единоразово может помочь отключение/включение хранение истории, но последующие добавляемые реквизиты в метаданные истории не попадут.

Проблему получилось воспроизвести на платформе 8.3.27.1719 в демонстрационной конфигурации БСП. Ошибка была зарегистрирована 1С (bugboard.1c, 60027282.)

Про анализ таблицы _DataHistoryMetadata расскажу немного подробнее.

В этой таблице хранятся метаданные истории данных. Согласно документации версия метаданных для объекта создается в момент изменения структуры метаданных объекта (например, добавление реквизита), метаданные прежних версий так же сохраняются.

Для начала посмотрим, как выглядит таблица при отсутствии расширений. Возьму справочник, по которому ранее история данных не велась и включу настройку в режиме 1С предприятия (Буду работать со справочником «Ставки НДС»). В целевой таблице появится запись следующего вида:

 

 

_IsSettings – указывает, что версия метаданных сформирована при изменении настроек

_IsActual – указывает, что версия метаданных является актуальной

_MetadataVersionNumber – Номер актуальной версии метаданных в нашем случае равен 1 (история была включена впервые)

_IsExtensions - признак доработки объекта в расширении

Теперь добавим реквизит в этот справочник, и посмотрим, что произойдет в таблице.

В журнале регистрации помимо информации об изменении объекта будет зафиксирована информация об изменении таблицы метаданных истории данных:

 

 

В самой таблице метаданных истории появилась новая запись, для которой _MetadataVersionNumber стал «2», _IsActual – истина. А для первой версии _IsActual отключился

 

 

То же самое произойдет, если мы добавим еще один реквизит или непустую табличную часть – будет добавлена новая строка с новым номером версии метаданных и установленным признаком _IsActual. Для предыдущей версии _IsActual будет отключен

 

 

При отключении хранения истории в режиме 1С:Предприятие _IsActual отключается

 

 

При повторном включении происходит то же, что при добавлении нового реквизита

 

 

Теперь воспроизведу ситуацию, которая приводит к неожиданному поведению системы.

Справочник «Виды цен» добавляю в расширение (добавляю только модуль менеджера)

Включаю историю данных. Таблица метаданных истории данных выглядит так же, как и в начале предыдущего примера, но здесь включен флаг _IsExtensions. По идее это не противоречит истине, так как объект действительно включен в расширение.

 

 

Добавляю реквизит в конфигурацию. В журнале регистрации вижу, что был изменен сам объект и таблица метаданных истории данных.

 

 

Выполняю запрос к _DataHistoryMetadata и вижу, что никаких изменений не произошло

 

 

Получается, что новая версия метаданных в таблице не зарегистрировалась. Что подтверждается при формировании версии данных – новый реквизит там так же отсутствует.

Пробую отключить/включить хранение истории объекта в режиме 1С: Предприятие

При отключении ожидаю, что _IsActual будет отключен, но этого не происходит

 

 

При включении добавляется строка с новым номером версии, но в отличии от предыдущего эксперимента, _IsActual остается включенным у обеих строк

 

 

Тем не менее, добавленный ранее реквизит появляется в новых версиях.

При повторении добавления реквизита происходит то же самое – не добавляется строка в целевой таблице и в данных версии нового реквизита нет. И в этот раз включение/отключение настроек уже не спасает. Несмотря на то, что добавляется новая строка с новым номером версии метаданных, в версии данных объекта нового реквизита нет.

 

 

Для решения проблемы пользуемся методом, который крайне не рекомендуется при работе с 1С – вносим изменения в _DataHistoryMetadata прямым запросом SQL, который устанавливает значение поля _IsActual = 0х00 для всех версий, кроме самых последних.

Вариант не самый лучший, но другого не нашли.

 

3. Использование метода СформироватьПоВерсии()

Согласно документации метод позволяет сразу получить объект данных требуемой версии по его ссылке или ключу записи, но если в версии объекта, по которой производим формирование, отсутствие реквизит или табличная часть, имеющиеся в текущей ссылке, то они будут заполнены данными этой ссылки. Аналогично ведет себя команда «Перейти на версию». В этом есть определенный смысл, например, при появлении реквизита, обязательного к заполнению, но в некоторых случаях может привести к искажению данных.

 

Вот, пожалуй, и все моменты, на которые хотелось бы обратить внимание.

Полезные статьи по теме:

Версионирование объектов VS История данных

Вступайте в нашу телеграмм-группу Инфостарт

История данных Платформа 1С

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    34575    TitanLuchs    108    

150

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    18920    bayselonarrend    127    

68

Механизмы платформы 1С Программист 1С:Предприятие 8 Бесплатно (free)

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    24282    user2122906    10    

66

Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 Бесплатно (free)

Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.

17.01.2025    42569    user2122906    12    

62

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    35457    dsdred    106    

152

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    30928    bayselonarrend    22    

178

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    16601    dsdred    22    

89
Для отправки сообщения требуется регистрация/авторизация