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

Программирование - Практика программирования

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

27
Описание нового механизма хранения данных в составе платформы на примере каркасной конфигурации. Прилагается выгрузка базы данных обработками и примерами кода.

За свою практику работы 1C программистом я видел два варианта хранения истории изменения данных: в основной базе регистр сведений с полем типа  хранилище значений, заполняется по подписке на событие записи и в отдельной базе, доступ к которой происходит по OLE. Стандартное решение - БСП, подсистема "Версионирование объектов". Возможность хранения истории данных очень полезна, когда нужно найти причину ошибки в данных или просто найти крайнего ответственного.  И вот наконец такую возможность включили в платформу, по информации сайта Заметки из Зазеркалья.

Конечно, платформа версии 8.3.11 еще пока находится в тестировании, в типовых конфигурациях это решение появится еще не скоро, но любопытство побеждает.

Посмотрим, что за механизм такой. Устанавливаем на компьютер платформу версии 8.3.11.2831 Для тестирования подойдет каркасная конфигурация с сайта подготовки к экзаменам http://1c.ru/spec/questions.htm. Берем ведерко с попкорном, устраиваемся удобнее. Режим совместимости конфигурации - не использовать. Забегая вперед, заметим, что при сохранении базы обратно в режиме совместимости 8.3.10 выйдет сообщение: "Из базы будут удалены версии данных".

В синтакс-помощнике появился менеджер истории данных, видно его методы.

История данных поддерживается для объектов: общие реквизиты, справочники, документы, бизнес-процессы, задачи, регистры сведений. В свойствах полей появилась настройка "История данных" (внизу рисунка).

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

Причем, настройки конфигуратора используются как значения "по умолчанию". Настройки в режиме предприятия могут отличаться от настроек в конфигураторе. Регистрация изменений учитывает приоритет настроек предприятия.

Откроем обработку "НастройкаХраненияДанных", которая позволяет изменять настройки в режиме предприятие и находить отличия.

  • Кнопка "Заполнить метаданные" выводит дерево метаданных по конфигурации. Пока настройки предприятия не заданы, колонка "История данных" показывает настройки из конфигуратора. Содержимое колонки можно изменять.
  • Кнопка "Установить настройки" применяет одноименный метод к каждому объекту метаданных из дерева.
  • Кнопка "Обновить историю" записывает изменения данных из временного хранения на постоянное. В документации рекомендуют метод ИсторияДанных.ОбновитьИсторию() вызывать раз в сутки, регламентным заданием, желательно НЕ в транзакции.

После установки свойства "История данных" документа "Приходная накладная" изменения начинаются фиксироваться. Создаем документ "Приходная накладная" № 3, сохраняем, затем изменяем реквизит Сумма по документу: вместо 3 пишем 0, сохраняем.

Переходим в обработку "Восстановить данные", в качестве текущего объекта выбираем документ "Приходная накладная" № 3.

Метод "ВыбратьВерсии" пока не показывает ни одной версии. Нажимаем "Обновить историю" из первой обработки. Теперь метод "ВыбратьВерсии" возвращает нам таблицу значений. Две версии - две строки. Вид изменения имеет два значения по версиям: сначала мы создали документ, потом изменили. В таблице значений несколько колонок скрыты.

Выбираем в таблице нужную строку, нажимаем "Получить данные версии". Метод считывает данные версии в структуру. Для наглядности выведем сообщение об различающихся реквизитах. Что и требовалось доказать.

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

После первых 10 скачиваний - планирую повышение цены.

P.S. В комментариях подсказали, что если для объекта ведется история данных, то в его системном меню есть отчет по истории данных.

И в завершение предлагаю помедитировать над кодом, обслуживающим объекты ИсторияДанных (DataHistory) из файла mngbase_root.res, который входит в состав платформы 8.3.11. Такого кода там много, хватит на всех желающих. Открывал в Notepad++.

&AtServer
Function GetPreviousVersionNumber(VersionNumber)
	Var PreviousVersionNumber;
	
	ExcludeDeleted = New Array();
	ExcludeDeleted.Add(DataChangeType.Create);
	ExcludeDeleted.Add(DataChangeType.Update);
	Result = DataHistory.SelectVersions(
		New Structure(
			""Data, DataChangeType"", 
			Parameters.Data,
			ExcludeDeleted), 
		""VersionNumber"", 
		""VersionNumber Asc"");
	For Each CheckVersionNumber In Result Do
		If CheckVersionNumber[0] = VersionNumber Then
			Return PreviousVersionNumber;
		EndIf;
		PreviousVersionNumber = CheckVersionNumber[0];
	EndDo;
	Return PreviousVersionNumber;
