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

12.12.23

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

Давайте разберемся в механизме «История данных» и поэкспериментируем для наглядности. Сравним «Версионирование объектов» и «Историю данных».
 
 Сокращения:

ВО – Версионирование объектов

ИД – История данных

БСП – Библиотека стандартных подсистем

Киллер-фича – особенность ИД или ВО, отсутствующая у конкурирующей подсистемы, но дающая очень нужный функционал

Баг – Недоработка, приводящая к нежелательным последствиям

Фича – специфичное поведение, фишка

 

Содержание:

Почему я решил написать данную статью?

Как работает ВО?

Запись

Удаление

Как работает ИД?

Объекты использования

[Киллер-фича №0]

Таблицы в СУБД

Программное включение, проверка и сброс настроек ИД

[Киллер-фича №1]

[Баг №1]

Создание версий. Изменение объекта, выборка изменений и переход на версию

[Киллер-фича №2]

[Киллер-фича №3]

Восстановление удаленного объекта

[Киллер-фича №4]

Тонкость с общими реквизитами и регистрами сведений

Особенность для плана счетов

[Баг или фича?]

Особенность записи версии (перевод с авто на ручной режим) [upd 11.05.2023]

[Баг или фича?]

Ошибка ПриЗаписи(). Вылечили в платформе 8.3.24.1020 [upd 19.06.2023]

Обработка после записи версии истории данных

Таблицы, содержащие ExtX1

Кратко о ИД

Схема работы ИД

Выводы

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

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) версии вручную. [Это, кстати, не очень хорошо и с ИД так не сделать]

Как работает ИД?

Вот тут остановимся поподробнее, рассмотрим в примерах.

ИД работает по следующим объектам:

  1. Общие реквизиты;

[Включено автоматически и программно менять нельзя]

  1. Константы; [с версии "8.3.13"]
  2. Планы обмена; [с версии "8.3.13"]
  3. Справочники;
  4. Документы;
  5. Планы видов характеристик; [с версии "8.3.12"]
  6. Планы счетов; [с версии "8.3.12"]
  7. Планы видов расчета; [с версии "8.3.13"]
  8. Бизнес-процессы;
  9. Задачи;
  10. Регистры сведений.

[Измерения включены по умолчанию и выключать их нельзя]

Киллер-фича №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 небольших фрагментах.

Фрагмент добавлен:

Фрагмент удален:

Обратите внимание удаленный и добавленный фрагмент между собой схожи:

 
Содержимое версии 1:

 
Содержимое версии 2:

Вывод: Этот фрагмент и есть строка таблицы. Это доказывает, что таблицы [_DataHistoryLatestVersions], [_DataHistoryLatestVersions1] и [_DataHistoryLatestVersions2] созданы для хранения именно последней версии, а таблица [_DataHistoryVersions] хранит отличия.

 

Теперь в конфигураторе добавлю реквизит у документа, сохраню изменения и создам версию.

Запишу в реквизит «1» и создам версию:

Появилась новая версия метаданных:

В таблице [_DataHistoryVersions] версия записалась уже для новой версии метаданных:

Добавлю реквизит в расширение, сохраню изменения и создам версию:

Запишу в реквизиты «ВКонфигураторе» и «ВРасширении» значение «2»:

В таблице [_DataHistoryMetadata] появилась новая версия метаданных:

[_IsExtensions] = 0x01 [Признак того, что метаданные изменены в расширении]

 
 Получение метаданных версии:
МетаданныеВерсии = ИсторияДанных.ПолучитьМетаданные(Данные, НомерВерсии);

 

В таблице [_DataHistoryVersions] версия записалась уже для новой версии метаданных:

 

На текущий момент мы создали 4 версии, давайте их посмотрим.

[Недоработки] Вот тут мы сразу попадаем в неловкий момент…

Два абсолютно одинаковых пункта меню. Один из них ВО, а другой ИД.

История изменений ВО:

Сравним 4 и 1 версию в ВО:

История изменений ИД:

Как мы видим функционал ИД побогаче, тут есть отборы.

Обратите внимание в отборе можно указать «Удаление».

Киллер-фича №2: ИД хранит версии удаленных объектов из коробки. Для ВО такого не реализовано, я делал отдельную подсистему на основании ВО чтобы реализовать данную возможность -> Нестандартные подсистемы: Живая вода

Версии в ИД хранятся даже после удаления, поэтому если вам не нужна история необходимо продумать механизм очистки или переноса версий в стороннее хранилище.

Код удаления версий:

ИсторияДанных.УдалитьВерсии(Данные, НомерВерсииНачала, НомерВерсииКонца);

Сравним 4 и 1 версию в ИД:

Обратите внимание, когда мы сравнивали ВО информация выводилась подробнее и более «сухо», тут же мы видим, что произошло именно «Перемещение строки». Так происходит из-за того, что мы в ВО сравниваем версии целиком, а в ИД получаем только изменения.

Давайте получим сравнение версий для документа из ИД кодом:

РазличияВерсий = ИсторияДанных.ПолучитьРазличияВерсий(Документ, НомерВерсииПослеИзменения, НомерВерсииДоИзменения);

Сравнение 1 и 4 версии:

Одной строчкой кода мы получаем разницу версий, при этом изменения разделены на те, что «В конфигураторе» и те, что в «Расширении». Быстро и удобно.

Давайте попробуем перейти на 1 версию при помощи ВО:

Я напомню первая версия у нас была создана без добавленных реквизитов «ВКонфигураторе» и «ВРасширении».

УВЫ и АХ! ВО не смогла.

 
Текст ошибки:

Не удалось перейти на выбранную версию.

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

Техническая информация об ошибке: Ошибка преобразования данных XML

Пробуем перейти на 1 версию при помощи ИД:

Сложностей не возникло:

В первой версии у нас не было реквизитов поэтому их значение осталось из 4 версии.

Киллер-фича №3: ИД работает от изменений и сопоставление идет по названию полей, поэтому переход на версию проходит в независимости от структуры. ВО жестко привязана к структуре.

 

Восстановление удаленного объекта.

Давайте удалим документ и попробуем его восстановить при помощи ИД:

В ВО все версии были почищены, можно, конечно, поправить подписку, которая чистит версии и тогда версии останутся, но это уже доработка.

В таблице [_DataHistoryVersions] появилась версия:

[_ChangeType] = 2 [Означает, что данная версия хранит факт удаления]

Вообще восстановление версии делается одной строкой… Но для понимания, давайте сделаем в 3 шага.

