История данных в 1С

 

В технологической платформе 8.3.11 был введен специальный механизм — «История данных».  Этот механизм видится достаточно полезным, так как предоставляет ту функциональность, которую не редко приходится реализовывать вручную. В этой статье я попробую рассказать о том, что это за механизм, для чего он нужен и как с ним работать.

Общая информация

Начнем с общей теоретической информации о том, что такое история данных и как она устроена.

Описание и возможности

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

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

Само по себе хранение истории достаточно бесполезная функция, поэтому с историей данных можно выполнять следующие операции:

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

На момент написания статьи (8.3.13) история данных поддерживается для следующих объектов:

  • общие реквизиты;
  • константы;
  • справочники;
  • документы;
  • бизнес-процессы;
  • задачи;
  • регистры сведений;
  • планы обмена;
  • планы счетов;
  • планы видов характеристик;
  • планы видов расчетов;
  • расширения конфигурации.

Работа с историей данных регулируется правами доступа и отражается в журнале регистрации.

Устройство механизма

История данных хранится в специальных таблицах информационной базы. Кроме самих данных в этих таблицах хранятся метаданные прежних версий объектов. Версии метаданных создаются в момент изменения этих самых метаданных у объекта и никак не связаны с изменением данных объекта.

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

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

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

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

Свойство "История данных"
Свойство «История данных»

По умолчанию свойство «История данных» установлено в значение «Использовать» у:

  • стандартных реквизитов;
  • реквизитов объектов;
  • реквизитов табличных частей;
  • измерений регистров сведений (без возможности отключения);
  • ресурсов регистров сведений.
 

Использование механизма

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

Управление использованием истории данных

Ниже приведены примеры того, как, средствами встроенного языка, можно управлять использованием истории данных. Отмечу, что значения свойства ИсторияДанных (полученные «через точку») берутся из конфигуратора и могут не соответствовать действительности, для получения актуальной информации нужно пользоваться методом ПолучитьНастройки().

Запись версии

Обычно запись версии выполняется автоматически — в два этапа, как описано выше. Но иногда требуется перенести историю данных в системное хранилище из какого-либо другого хранилища. Для этого используется метод ЗаписатьВерсию() и в этом случае данные записываются сразу в таблицы информационной базы, без необходимости обновлять историю.

Получение списка версий

Легко представить, что при интенсивной работе пользователей в информационной базе может храниться очень значительное количество версий объектов. Следовательно для анализа истории данных скорее всего потребуется гибкий инструмент позволяющий нужные версии. Таким инструментом выступает метод ВыбратьВерсии(). Этот метод позволяет указать критерии отбора (первый параметр — Отбор).

При заполнении этих критериев следует учитывать некоторые особенности:

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

Полную информацию о доступных параметрах отбора можно найти в синтаксис помощнике.

Получим список версий конкретного объекта, в которых изменялся указанный реквизит.

Теперь получим список версий конкретного объекта в которых значение реквизита «Реквизит1» равняется «123» или «321».

Получение данных версии

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

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

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

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

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

Сравнение версий

Одной из основных задач при работе с историей данных является сравнение различных версий объекта и выявление разницы между ними. Делается это при помощи метода ПолучитьРазличияВерсий().

В результате получим структуру описывающую различия между версиями, например такую:

Различия между версиями
Различия между версиями

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

Удаление версий

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

Прочие операции

В числе прочих операций рассмотрим упоминавшееся уже неоднократно обновление истории, а также комментирование версий.

Кроме этого имеется возможность указать комментарий версии непосредственно во время записи объекта. Для этого в модуле объекта или в модуле набора записей регистра сведений реализован метод УстановитьКомментарийВерсииИсторииДанных().

На этом все, надеюсь, что эта статья была Вам полезна.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Оценка статьи:
УжасноПлохоНеплохоХорошоОтлично (оценок: 10, средняя оценка: 4,40 из 5)
Загрузка...

Понравилась статья? Поделиться с друзьями:
Комментарии: 1
  1. Наталья

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

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: