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

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

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

За свою практику работы 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

 

 

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

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

См. также

Комментарии
1. Олег Николаев (o.nikolaev) 205 14.11.17 16:45 Сейчас в теме
После первых 10 скачиваний - при наличии позитивных отзывов планирую повышение цены.


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

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


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

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

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

Шикарная экономия места на диске...
9. nnn nnn (pnamik) 16.11.17 07:38 Сейчас в теме
"Откроем обработку "НастройкаХраненияДанных", которая позволяет изменять настройки в режиме предприятие и находить отличия."

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

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

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

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

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


Кто нибудь знает где искать эти настройки в режиме Предприятия?
26. Николай Васильев (vasilev2015) 386 27.12.17 16:11 Сейчас в теме
Здравствуйте ! я тоже долго искал. Сначала написал свой интерфейс, потом подсказали меню "ЕЩЕ", смотрите коммент 22.
27. qwert asdfg (bad_wag) 28.12.17 15:17 Сейчас в теме
(26) В комментарии 22 написано как посмотреть история изменений, а мне не понятно как ВКЛЮЧИТЬ или выключить эту историю для объектов в режиме предприятия
28. Николай Васильев (vasilev2015) 386 28.12.17 21:18 Сейчас в теме
(27) Здравствуйте ! Включить или выключить историю изменений можно с помощью программного кода. К статье приложена конфигурация с утилитой, которая позволяет это сделать.
29. qwert asdfg (bad_wag) 29.12.17 10:11 Сейчас в теме
(28) Да как это сделать с помощью программного кода это понятно и в документации очень подробно все расписано. Но как я писал (25) там так же упоминается возможность включения истории для объектов в режиме предприятия, но ГДЕ и КАК это делается почему-то ни слова не написано...
30. Николай Васильев (vasilev2015) 386 29.12.17 11:06 Сейчас в теме
(29) Здравствуйте ! Да, действительно. Мне было проще написать утилиту, чем искать. Как говорится: моя не читатель, моя - писатель. ))
Дайте пожалуйста обратную связь, когда разберетесь ))
Оставьте свое сообщение