1 Шаг. Получим удаленные версии.

Допустим мы знаем уникальный идентификатор удаленного объекта [b2b5373e-6f42-11e4-9b9b-20cf30c960a0].

Получаем битую ссылку:

БитаяСсылка = XMLЗначение(Тип("ДокументСсылка._ДемоПоступлениеТоваров"), "b2b5373e-6f42-11e4-9b9b-20cf30c960a0");

Далее нам надо получить все удаленные версии:

Отбор = Новый Структура;
Отбор.Вставить("Метаданные", Метаданные.Документы._ДемоПоступлениеТоваров);   
Отбор.Вставить("ВидИзмененияДанных", ВидИзмененияДанных.Удаление);
Отбор.Вставить("Данные", БитаяСсылка);
Версии = ИсторияДанных.ВыбратьВерсии(Отбор,,,);

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

Подойдет ли нам версия 7?

Нет, версия 7 не подойдёт, она не содержит данных.

2 Шаг. Получим данные версии идущей перед удаленной:

// Берем версию перед удалением 
НомерВерсии = Версии[0].НомерВерсии - 1;
ДанныеВерсии = ИсторияДанных.ПолучитьДанныеВерсии(БитаяСсылка, НомерВерсии);

Мы видим, что версия заполнена и нас устраивает.

3 Шаг. Восстановим данные по версии, идущей перед удаленной.

Давайте только попробуем сразу записать версию без запуска «ИсторияДанных.ОбновитьИсторию()»:

// Если данные есть восстанавливаем
Если ДанныеВерсии <> Неопределено Тогда  
	// Получаем объект по версии
	ВосстановленныйОбъект = ИсторияДанных.СформироватьПоВерсии(БитаяСсылка, НомерВерсии); 
	
	// отключаем стандартные проверки [Необязательно]
	ВосстановленныйОбъект.ОбменДанными.Загрузка = Истина; 
	
	// Сразу записываем версию вместо «ИсторияДанных.ОбновитьИсторию()» [Необязательно]
	ВосстановленныйОбъект.ЗаписьИсторииДанных.ОбновлятьИсториюСразуПослеЗаписи = Истина;
	
	ВосстановленныйОбъект.Записать();
КонецЕсли;

Мы программно включили при записи объекта выключенное в конфигураторе свойство: 

ВосстановленныйОбъект.ЗаписьИсторииДанных.ОбновлятьИсториюСразуПослеЗаписи = Истина;

              

Проверяем:

Что у нас в таблице [_DataHistoryVersions]:

[_ChangeType] = 0 [Означает, что данная версия была добавлена]

Теперь мы знаем, что статусы в отборе соответствуют полю [_ChangeType] из таблицы [_DataHistoryVersions].

[_ChangeType] = 0 [Добавление]

[_ChangeType] = 1 [Изменение]

[_ChangeType] = 2 [Удаление]

Киллер-фича №4: ИД из коробки умеет восстанавливать удаленный объект. ВО такое без доработки не может.

 

Тонкость с общими реквизитами и регистрами сведений

Общие реквизиты;

При попытке программно установить ИД у общих реквизитов вы увидите вот такую ошибку:

Регистры сведений.

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

Программно менять можно.

 

Особенность для плана счетов

У «ПлановСчетов» есть «ПризнакиУчета» и «ПризнакиУчетаСубконто», их имена могут совпадать.

В конфигураторе у нас есть возможность включать\выключать ИД в разрезе «ПризнакиУчета» и «ПризнакиУчетаСубконто».

Пример из ERP:

Было:

Стало:

Когда мы настраиваем ИД программно у нас нет возможности управлять в разрезе «ПризнакиУчета» и «ПризнакиУчетаСубконто».

Не рабочий код:

Настройки = Новый НастройкиИсторииДанных;

Настройки.Использование = Истина;

// специально указан "ПризнакиУчета.Валютный" для демонстрации ошибки
Настройки.ИспользованиеПолей.Вставить("ПризнакиУчета.Валютный", Ложь);

ИсторияДанных.УстановитьНастройки(Метаданные.ПланыСчетов.Международный, Настройки);

Рабочий код:

Настройки = Новый НастройкиИсторииДанных;

Настройки.Использование = Истина;

Настройки.ИспользованиеПолей.Вставить("Валютный", Ложь);

ИсторияДанных.УстановитьНастройки(Метаданные.ПланыСчетов.Международный, Настройки);

Таким образом мы установили ключ = «Валютный» в ложь сразу для «ПризнакиУчета» и «ПризнакиУчетаСубконто».

Проверим настройки:

НастройкиИД = ИсторияДанных.ПолучитьНастройки(Метаданные.ПланыСчетов.Международный);

[Баг или фича?] Не знаю баг это или фича, но я считаю это не доработкой.

 

Особенность записи версии.

Нам нужно делать версии в «Истории данных», но мы не хотим, чтобы это было в автоматическом режиме, хотим ручной режим.

Что делать?

Все мы использовали Планы обмена и знаем, что там есть автоматическая регистрация и возможность ее отключения:

Но в Истории данных у нас такой механизм отсутствует. Мы можем только использовать и не использовать ИД.

При попытке создать версию вручную по объекту с выключенной ИД мы получим ошибку.

Пример:

 
 Код создания версии:
Процедура ЗаписатьВерсию(СсылочныйЭлемент) 
	
	Данные 			= СсылочныйЭлемент.ПолучитьОбъект();
	ДатаСоздания 	= ТекущаяДатаСеанса(); 
	
	ТекущийПользователь 		= ПараметрыСеанса.ТекущийПользователь;
	ИдентификаторПользователяИБ = ТекущийПользователь.ИдентификаторПользователяИБ;	
	
	ИсторияДанных.ЗаписатьВерсию(Данные, ДатаСоздания, ИдентификаторПользователяИБ, 
		ТекущийПользователь.Наименование, ТекущийПользователь.ПолноеНаименование(), 
		ВидИзмененияДанных.Добавление, "Версия записана вручную");  
	
КонецПроцедуры

 

Получим ошибку:

Переводим создание ИД на ручной режим.

Включаем в конфигураторе ИД:

Программно отключаем историю данных:

И теперь повторяем создание версии:

Проверяем:

[Баг или фича?] Не знаю баг это или фича, но оказывается есть недокументированный способ перевести создание версий на ручной режим.

 

Ошибка ПриЗаписи(). Вылечили в платформе 8.3.24.1020

Подробнее в статье: История данных. Изменения в платформе 8.3.24

 