EndFunction

&AtServer
Function GetLastVersionNumber()

	ExcludeDeleted = New Array();
	ExcludeDeleted.Add(DataChangeType.Create);
	ExcludeDeleted.Add(DataChangeType.Update);
	// select 1 version, this is last
	Result = DataHistory.SelectVersions(
		New Structure(
			""Data, DataChangeType"", 
			Parameters.Data,
			ExcludeDeleted), 
		""VersionNumber"", 
		""VersionNumber Desc"",
		1);
			
	For Each CheckVersionNumber In Result Do
		Return CheckVersionNumber[0];
	EndDo;
	Return Undefined;
EndFunction

&AtClient
Procedure VersionsDiff(Command)
	If Items.Versions.CurrentData = Undefined Then
		Return;
	EndIf;
	VersionBeforeChange = Undefined;
	VersionAfterChange = Undefined;
	
	For Each SelectedRow In Items.Versions.SelectedRows Do
		Version = Items.Versions.RowData(SelectedRow);
		If VersionBeforeChange = Undefined Then
			VersionBeforeChange = Version;
		ElsIf VersionBeforeChange.VersionNumber > Version.VersionNumber Then
			VersionBeforeChange = Version;
		EndIf;
		
		If VersionAfterChange = Undefined Then
			VersionAfterChange = Version;
		ElsIf VersionAfterChange.VersionNumber < Version.VersionNumber Then
			VersionAfterChange = Version;
		EndIf;
	EndDo;
	// diff on deleted version not available
	If VersionAfterChange.DataChangeType = 2 Then
		ShowNotAllowedActionsOnDeletedVersion();
		Return;
	EndIf;
	// diff on deleted version not available
	If VersionBeforeChange.DataChangeType = 2 Then
		ShowNotAllowedActionsOnDeletedVersion();
		Return;
	EndIf;
	VersionNumberAfterChange = VersionAfterChange.VersionNumber;
	VersionNumberBeforeChange = VersionBeforeChange.VersionNumber;
	
	If  VersionNumberBeforeChange = VersionNumberAfterChange Then
		ShowMessageBox(,NStr(""en='Select two versions for comparison';SYS='DataHistory.SelectVersionsTwoVersions'"", ""en""));
		Return;
	EndIf;
	
	
	OpenForm(""sysForm:DataHistoryVersionsDiff"", 
		New Structure(
			""Data, VersionNumberAfterChange, VersionNumberBeforeChange"", 
			Parameters.Data, 
			VersionNumberAfterChange,
			VersionNumberBeforeChange));
EndProcedure

 

 

27

Скачать файлы

Наименование Файл Версия Размер
История хранения данных. Теперь в составе платформы.:
.dt 180,34Kb
14.11.17
28
.dt 180,34Kb 28 Скачать

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. o.nikolaev 228 14.11.17 16:45 Сейчас в теме
После первых 10 скачиваний - при наличии позитивных отзывов планирую повышение цены.


