ВО – Версионирование объектов
ИД – История данных
БСП – Библиотека стандартных подсистем
Киллер-фича – особенность ИД или ВО, отсутствующая у конкурирующей подсистемы, но дающая очень нужный функционал
Баг – Недоработка, приводящая к нежелательным последствиям
Фича – специфичное поведение, фишка
Содержание:
Почему я решил написать данную статью?
Программное включение, проверка и сброс настроек ИД
Создание версий. Изменение объекта, выборка изменений и переход на версию
Восстановление удаленного объекта
Тонкость с общими реквизитами и регистрами сведений
Особенность записи версии (перевод с авто на ручной режим) [upd 11.05.2023]
Ошибка ПриЗаписи(). Вылечили в платформе 8.3.24.1020 [upd 19.06.2023]
Обработка после записи версии истории данных
По ходу экспериментов попытаюсь ответить на вопросы, как работает механизм «История данных», но если эксперименты вам неинтересны, тогда можно сразу перейти к пункту «Кратко о ИД», правда лучше еще посмотреть пункты «Тонкость с общими реквизитами и регистрами сведений», «Обработка после записи версии истории данных», «Особенность для плана счетов».
1 История данных появилась довольно-таки давно, в платформе 8.3.11.2867 от 21.11.17, а используют ее единицы.
В 2021 году я провел около 100 собеседований за 3 месяца. В финальной части собеседования я задавал шесть вопросов и один из вопросов звучал так:
«В БСП есть подсистема «Версионирование объектов» и в платформе есть механизм «История данных». В чем отличия?»
Если привести статистику, то 50% не слышали про ИД. 20% слышали, но не знают, в чем отличие.
2 Более развернуто ответить на вопрос из новости: Новое в 1С 8.3.24: настройка истории изменения данных в режиме 1С:Предприятие
«посоветуйте, какой механизм выбрать, если база запускается с нуля?
на перспективу Платформенный? или отработанный БСПшный?
Настроить какой реквизит в документе сохранять или нет, конечно круто, но напрягают все эти костыли с внешними обработками по настройке»
3 Не нашел статью, детально разжевывающей механизм «История данных» со всеми нюансами. Захотел поковыряться, собрать всю информацию в одном месте, чтобы по необходимости подсматривать. [Шпаргалка]
4 И возможно популяризировать «Историю данных», но это не точно.
Я не буду описывать, что должна быть использована функциональная опция "ИспользоватьВерсионированиеОбъектов" и какое дополнительное свойство объекту можно добавить, чтобы запись версии не состоялась, просто опишу, как происходит работа «в лоб».
Есть подписка на событие «ЗаписатьВерсиюОбъекта», работает она перед записью. Источник вызова «ОпределяемыйТип.ВерсионируемыеДанныеОбъект», в нем описаны все типы, по которым работает версионирование.
Версии пишутся в регистр сведений «ВерсииОбъектов» у которого есть измерение «Объект» с жестким описанием типа «БизнесПроцессСсылка, ДокументСсылка, ПланВидовРасчетаСсылка, ЗадачаСсылка, ПланВидовХарактеристикСсылка, ПланСчетовСсылка, СправочникСсылка».
Сама версия хранится в ресурсе «ВерсияОбъекта», в регистре «ВерсияОбъектов»:

1 Есть подписка «ОчиститьИнформациюОбАвтореВерсии», это служебный вариант чистки версий.
2 Есть регламентное задание «ОчисткаУстаревшихВерсийОбъектов», которое на основание регистра сведений «НастройкиВерсионированияОбъектов» чистит старые версии. Версия хранится на основании ресурса «СрокХраненияВерсий» с типом ПеречислениеСсылка.СрокиХраненияВерсий.