Обработка после записи версии истории данных.

Платформа предоставляет возможность выполнять действия, которые должны происходить только после того, как объект зафиксирован в истории данных. Когда версия записана после ИсторияДанных.ОбновитьИсторию() она попадает в очередь пост обработки [_DataHistoryAfterWriteQueue].

Данный функционал доступен с версии 8.3.15, поэтому, если режим совместимости ниже, в СУБД таблица [_DataHistoryAfterWriteQueue] будет отсутствовать.

Включаю режим совместимости 8.3.15 и выставляю галочку «Выполнять обработку после записи версии истории данных» по справочнику «_ДемоФизическиеЛица»

В модуле менеджера должна быть добавлена процедура «ОбработкаПослеЗаписиВерсийИсторииДанных», я добавил ее в расширении.

После чего зайдем и запишем любой элемент справочника «_ДемоФизическиеЛица».

Выполним в SQL запрос:

USE BSP_DEMO
go 
sp_spaceused [_DataHistoryAfterWriteQueue]

Результат в MSSQL:

Теперь необходимо вызвать обработчик:

ИсторияДанных.ВыполнитьОбработкуПослеЗаписиВерсий(Справочник);

Очень важно! Из [_DataHistoryAfterWriteQueue] запись сама по себе не исчезнет.

Чтобы удалить из пост очереди запись, выполняем код:

ИсторияДанных.УдалитьИзОбработкиПослеЗаписиВерсий(Справочник);

 

Таблицы, содержащие ExtX1

Добавляем в расширение новый справочник «_ДемоСправочник1» и включаем у него все что связано с ИД:

Результат в MSSQL:

Программно сниму ИД у стандартного реквизита «Ссылка»:

Записываем данные:

Что произойдет если удалить объект из расширения, по которому была включена ИД?

Результат в MSSQL:

При удалении объекта из расширения чистятся и все его следы из таблиц ИД.

 

Кратко о ИД

1 Если в конфигураторе или программно включена ИД тогда при изменении объекта происходит запись измененной структуры метаданных в таблицу [_DataHistoryMetadata]

Поля [_DataHistoryMetadata]:

_issettings – признак присутствия программных настроек

_isactual – признак актуальности версии метаданных

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

_metadataversionnumber – версия метаданных

_content – структура метаданных по объекту

_metadataid – идентификатор объекта

Получить метаданные версии:

ПолучитьМетаданные(<Данные>, <НомерВерсии>)

Получить актуальные метаданные:

ПолучитьМетаданные(<Метаданные>)

2 Программные настройки хранятся в таблице [_DataHistorySettings]

Поля [_DataHistorySettings]:

_content – программные настройки

_metadataid – идентификатор объекта

Получаем настройки:

ПолучитьНастройки(<Метаданные>)

Меняем и удаляем настройки:

УстановитьНастройки(<Метаданные>, <Настройки>)

 

3 Если в конфигураторе не установлена галка «Обновлять историю данных сразу после записи» или при записи объекта указано "ЗаписьИсторииДанных.ОбновлятьИсториюСразуПослеЗаписи = Ложь", тогда данные попадают в таблицу [_DataHistoryQueue0]. По большому счету это промежуточный буфер.

На данном этапе можно просто выполнить "ИсторияДанных.ОбновитьИсторию()", тогда данные о последней версии перелетят в одну из таблиц [_DataHistoryLatestVersions], [_DataHistoryLatestVersions1], [_DataHistoryLatestVersions2]. А разносная версия улетит в [_DataHistoryVersions].

[_ChangeType] поле с типом изменения из таблицы [_DataHistoryVersions]:

[_ChangeType] = 0 [Добавление]

[_ChangeType] = 1 [Изменение]

[_ChangeType] = 2 [Удаление]

Форма стандартного отбора работает с таблицей [_DataHistoryVersions] при помощи метода:

ВыбратьВерсии(<Отбор>, <Колонки>, <Порядок>, <МаксимальноеКоличество>)

Если включена галка «Выполнить обработку после записи версии данных», тогда при помощи "ИсторияДанных.ОбновитьИсторию(Истина)" можно сделать чтобы данные перелетели в таблицу [_DataHistoryAfterWriteQueue]. Это буфер пост обработки. Если же нужно чтобы после выполнения пост обработчика данные удалились из таблицы [_DataHistoryAfterWriteQueue], тогда можно выполнить ИсторияДанных.ОбновитьИсторию(Истина, Истина). Нужно учесть, что если второй параметр имеет значение Истина, то после выполнения обновления истории и обработки после записи версий истории данных выполняется удаление из обработки после записи версий, дата создания которых меньше текущей на 20 дней.

Передать в постобработку можно также методом:

ВыполнитьОбработкуПослеЗаписиВерсий(<Данные>)

Почистить данные из таблицы [_DataHistoryAfterWriteQueue] можно:

УдалитьИзОбработкиПослеЗаписиВерсий(<ВключитьМетаданные>, <ИсключитьМетаданные>, <Дата>)

4 для таблиц с ExtX1 справедливо все вышеперечисленное.

Схема работы ИД:

 

Выводы

История данных имеет свои плюсы и минусы, давайте кратко вспомним их:

+- Все муссируют, что ИД «весит меньше». Это скорее миф. На самом деле если у вас данные и структура метаданных не меняются с регулярной постоянностью, тогда ИД будет весить больше.

+ ИД работает из коробки. Это несомненно огромный плюс.

+- Последние значимые изменения по ИД были в платформе 8.3.15, только с этой версии можно полноценно использовать ИД. С другой стороны, все современные конфигурации используют версию платформы выше 8.3.15, а следовательно, только у единиц версия ниже и ИД будет недоступна.

+ ИД может хранить версии не только ссылочных объектов, может хранить версии по регистрам сведений.

+ ИД может настраиваться, не заходя в конфигуратор.

+ ИД может хранить версии удаленных объектов.

+ ИД более гибкая и позволяет восстанавливать версии по тем объектам, чья структура менялась.

- ИД содержит недоработки, которые я показал в ходе экспериментов.

 

Лично я не вижу смысла продолжать использовать механизм ВО из БСП, для меня выбор в пользу ИД очевиден, но это сугубо мое мнение. Если вы знаете причины, по которым ИД хуже ВО, прошу, напишите в комментариях.

На этом статью заканчиваю. Желаю всем интересных проектов, надеюсь, статья была вам полезна.

 

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

Обработка для программной настройки состава "Истории данных"

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