Это вот прям, гениальный маркетинговый ход, если честно.
artfa; корум; ZLENKO; Tolpinski; TreeDogNight; baracuda; Dimasik2007; freezetron; gubanoff; jONES1979; +10 Ответить
18. tunesoft 207 22.11.17 18:44 Сейчас в теме
(1) что в файле для скачивания ?
Внутри платформы уже есть визуальные инструменты для просмотра, сравнения и восстановления версий.
21. vasilev2015 726 23.11.17 08:58 Сейчас в теме
(18) файл - архив конфигурации с обработками, написанными специально для этой статьи. С примерами использования новых программных методов языка 1С.
Встроенных инструментов платформы не нашел. Если у Вас есть - подскажите, где.
22. tunesoft 207 23.11.17 10:27 Сейчас в теме
(21) в форме элемента справочника нажать "Ещё - История изменений".
Откроется форма, в которой есть отборы, переход на версию, сравнение и тп
К сожалению стандартный язык запросов 1С не позволяет получать данные по изменениям, можно использовать только специальную функцию для выборки изменений.
Прикрепленные файлы:
Ziggurat; sansys; Tolpinski; +3 Ответить
23. vasilev2015 726 23.11.17 10:58 Сейчас в теме
(22) Увидел, спасибо )). Появляется только для тех объектов, у которых история включена.
2. vasilev2015 726 14.11.17 17:15 Сейчас в теме
Спасибо. Но у меня остается слабая надежда, что программирую я лучше, чем продаю. С другой стороны, старт мани у меня не ассоциируются с деньгами. Только для развлечения.
Fox-trot; +1 Ответить
3. vshish 110 15.11.17 05:19 Сейчас в теме
Да тоже скачивал эту платформу для посмотреть историю.
Но до подробных игр не дошло.
конечно. очень интересо в каком виде хранятся данные, и можно ли выбрать запросом например какие изменения были сделаны определенным пользователем. или кто изменял опе\ределенные реквизиты.
Минус. это надо устанавливать режим совместимости 8.3.11
Для старых конфигураций может быть неприменим.
4. vasilev2015 726 15.11.17 09:06 Сейчас в теме
Здравствуйте !

(3)
можно ли выбрать запросом например какие изменения были сделаны определенным пользователем


Да, можно, только не запросом. В документации описаны возможные отборы перед получением таблицы версий. Их слишком много, я не стал их программировать. Отбор по пользователю есть.
5. Jockered 15.11.17 09:16 Сейчас в теме
"Для табличных частей это свойство не имеет смысла"

Почему? Ведь большинство изменений происходит именно в ТЧ. И данный механизм поддерживает отслеживание изменений в ТЧ.
6. vasilev2015 726 15.11.17 09:22 Сейчас в теме
(5) я подразумевал, что для каждого реквизита табличной части это свойство задается отдельно, а в целом у табличной части нет такого свойства. Добавил фото экрана к статье.
7. script 191 15.11.17 13:41 Сейчас в теме
Интересно как создаются версии? Тупо при каждой записи объекта или происходит сравнение того что изменилось? И записываются только изменения - это было бы логично.
8. maikl007 77 16.11.17 05:11 Сейчас в теме
(7)Данные истории мы храним в отдельных таблицах информационной базы. Для повышения эффективности мы храним только разницу между версиями данных. Если у вас есть «тяжёлый» документ с большим количеством строк в табличной части, а вы меняете только один реквизит в самом документе, то в истории данных сохранится только одно это изменение. То есть у вас не будет храниться множество копий этого объекта, и занимать место на диске
11. Win98 16.11.17 16:55 Сейчас в теме
(8) Прошу прощения, а вы это кто? Таки мы тоже тестируем данный механизм. Получаем множество записей в истории немеющих различий между собой, такое ощущение что при каждом нажатии "Записать" (или вызове Записать()) не зависимо от того были изменения или нет создается запись в "истории данных". Это такая фича?
Прикрепленные файлы:
16. maikl007 77 20.11.17 04:18 Сейчас в теме
(11) Доброе время. Это выдержка из статьи 1с, по поводу данного механизма истории...
12. AnotherSide 16.11.17 21:46 Сейчас в теме
(8) это выдержка с Зазеркалья, т.е. текст от разрабов

(11) подтверждаем, версии создаются при любой перезаписи объекта, даже без изменений.

Шикарная экономия места на диске...
31. VasilVtoroy 16.03.18 16:21 Сейчас в теме
(12) Создается только запись о факте записи версии. Если не было изменений - то никакие больше данные в ней не храняться. Поэтому много места даже много таких версий не съедят
9. pnamik 16.11.17 07:38 Сейчас в теме
"Откроем обработку "НастройкаХраненияДанных", которая позволяет изменять настройки в режиме предприятие и находить отличия."