3 Когда вы удаляете объект, удаляются все его версии. [Поведение это можно поправить, но нужно программировать]
4 Можно просто зайти в регистр «ВерсииОбъектов» и удалить (Del) версии вручную. [Это, кстати, не очень хорошо и с ИД так не сделать]
Вот тут остановимся поподробнее, рассмотрим в примерах.
ИД работает по следующим объектам:
- Общие реквизиты;
[Включено автоматически и программно менять нельзя]
- Константы; [с версии "8.3.13"]
- Планы обмена; [с версии "8.3.13"]
- Справочники;
- Документы;
- Планы видов характеристик; [с версии "8.3.12"]
- Планы счетов; [с версии "8.3.12"]
- Планы видов расчета; [с версии "8.3.13"]
- Бизнес-процессы;
- Задачи;
- Регистры сведений.
[Измерения включены по умолчанию и выключать их нельзя]
Киллер-фича №0: ИД может хранить историю по регистрам сведений. ВО так не умеет.
_DataHistoryMetadata – Метаданные истории данных
_DataHistorySettings – Настройки истории данных
_DataHistoryQueue0 – Очередь истории данных
_DataHistoryLatestVersions, _DataHistoryLatestVersions1, _DataHistoryLatestVersions2 – Последние версии истории данных
_DataHistoryVersions – Версия истории данных
_DataHistoryAfterWriteQueue – Очередь обработки после записи истории данных.
[Появилась в версии 8.3.15. Если стоит версия совместимости меньше 8.3.15, тогда данной таблицы в СУБД не будет]
Данные таблицы реализованы для объектов, созданных в расширении:
_DataHistoryMetadataExtX1 – Метаданные истории данных
_DataHistorySettingsExtX1 – Настройки истории данных
_DataHistoryVersionsExtX1 – Версия истории данных
_DataHistoryLatestVerExtX1 – Последние версии истории данных
Давайте перейдем к экспериментам в ходе которых появятся ответы как работает ИД.
Подготовительные действия:
Скачал БСП 3.1.7.306 и развернул демо базу.
В MSSQL почистил регистр с версиями.

Код:
TRUNCATE TABLE [_InfoRg429]
В MSSQL написал небольшой запрос, который будет выводить по регистру ВО и всем служебным таблицам ИД следующие данные:
- rows - количество строк(записей) в таблице,
- reserved - количество килобайт, забронированное данной таблицей,
- data - количество килобайт, используемое данными,
- index_size - количество килобайт, используемое индексами,
- unused - количество килобайт, забронированное таблицей, но пока данное пространство не заполнено данными.
Код:
USE BSP_DEMO
go
sp_spaceused [_InfoRg429]
go
sp_spaceused [_DataHistoryLatestVersions]
go
sp_spaceused [_DataHistoryLatestVersions1]
go
sp_spaceused [_DataHistoryLatestVersions2]
go
sp_spaceused [_DataHistoryMetadata]
go
sp_spaceused [_DataHistoryQueue0]
go
sp_spaceused [_DataHistorySettings]
go
sp_spaceused [_DataHistoryVersions]
go
sp_spaceused [_DataHistoryAfterWriteQueue]
Где BSP_DEMO – название базы данных.
Программное включение, проверка и сброс настроек ИД
Выключаем версионирование по всем объектам кроме документа «_ДемоПоступлениеТоваров»
Админстрирование/Общие настройки/История изменений/Настроить


Проверяем, что ИД в конфигураторе по документу «ДемоПоступлениеТоваров» выключено.
Видим, что история данных стоит «Не использовать»

Включаем программно ИД для документа «_ДемоПоступлениеТоваров»:
Настройки = Новый НастройкиИсторииДанных;
Настройки.Использование = Истина;
ИсторияДанных.УстановитьНастройки(Метаданные.Документы._ДемоПоступлениеТоваров, Настройки);
Можно воспользоваться бесплатной обработкой Настройка состава "Истории данных"

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

В колонке [_Content] содержится метаданные документа «_ДемоПоступлениеТоваров», в случае изменения метаданных будут создаваться новые версии метаданных.

В таблице [_DataHistorySettings]:

В колонке [_Content] хранятся настройки на основании которых будут собираться версии ИД.

Программные настройки можно прочитать следующим кодом:
Настройки = ИсторияДанных.ПолучитьНастройки(Метаданные.Документы._ДемоПоступлениеТоваров);
Если Настройки = Неопределено, значит программные настройки у объекта отсутствуют.
Давайте очистим программные настройки и посмотрим, что поменялось.
Программные настройки можно очистить следующим кодом:
ИсторияДанных.УстановитьНастройки(Метаданные.Документы._ДемоПоступлениеТоваров, Неопределено);
Я воспользуюсь обработкой Настройка состава "Истории данных"

В таблице [_DataHistoryMetadata] изменилась актуальность:

Таблица [_DataHistorySettings] стала пустой:

Таким образом мы получили подтверждение того, что программные настройки для ИД хранятся в [_DataHistorySettings]
Для продолжения экспериментов я опять включу ИД по документу «_ДемоПоступлениеТоваров»

Мы ничего не меняли, просто включили, очистили и повторно включили ИД по документу «_ДемоПоступлениеТоваров», но теперь у нас в таблице [_DataHistoryMetadata] две одинаковые версии метаданных.

Доказательство. Сделаем группировку по метаданным и содержимому:

[Баг №1] Мы нащупали узкое место. Я считаю это недоработкой, так как можно написать обработку, которая будет включать, менять или очищать настройки ИД до тех пор, пока база не съест все пространство. По-хорошему настройка метаданных должны сравниваться с предыдущей версией и если они идентичны тогда в предыдущей настройки метаданных менять статус на актуальную, не создавая новую запись.
Перед включением или выключением ИД убедитесь в том, что оно вам точно нужно
Киллер-фича №1: ИД настраивается программно. ВО первоначально настраивается в конфигураторе. ИД имеет возможность тонкой настройки, ВО настраивается на объект целиком.
Создание версий. Изменение объекта и переход на версию.
Перед следующими экспериментами я почищу таблицы истории данных и программно включу ИД у документа «_ДемоПоступлениеТоваров»:

Давайте создадим версию в ВО и ИД:
Просто запишем документ из демо базы.

Появилась запись в регистре версий [_InfoRg429]:

В таблице, отвечающей за очередью [_DataHistoryQueue0] появилась запись:


В ИД версия формируется не сразу, сначала данные о версии поступают в очередь истории данных [_DataHistoryQueue0]. Для создания версий нужно выполнить код, либо в конфигураторе должна стоять галка «Обновлять историю данных после записи».
Выполним код создания версий:
ИсторияДанных.ОбновитьИсторию();
Примечание: В этот момент в одной из таблиц «DataHistoryLatestVersions» создается последняя версия данных затирая предыдущую, а в таблице «DataHistoryVersions» записывается разносное действие. Это важно понимать особенно когда споры идут про размер данных. Когда вы удаляете версии, вы удаляете действия из таблицы «DataHistoryVersions»
Запись в [_DataHistoryQueue0] исчезла:

Появилась запись в [_DataHistoryLatestVersions1]:

Эта таблица хранит последнюю версию объекта.

Появилась запись в [_DataHistoryVersions]:



На данном этапе версии в таблицах [_DataHistoryLatestVersions1] и [_DataHistoryVersions] равны.
Теперь в документе передвину строку вверх и создам версию:

В [_DataHistoryVersions] добавилась запись:

В [_DataHistoryLatestVersions1] была записана последняя версия:

Я сравнивал содержимое контента таблицы [_DataHistoryLatestVersions1] с предыдущей версией, различие было в 2 небольших фрагментах.
ТОП-6 инструментов для разработчика 1С
Подборка лучших инструментов для разработчика 1С включает Toolkit, DCT, OneDebugger, PrintWizard, DataFormWizard и Infostart MCP. Любой инструмент со скидкой 20% при покупке от двух решений.
Вступайте в нашу телеграмм-группу Инфостарт