Переход с версионирования объектов БСП на историю данных платформы

История данных. Изменения в платформе 8.3.24

Планы обмена VS История данных

 

Версионирование объектов VS История данных БСП Платформа версия Баг Киллер-фича расширение 8.3.11.2867 8.3.15 SQL Фича Настройки Метаданные Очередь отборы удаление версии

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

23.06.2024    7954    bayselonarrend    20    

156

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

13.03.2024    6242    dsdred    18    

80

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

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

24.01.2024    18870    YA_418728146    26    

72

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    24068    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    15121    YA_418728146    7    

169
Отзывы
35. DIvanmgn 27.04.23 07:50 Сейчас в теме
Обнаружил еще одну плюшку. Если в конфиуграторе для объекта пометить, что история используется, а в пользовательском режиме отключить, то можно создавать версии по отдельным экземплярам объекта.

ИсторияДанных.ЗаписатьВерсию()
METAL; sstas007; fedor40; корум; zhichkin; dsdred; +6 Ответить
47. zhichkin 1524 04.08.23 16:35 Сейчас в теме
(21) Добрый день! Каюсь, прошёл как-то механизм ИД мимо меня =) Больше 15 лет в 1С и вот такое вот недоразумение =) Спасибо огромное Вам за статью. Статья шикарная. Лично мне не хватило трассировок СУБД - что и как делает 1С на уровне SQL. Ну это ладно, сам посмотрю.

Вопрос про "ПослеЗаписи": означает ли это, что запись в таблицу _DataHistoryQueue0 выполняется вне транзакции записи основного объекта, история которого регистрируется в данный момент ? Прошу прощения, я конечно же сам могу посмотреть это на уровне СУБД, но вдруг Вы сразу знаете ответ ?
user659424_aivanov1968; IronDain; EvgeniyOlxovskiy; fedor40; dsdred; +5 Ответить
41. dsdred 3639 27.07.23 13:21 Сейчас в теме
(39) Если у вас 8.3.21 и выше попробуйте таблицы по ИС вынести на отдельный скоростной диск.

Вообще я в 1С написал пожелание чтобы сделали отдельную базу для хранения версий.
Присоединяйтесь, напишите им тоже.
Чем больше запросов тем больше вероятность их реализации.
METAL; t278; +2 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1563 06.03.23 09:57 Сейчас в теме
Отличное исследование, спасибо!
maximus_2712; t278; Student1C; корум; zhichkin; dimisa; Рамзес; Дмитрий31178; dsdred; +9 Ответить
2. dsdred 3639 06.03.23 10:03 Сейчас в теме
(1)Надеюсь людям будет интересно и полезно.
zhichkin; +1 Ответить
3. CheBurator 2712 06.03.23 16:42 Сейчас в теме
Основательно!
Mizrael; dsdred; +2 Ответить
4. Air777 06.03.23 17:26 Сейчас в теме
в 8.3.14 ИД точно безбожно глючила на каждом шагу.
Потыкал, потыкал и выкинул в ведро. Надеюсь починили.
Но дальнейшего развития функционала особо нет. Например выгрузить во внешнюю БД, как с этим? Опять руками. Спасибо я тогда все руками сделаю сразу.

Как обычно тут за нас подумали, а там где не подумали проще выкинуть чем допилить.
Да хорошо когда есть выбор. Лично для меня выбор тоже очевиден. Пожалуй еще через 10 лет посмотрю ИД, может и буду пользовать...
А пока спасибо автору за проделанную работу.
Было интересно
5. dsdred 3639 06.03.23 17:42 Сейчас в теме
(4)Спасибо за комментарий.
С 21 помоему версии можно таблицы субд перенести на другой диск, поэтому впринципе переносить в отдельную базу необязательно.

А так впринципе переносить надо лишь одну таблицу с разносными версиями, ну и по хорошему с метаданными надо что-то делать. Чистить от тех по которым нет версий например.
n_mezentsev; +1 Ответить
11. Andronav 07.03.23 07:45 Сейчас в теме
(5) Вот как раз хочется чтобы версии объектов хранились во внешней базе полностью а не на уровне таблицы. Пока сами допиливаем и переносим версии в другую базу. Для ИД думаю это будет сделать сложнее. Может у кого есть такой опыт? Но давно хочется чтобы 1С предусмотрела функционал хранения вспомогательных данных (версии, файлов и т.п...) в отдельных БД.
6. pyrkin_vanya 493 06.03.23 20:30 Сейчас в теме
Однозначно плюс за статью.

Лично я уже года два использую ИД в своей самописеой базе. Ниразу не словил ниодного глюка. По мне отличный механизм.
arz; pkotov; Tworozhok; dsdred; +4 Ответить
9. starik-2005 3090 07.03.23 06:42 Сейчас в теме
(6)
Ниразу не словил ниодного глюка.
Даже в браузере эти слова подчеркиваются красной линией, ибо пишутся раздельно. Какая-то беда в последнее время у всех с этим "раздельнописанием", даже у аффтора статьи.

(0) Но все равно плюс.
pkotov; 3dice; sstas007; RibD; Дмитрий31178; +5 Ответить
10. dsdred 3639 07.03.23 06:50 Сейчас в теме
(9)
Какая-то беда в последнее время у всех с этим "раздельнописанием", даже у аффтора статьи.


что есть то ест...
Но я ниспециально не специально.
12. pyrkin_vanya 493 07.03.23 10:12 Сейчас в теме
(9) Я тоже не специально.))) После укладки детеныша человеческого и криков слабо голова соображает. Но за статью еще раз плюс
dsdred; Khamatnurov; +2 Ответить
13. starik-2005 3090 07.03.23 10:18 Сейчас в теме
(12) Я просто тут готовлюсь к ЕГАМ, поэтому лезу каждый раз проверять, что правильно ли я думаю, что это пишется не так. Это нервирует )))
Khamatnurov; pyrkin_vanya; +2 Ответить
51. 3dice 26 23.02.24 10:55 Сейчас в теме
(9)"не" и "ни" еще так часто путают. беда.
7. genayo 06.03.23 22:10 Сейчас в теме
Отсутствие работы с ИД в БСП удивляет, если честно. Механизм не достаточно обкатан в результате, например есть плавающий глюк с выполнением обработки после записи версии непосредственно, при массовой записи объектов.
8. dsdred 3639 07.03.23 05:22 Сейчас в теме
(7)1 отсутствие в бсп работы с ИД связано с тем, что механизм платформенный и обещают добавить в саму платформу обработку функционал которой я реализовал месяц назад и упоминал в статье.
2 опишите пожалуйста глюк подробнее я думаю читателям и мне будет интересно и полезно о нем знать.
14. user628741_news_novel 07.03.23 15:32 Сейчас в теме
Платформа 8.3.21.1622 режим совместимости 8.3.12. Конфигурация ERP. Есть несколько расширений.