Где эта обработка? Как открыть эту обработку?
в 8.3.11.2831 и конфигурация Розница 2.2.7 другая картина
http://prntscr.com/hb2qm3
10. vasilev2015 726 16.11.17 08:55 Сейчас в теме
(9) Обработку написал сам, для этой статьи. Находится в приложенном файле. Если нужна помощь - обращайтесь.
19. tunesoft 207 22.11.17 18:47 Сейчас в теме
(9)обработки встроены в платформу 8.3.11
13. poyson 16.11.17 21:54 Сейчас в теме
Надо брать, дайте две :)...
14. Yashazz 2295 17.11.17 16:56 Сейчас в теме
И теперь ещё года три эта хрень будет косячить, терять данные, сбиваться и тд. Нетушки. Лучше уж проверенными способами, если на рабочих-то проектах. Как-то неохота объяснять клиентам, что это "новая фича глючит, все вопросы к 1С".
15. vasilev2015 726 17.11.17 17:58 Сейчас в теме
(14) Здравствуйте, Яков ! Обычно Вы характеризуете мои статьи емким словом "боян". И поэтому мне пришлось написать первую на сайте (а может и вообще) статью про историю хранения данных. Налицо прогресс ))) Спасибо.
17. Yashazz 2295 21.11.17 17:40 Сейчас в теме
(15) Здравствуйте) Понимаете, Николай, я и свои поделки так характеризую в большинстве случаев, и чужие) Хорошо, что сподвиг Вас написать статью. Я вот несколько своих статей недавно посмотрел - хрень полная, для моих коллег сгодится, а на ИС уже было и было лучше, ну и не стал выкладывать мусор, естессно.

Так что натурально рад за Вас. Честно, рад.

Только вот описывать "свежак" от 1С - неблагодарное дело. Я, помнится, накатал статью об особенностях порядка выполнения обработчиков событий в расширениях форм, а они бац, и переделали всё. Так и с этой "историей изменений" стопицот раз ещё всё поменяется.
20. rusinfostart 23.11.17 02:24 Сейчас в теме
обработка "Восстановить данные", это что-то новенькое, попахивает увеличением места, но как идея очень хорошо.
24. Tolpinski 55 23.11.17 11:31 Сейчас в теме
Используем свою наработку для хранения истории, честно скачанную и переделанную. История пишется в табличную часть справочника.
Так пришлось вставить проверку на количество записей, больше 100к не пишет, а такое количество легко достигается в ЗУП, в расчетных документах.
Как тут с таким, изменение порядка строк будет считаться изменением?
25. bad_wag 17 27.12.17 12:01 Сейчас в теме
Выдержка из документации к платформе 8.3.11
Состояние объекта с точки зрения механизма истории данных можно условно разбить на две части:

1. настройки истории данных, сделанные в конфигураторе;

2. настройки истории данных, сделанные в режиме «1С:Предприятия».


Кто нибудь знает где искать эти настройки в режиме Предприятия?
26. vasilev2015 726 27.12.17 16:11 Сейчас в теме
Здравствуйте ! я тоже долго искал. Сначала написал свой интерфейс, потом подсказали меню "ЕЩЕ", смотрите коммент 22.
27. bad_wag 17 28.12.17 15:17 Сейчас в теме
(26) В комментарии 22 написано как посмотреть история изменений, а мне не понятно как ВКЛЮЧИТЬ или выключить эту историю для объектов в режиме предприятия
28. vasilev2015 726 28.12.17 21:18 Сейчас в теме
(27) Здравствуйте ! Включить или выключить историю изменений можно с помощью программного кода. К статье приложена конфигурация с утилитой, которая позволяет это сделать.
29. bad_wag 17 29.12.17 10:11 Сейчас в теме
(28) Да как это сделать с помощью программного кода это понятно и в документации очень подробно все расписано. Но как я писал (25) там так же упоминается возможность включения истории для объектов в режиме предприятия, но ГДЕ и КАК это делается почему-то ни слова не написано...
spenser123; +1 Ответить
30. vasilev2015 726 29.12.17 11:06 Сейчас в теме
(29) Здравствуйте ! Да, действительно. Мне было проще написать утилиту, чем искать. Как говорится: моя не читатель, моя - писатель. ))
Дайте пожалуйста обратную связь, когда разберетесь ))
32. sokir 30.05.18 19:34 Сейчас в теме
А если из 100 строк ТЧ документа удалена первая, то что за различия выдаст этот механизм?
Выдаст типа - изменено 99 строк и в каждой менялась номенклатура с количеством и ценой и суммой и т.д.?
33. VasilVtoroy 15.10.18 13:07 Сейчас в теме
(32) Нет, он покажет удаление одной строки
Оставьте свое сообщение