При программной установке ИД и если потом перезапустить сеанс, то сразу или через некоторое время ИД слетает (не применяется) и соответственно пропадет команда "История данных" у объекта.


Т.е. если выполнить
ИсторияДанных.ПолучитьНастройки(ОбъектМД)
, то возвращается
Неопределено


При этом в таблицах DataHistorySettings и DataHistoryMetadata записи по объекту которому установили ИД есть.
Кто-нибудь сталкивался с таким поведением платформы? Куда копать?
15. dsdred 3639 07.03.23 15:45 Сейчас в теме
(14)я попробую воспроизвемти
22. user628741_news_novel 09.03.23 09:47 Сейчас в теме
(15) удалось воспроизвести?
Есть какие-то идеи?
23. dsdred 3639 09.03.23 10:09 Сейчас в теме
(22) ещё не пробовал. Из идей поменять режим совместимости на 8.3.15 и попробовать.
26. user628741_news_novel 09.03.23 18:39 Сейчас в теме
(23) поставил режим совместимости 8.3.15 не помогло.
Вообще странно.
Если настройки хранятся в таблицах DataHistorySettings и DataHistoryMetadata и значение записей для объекта и не меняется.
Но из режима предприятия пропадает команда "История данных" и записи не пишутся в таблицу _DataHistoryQueue0
Видимо эти настройки хранятся где-то ещё.
16. user925427 126 08.03.23 01:15 Сейчас в теме
Качественная статья, заполняющая очередной пробел в документации 1С. Автору плюс. Но сам параллельный механизм становится недоброй традицией 1С. Асинхронность дублирует оповещения, история данных версионирование. Что следующее?
JohnConnor; dsdred; +2 Ответить
17. BabySG 08.03.23 11:19 Сейчас в теме
Ключевая причина отсутствия поддержки ИД в БСП - это разница работы в РИБе.
А так - на крупных проектах размер ИД выходит меньше на круг, чем ВО. От 20%, когда у тебя сотни тысяч объектов в день.
18. 13D 69 08.03.23 22:29 Сейчас в теме
«В БСП есть подсистема «Версионирование объектов» и в платформе есть механизм «История данных». В чем отличия?»

теперь и я знаю в чём отличие))))
спасибо! крайне позновательно
19. dsdred 3639 08.03.23 23:09 Сейчас в теме
(18)Рад, что статья пригодилась.
20. setrak 154 09.03.23 00:20 Сейчас в теме
Очень интересно расписано. Сейчас как раз у себя осуществляю переход с версий на историю. По плюсам ИД все понятно, но единственно, пока не смог найти ответ, в какой момент происходит запись истории? с ВО все понятно, подписка на событие перед записью, а вот история когда пишется? Это чтобы мне понимать, будет ли влиять на скорость проведения документа ведение истории (при большом объеме истории) или нет? Исходя из того, что историю никогда не резать.
21. dsdred 3639 09.03.23 08:26 Сейчас в теме
(20)провел эксперемент
Перед записью и при записи версии ещё небыло.
В После записи запись попала в таблицу DataHistoryQueue0.
zhichkin; setrak; +2 Ответить
47. zhichkin 1524 04.08.23 16:35 Сейчас в теме
(21) Добрый день! Каюсь, прошёл как-то механизм ИД мимо меня =) Больше 15 лет в 1С и вот такое вот недоразумение =) Спасибо огромное Вам за статью. Статья шикарная. Лично мне не хватило трассировок СУБД - что и как делает 1С на уровне SQL. Ну это ладно, сам посмотрю.

Вопрос про "ПослеЗаписи": означает ли это, что запись в таблицу _DataHistoryQueue0 выполняется вне транзакции записи основного объекта, история которого регистрируется в данный момент ? Прошу прощения, я конечно же сам могу посмотреть это на уровне СУБД, но вдруг Вы сразу знаете ответ ?
user659424_aivanov1968; IronDain; EvgeniyOlxovskiy; fedor40; dsdred; +5 Ответить
24. monwig 09.03.23 10:53 Сейчас в теме
Полезная статья, наконец-то в одном месте собрана вся информация по таблицам и работе механизма, но есть что добавить)

Кто-нибудь работал с платформенной историей на больших объемах данных? В Highload-е? Мы попробовали - нам не понравилось.

Почему-то ни на its, ни в статьях нет упоминаний о том, как именно происходит обновление истории. Да, везде написано, что при стандартных настройках, когда у тебя включено ведение истории и не стоит галочка Обновлять историю данных сразу после записи, необходимо выполнять метод ИсторияДанных.ОбновитьИсторию() чтобы данные из очереди (_DataHistoryQueue) перетекли уже в таблицы версий и мы смогли историю увидеть, только скорость работы этого метода оставляет желать лучшего. На наших не самых больших объемах задание запускаемое раз в 5 минут просто не успевает обрабатывать все данные в очереди и очередь пухнет безумными темпами. За 1.5 суток +70GB записей в таблице очередей.

Если включить галочку Обновлять историю данных сразу после записи, тогда начинаются интересности. В таком случае запись все равно сначала будет положена в таблицу _DataHistoryQueue0, но сразу после этого, на сделанную запись, платформой будет запущено фоновое задание от имени пользователя, который сделал изменение версии (удобно, да?) и это не вызывает проблем, пока вы не доходите до регламентных заданий, где в рамках одного задания происходит изменение более чем 1 записи и все это работает в многопоточном режиме.
На нашей базе работает интеграция, 1 регламент запускается в 20 потоков, в каждом регламенте обрабатываются входящие сообщения, могут записаться новые справочники, записи в несколько регистров сведений. На базе история включена по 10 справочникам и 1 регистру. При работе всех 20 потоков, в пике поймали ~10.000 фоновых заданий на обновление истории, база после такого умирает, через пару минут фоновики отрабатывают, база отвисает и так по кругу с каждым запуском задания.
Причем задания на обновление данных будут продолжаться запускаться на каждую запись в таблице очереди, даже после удаления записей из таблицы, в таком случае помогает только перезапуск рабочих процессов. И это на базе не включена история по типовым объектам, пользовательская работа не генерирует изменений для истории, все объемы от одного регламента.

В итоге имеем ситуацию, что пользоваться методом ИсторияДанных.ОбновитьИсторию() мы не можем, т.к. с любым временем запуска наше количество изменений не успевает обрабатываться, а обновлять историю сразу так же не можем, т.к. это приводит к неадекватному количеству фоновых заданий для обновления истории. И это одна из самых менее нагруженных наших баз. Из того что я вижу, данный механизм просто не жизнеспособен при больших объемах и многопоточной работе в базе. Если у кого-то есть успешный опыт - поделитесь подробностями)
vvp117; toypaul; t278; 1CUnlimited; Merkalov; sstas007; Student1C; zhichkin; tulakin_s; JohnConnor; Dach; detro; sulfur17; triviumfan; worker1c; dsdred; +16 Ответить
25. dsdred 3639 09.03.23 11:13 Сейчас в теме
(24)спасибо за подробно описанный кейс
27. user628741_news_novel 10.03.23 15:05 Сейчас в теме
(24) А версионирование объектов из БСП лучше себя показала на больших объемах? В Highload-е?

Лично я, встречал когда в регистре версий объектов уже больше 1000000 записей, то запись объекта (например, документ ЗаказКлиента) по которому включено версионирование происходило дольше.
sstas007; dsdred; +2 Ответить
28. dsdred 3639 10.03.23 15:53 Сейчас в теме
(27)нет, она лучше не может себя показать. Я пользовался ей на базе Розница с 500 магазинами и периодически случались ошибки при записи документов.
29. monwig 10.03.23 23:58 Сейчас в теме
(27) на одной из баз, регистр версий весит больше 2ТБ, в нем больше 600млн строк и проблем его обслуживанием, добавлением\удалением записей или просмотром никаких не возникает.
t278; triviumfan; +2 Ответить
30. itmind 308 14.03.23 02:12 Сейчас в теме
(29) Проблема будет с очень долгой реструктуризацией таблицы. Например после обновления, в котором удалено много метаданных из конфигурации. (обновления ЕРП для примера)
t278; n_mezentsev; dsdred; +3 Ответить
31. monwig 14.03.23 14:28 Сейчас в теме
(30) сама по себе долгая реструктуризация не является проблемой.

Если вы можете взять тех. окно на сутки (или более длительное время), то можете спокойно провести реструктуризацию. Так же вы можете использовать "новый" режим реструктуризации, который значительно быстрее стандартного режима. Если нельзя взять длительное тех. окно и время реструктуризации все еще выходит за требуемое время, тогда у вас еще есть несколько вариантов:
- Сделать реструктуризацию на СУБД
- Если таблица не является необходимой для работы сразу после обновления, вы можете очистить данную таблицу и после обновления перенести в нее данные.
- Использовать фоновое обновление конфигурации. Да, вам придется отказаться от внесения изменений в метаданные в расширениях, но позволит прийти к тому, чтобы любая реструктуризации проходила в фоне, а база блокировалась только для принятия изменений.
- Вы можете просто не вносить изменения, которые приводят к реструктуризации той или иной таблицы

У нас нет проблем с реструктуризацией)
sstas007; dsdred; +2 Ответить
32. Tavalik 3412 21.03.23 09:13 Сейчас в теме
Спасибо. Интересная и подробная статья. Больше бы таких!

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

Неоднократно внедрял у клиентов именно такой способ хранения истории (готовых решений на инфостарте несколько).
METAL; zhichkin; dsdred; +3 Ответить
33. dsdred 3639 22.03.23 11:39 Сейчас в теме
(32)Спасибо за отзыв.

Интересная и подробная статья. Больше бы таких!

Эх... Если бы Фирма 1С сама писала подобную документацию, тогда у людей было бы больше времени заниматься другими вещами и статьи были бы интереснее ))

Виталий, расскажи подробнее или дай ссылки на статьи, с теми вариантами которые ты внедрял.
У меня ощущение, что большинство идет по принципу версионирования от БСП.

Вообще можно подумать и насчет ИС с перебросом в стороннюю базу. По большому счету таблицы ИС можно с помощью SQL подружить с внешней базой.
34. Tavalik 3412 22.03.23 12:21 Сейчас в теме
(33)
2 раза встраивал сам, а также знаю про внедрения коллег вот этой подсистемы: https://softonit.ru/catalog/products/journal/

Давно правда это было, но тогда это решение устраивало и нас (1-2-3 линия поддержки, сами пользовались) и клиента.
35. DIvanmgn 27.04.23 07:50 Сейчас в теме
Обнаружил еще одну плюшку. Если в конфиуграторе для объекта пометить, что история используется, а в пользовательском режиме отключить, то можно создавать версии по отдельным экземплярам объекта.

ИсторияДанных.ЗаписатьВерсию()
METAL; sstas007; fedor40; корум; zhichkin; dsdred; +6 Ответить
36. dsdred 3639 27.04.23 08:34 Сейчас в теме
(35)нормальный лайф хак. дополню статью.
37. dsdred 3639 11.05.23 11:43 Сейчас в теме
(35)Еще раз спасибо. Статью дополнил и обновил.
38. truba 13.06.23 09:42 Сейчас в теме
Господа, вопросы:
1) - не очищается Таблица _DataHistoryLatestVerison после программного отключения всех настроек сохранения истории и очищения самой истории.
2) - _DataHistorySettings если вручную грохнуть строки, какие ожидать последствия?
3) - Слетают настройки из _DataHistorySettings. Не всегда, бекапов нет, ничего такого нет, одиночно стоящая база, но настройки слетают, вернее они не применяются даже.
40. dsdred 3639 27.07.23 13:17 Сейчас в теме
(38)Извиняюсь за долгий ответ. только сегодня увидел комментарий.
1 _DataHistoryLatestVerison не чистится после программного отключения. Настройки программного отключения и включения хранятся в _DataHistorySettings

вы удаляли через команду ниже?
ИсторияДанных.УдалитьВерсии(Данные, НомерВерсииНачала, НомерВерсииКонца);


2 Слетит программное включение/выключение Истории данных. Грубо говоря вернетесь к первоначальным настройкам из конфигурации.

Это можно сделать командой
	// Удаление ранее сделанных настроек
	ИсторияДанных.УстановитьНастройки(ОбъектМетаданных, Неопределено); 

правда придётся по метаданным бежать и проще реально через запрос в СУБД

3 Вот тут надо смотреть по месту. Тут скорее всего человеческий фактор. Настройки хранятся железно, но если поднять бекап до их установки то и настроек не будет или чистит кто таблицу. В общем на вскидку не скажу.
42. truba 27.07.23 14:37 Сейчас в теме
(40)
вы удаляли через команду ниже?
ИсторияДанных.УдалитьВерсии
- прошу прощения так же за давностью не вспомню - но как помнится да. Смутило что в решении присутствует определенная утечка дисковой памяти. Это не единственное место утечки памяти, насколько я помню.

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

тут такой момент, который в мануалах не подсвечен - настройки вступают в силу при перестарте сеанса. Т.е. текущие установки в этом сеансе не подхватываются.
Сказать точнее: всегда не используются или периодически не используется в общем случае не могу.
43. dsdred 3639 27.07.23 14:39 Сейчас в теме
(42)
тут такой момент, который в мануалах не подсвечен - настройки вступают в силу при перестарте сеанса.

хм, странно...
У меня в 21 и 22 платформе все работало на лету.
44. truba 27.07.23 14:45 Сейчас в теме
(43) 20й релиз, когда начинал тестирование тоже все работало на лету (как мне казалось), но после стабильно работало только после перестарта сеанса. Обычные формы. Для себя решил что таблица настроек истории загружается при старте сеанса и однозначно кэшируется.
45. dsdred 3639 27.07.23 14:50 Сейчас в теме
(44)Реально странно.
Настройки пишутся в скуль, а механизм работает на уровне самой платформы. Поэтому перезапуск влиять не должен.

Я когда статью писал, все в одном сеансе делал и принскрины вставлял. При этом тут же в скуле смотрел что меняется.
46. truba 27.07.23 14:59 Сейчас в теме
(45) Допустим что пишутся в скуль сразу. Но пишутся ли они так же в кэш сервера предприятия в 20м релизе - не факт. И реализована ли верификация настроек в кэше и на сервере в 20м же релизе - тоже не факт. Видос записывать не буду, Вам придется поверить на слово).
Выглядит так - установка настроек (делал обработкой из статьи), сохранение настроек, попытка сохранения объекта - никаких изменений в очереди. Перестарт сеанса - сохранение объекта - появляются строки в таблице Queue.
39. StasN 15.06.23 06:42 Сейчас в теме
Из опыта использования ИД замечена одна проблема - почему то удаление версии по объекту длится неприлично долго, может несколько минут удалять одну единственную версию одного объекта, очистку не нужных версий никак не можем сделать, чтобы уменьшить таблицы, в самих таблицах в sql версии занимают уже десятки ГБ, видимо как то связано с большими объемами что удаление работает так долго
Но а в целом, по моему мнению и применительно к нашей базе (не типовая), ИД лучше чем ВО, когда у нас была ВО, часто попадали на длительную реструктуризацию, что у нас не приемлемо, объекты конфигурации меняются достаточно часто приводящие к реструктуризации
41. dsdred 3639 27.07.23 13:21 Сейчас в теме
(39) Если у вас 8.3.21 и выше попробуйте таблицы по ИС вынести на отдельный скоростной диск.

Вообще я в 1С написал пожелание чтобы сделали отдельную базу для хранения версий.
Присоединяйтесь, напишите им тоже.
Чем больше запросов тем больше вероятность их реализации.
METAL; t278; +2 Ответить
55. METAL 299 26.04.24 17:14 Сейчас в теме
(41) Если версия платформы 8.3.21 и выше - как вынести историю на отдельный диск? Не уверен что правильно понял идею, можете прокомментировать?
48. dsdred 3639 04.08.23 16:42 Сейчас в теме
(47) добрый вечер. Рад что статья пригодилась.

По поводу вопросов, честно скажу не проверял. Если проверите, напишите пожалуйста результаты. Думаю это будет полезно всем.
49. savant 57 20.02.24 08:20 Сейчас в теме
Добрый день!
После включения ИД. Создаётся версия 1 с изменениями.
Как получить программно версию до этих изменений?
Платформа как-то же сравнивает их.
50. dsdred 3639 20.02.24 08:47 Сейчас в теме
(49) первая версия содержит структуру объекта на момент создания версии. Изменения до не получить.
52. KAV2 157 05.03.24 17:35 Сейчас в теме
А как решаете проблему того, что каждый раз в истории данных создается новая запись, даже если объект не менялся (например, пользователь просто нажал на кнопку "ОК", ничего не меняя)?
53. dsdred 3639 05.03.24 17:38 Сейчас в теме
(52) эта проблема только у Планов обмена с подписками и БСПшной подсистемы версионирования на регистрах сведений. У истории данных на уровне платформы проверяется отличается текущее состояния объекта от того, что было до записи и если не меняется то и версия незаписывается.

Тут смысл, что пишется разностная версия, а не новая.
54. KAV2 157 05.03.24 17:59 Сейчас в теме
(53) спасибо за ответ, похоже что это поведение зависит от версии платформы, на 8.3.13 создается запись в истории в любом случае, а уже на 8.3.24 не создается, если не было изменений.
56. dsdred 3639 26.04.24 20:41 Сейчас в теме
57. artkor 286 29.05.24 10:44 Сейчас в теме
Спасибо за статью! Вы не в курсе можно ли из бинарника "_DataHistoryQueue0._Content" как-то дату записи версии вытащить? А то в продуктиве "помойка" из версий образовалась на несколько миллионов - вероятно 80% не нужно.
58. dsdred 3639 29.05.24 11:22 Сейчас в теме
(57)Добрый день. Сам я потратил пару часов и не смог расшифровать.
Знаю, что Дмитрий Жичкин вот в этой статье https://infostart.ru/1c/articles/1916860/ расписал как это сделать.
59. artkor 286 29.05.24 11:43 Сейчас в теме
(58) тоже 3 часов потратил не смог :) и статью эту читал
60. dsdred 3639 29.05.24 12:14 Сейчас в теме
(59) Видимо после той статьи надо еще n часов потратить на поиски информации, но покрайней мере там даны слова для поиска ))
61. Doronichi 21.08.24 22:48 Сейчас в теме
Добрый день!

Может кто-нибудь подскажет, почему в подсистеме версионирования из БСП регламентное задание по очистке устаревших версий очищает лишь данные версии, а саму строку в регистре "ВерсииОбъектов" оставляет?
62. dsdred 3639 22.08.24 05:34 Сейчас в теме
(61) Доброе утро.
Этот вопрос лучше задать в фирму 1с. Может быть хотели оставить сам факт изменения для истории.

Это ещё одно отличие с Историей данных. У Истории данных, удаление старых версий идёт полное, но фирма 1с до сих пор не нарисовала подсистему для работы с Историей данных.
П.С. В выходные выложу подсистему в которой можно будет автоматически чистить версии в Истории данных.
63. user1621540 16.09.24 19:29 Сейчас в теме
(62)

Здравствуйте!

Спасибо за статью и обработку.

1) Есть стандартная обработка "Изменение истории данных" (через режим специалиста). Вы о ней знаете и свою написали с расширенным функционалом специально или платформенная недавно появилась или и то и то?

2) Чистка истории штука полезная в обновленной обработке, но при тестах появились странные глюки. Причем дело не в вашей обработке даже, а, похоже, в целом в чистке версий. Т.к. сначала я грешил на ряд своих манипуляций (с вашей обработкой, со стандартной, с включением-отключением программным и т. д.) Но дальше воспроизвел проблему на "коробочном" варианте.

Платформа 8.3.24.1667, совместимость 8.3.21

Делаю "из коробки" тестовый пример - новый справочник, в нем один реквизит, одна ТЧ (с одним реквизитом ТЧ). Ставлю использование истории и обе галки по истории, чтобы вообще ничего программно не делать. В пользовательском режиме ничего не меняю. Добавляю новый элемент справочника, заполняю реквизиты, заполняю ТЧ одной строкой - пару раз изменяю - все хорошо, история работает, отчеты строятся, версии сравниваются, переходы на версии делаются. Удаляю кодом (ИсторияДанных.УдалитьВерсии(Метаданные, Дата)). По итогу версии удалены, новые версии сохраняются (начиная со следующего, после удаленной номера), вроде бы все хорошо. Но сравнение новых версий выдает ошибки. Если не изменялась ТЧ, то ошибка "Данные истории не найдены". Если ТЧ изменялась, то "Не найдена строка табличной части". Переход на версию тоже не работает. Если пытаться кодом различия посмотреть - тоже ошибка.

В общем, либо в моей платформе проблема, либо в целом с чисткйо истории проблема. Пока еще не смотрел так детально, как в статье, что там в СУБД происходит, буду посвободнее - гляну.
64. dsdred 3639 16.09.24 19:58 Сейчас в теме
(63) Добрый вечер, рад что обработка пригодилась.
1)
Есть стандартная обработка "Изменение истории данных" (через режим специалиста). Вы о ней знаете и свою написали с расширенным функционалом специально или платформенная недавно появилась или и то и то?


Про стандартную обработку знаю. Я свою нарисовал на несколько месяцев раньше, а затем сравнил со стандартной.
Вот две статьи сравнения:
История данных. Изменения в платформе 8.3.26
История данных. Изменения в платформе 8.3.24

Так же я написал подсистему по автоматическому удалению версий похожую на БСП.
https://infostart.ru/1c/articles/2175170/

2) Интересная ошибка. Попробую воспроизвести. В суппорт 1С писали?
user1621540; +1 Ответить
65. user1621540 16.09.24 20:30 Сейчас в теме
(64)

Пока не писал, думал сначала в СУБД глянуть, партнерс пошерстить, может кто ответ уже есть, а потом писать.

Но не понадобилось, недолгие поиски привели на пост человека (сторонний ресурс), где он описывает такую же проблему. Он пишет, что проблема именно в параметре "Дата" в варианте (Метаданные, Дата) метода удаления версий (мол, это как-то приводит к проблеме). Без второго параметра версии чистятся и начинаются с первой опять и снова все работает. Я попробовал - глюки исчезли (но и версии удалились все, а не до даты).

Получатся, по результатам проверок дальнейших:

УдалитьВерсии(Метаданные) - нормально работает
УдалитьВерсии(Данные, ВерсияОт, ВерсияДо) - нормально работает
УдалитьВерсии(Данные, ВерсияОт) - нормально работает

Я было подумал, что надо сохранять первую версию при частичном удалении - версию создания объекта, но нет,
УдалитьВерсии(Данные, 1, 1) - при существующих более старших - работает.

А вот УдалитьВерсии(Метаданные, ДатаПорог) - приводит к проблемам (дату задавал, как текущую дату, может если задать дату меньше последней версии - не будет глючить, но я на рабочей станции работодателя проверял, время по серверу определяется, не подменить его прям сейчас, так что пока тест тот пройти не могу).

Человек о своей проблеме писал в начале 2022 года, так что либо историей никто не пользуется особо, либо пользуются, пишут в суппорт, а исправлений нет.
66. dsdred 3639 16.09.24 20:36 Сейчас в теме
(65)
Человек о своей проблеме писал в начале 2022 года, так что либо историей никто не пользуется особо, либо пользуются, пишут в суппорт, а исправлений нет.

Чаще всего в саппорт не пишут. Я стараюсь писать, в моих интересах чтобы механизм работал нормально.
67. user1621540 17.09.24 14:28 Сейчас в теме
(66)

Написал в 1с, по результатам отпишусь.
68. dsdred 3639 17.09.24 23:14 Сейчас в теме
(67) отлично. Когда присвоят номер с ссылкой ошибки, можно сюда его написать, чтобы люди могли за статусом следить.
69. user1621540 18.09.24 17:45 Сейчас в теме
(68)

1с пока не ответил, но у меня появилась информация, что это исправлено в 8.3.24.1691 70082754 Сам не проверял, но по полученной информации в 1691 ошибки уже нет.
70. succub1_5 91 22.10.24 11:56 Сейчас в теме
Добрый день, ошибка появилась (платформа 8.3.25.1394), БП 3.0.161.19 (немного доработанная).
У типовых объектов - все ок, у добавленного после обновления/перехода на новую платформу - ошибка при сравнении или открытии:
Ошибка при вызове метода контекста (ПолучитьРазличияВерсий)
{mngbase/DataHistoryVersionDifferencesRuForm.lf(49)}:Различия = ИсторияДанных.ПолучитьРазличияВерсий(Параметры.Данные, Параметры.НомерВерсииПослеИзменения, Параметры.НомерВерсииДоИзменения);
{ВнешняяОбработка.StandardDataChangeHistory.Форма.Form.Форма(989)}:OpenForm(GetFormNameByData(curData, "DataHistoryVersionDifferencesForm"), FormParams);

[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Не найдена строка табличной части

В таблицу версии выводит.
71. dsdred 3639 22.10.24 12:33 Сейчас в теме
(70) Добрый день. В 1с написали по этой ошибке?