1с история изменения реквизита справочника

Ключевые слова: Регистрация, история, изменение.

Эта статья является описанием озвученного в Книга знаний: v8: Регистрация событий третьего алгоритма.

Речь о том, чтобы хранить в базе историю изменения реквизитов объектов.

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

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

Общая идею проста, как четыре рубля одной монетой.

А вот при ближайшем рассмотрении выяснилось пара нюансов.

А при превращении мыслей в статью и вовсе все поменялось.

Начнем по-порядку.

Для начала, делаем периодический регистр сведений «История реквизитов» без привязки к регистратору.

Затем, очень хочется иметь в этом регистре сведений измерение «Объект» типа «Любая ссылка», но этого делать нельзя.

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

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

А с другой стороны и без этого реквизита совсем уж никуда, ни отчета сформировать, ни просто даже объект найти.

Поэтому, в каждый объект, для которого требуется регистрация изменений реквизитов, добавляем реквизит «GUID» типа «Строка (32)».

Кроме того, в регистр сведений «История реквизитов» добавляем измерение «GUID объекта» типа «Строка (32)».

Так я хотел написать сначала.

А потом хорошо подумал.

Во-первых, очень плохо делать разные соединения с таблицами объектов в запросах, чтобы получить нужный объект по реквизиту «GUID».

Во-вторых, журнал регистрации фирмой 1С реализован таким образом, что в нем в реквизите «Данные» хранится именно ссылка на объект, а никакой не GUID.

Просто при удалении объектов журнал регистрации не участвует в проверке ссылочной целостности и после удаления объекта в нем в реквизите «Данные» показывается знакомая многим надпись «<Объект не найден> …».

В-третьих, GUID вместо ссылок придется тогда вставлять и в остальных полях, то есть в пользователе, старом значении и новом значении.

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

Тем паче, что типовой алгоритм крайне скуден.

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

Почему пустыми?

Да все просто, чтобы ссылочная целостность базы не нарушалась.

Поэтому добавляем измерение «Объект» типа «Любая ссылка».

Вместо типа «Любая ссылка» можно проставить галочки у конкретных объектов, без разницы.

Продолжаем.

Помимо объекта нужно иметь информацию о реквизите, который меняется.

Поэтому добавляем измерение «Реквизит» типа «Строка (25)» или «Справочник.РеквизитыОбъектов», кому как больше нравится.

Я для примера сделал строкой.

Затем добавляем информацию о пользователе, сделавшем изменения.

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

Кроме того, добавляем ресурс «Имя компьютера» типа «Строка (25)».

Кому 25 символов мало, может изменить на нужное количество.

Для того, чтобы знать, в какой распределенной базе меняли реквизит, в случае использования распределенных баз, нужно добавить ресурс «Распределенная база» типа план обмена «Распределенные базы».

И, наконец, добаляем два ресурса, «СтароеЗначение» и «НовоеЗначение» составного типа.

В составе типов «Число», «Строка», «Булево», «Дата» и «Любая ссылка».

Размерность типов «Число» и «Строка» проставляется максимальная из возможных, чтобы в нее уместилось содержимое любого реквизита.

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

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

Теперь по поводу настроек в объектах.

Во всех объектах, для которых будет регистрироваться история, требуется прописать следующий код.

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

Перем НаборЗаписейИсторияОбъектов;

Процедура ПередЗаписью(Отказ)
    
    НаборЗаписейИсторияОбъектов = РегистрыСведений.ИсторияОбъектов.СоздатьНаборЗаписей();
    
    ОбработатьИзменениеРеквизита(НаборЗаписейИсторияОбъектов, "Код");
    ОбработатьИзменениеРеквизита(НаборЗаписейИсторияОбъектов, "Наименование");
    ОбработатьИзменениеРеквизита(НаборЗаписейИсторияОбъектов, "Родитель");
    ОбработатьИзменениеРеквизита(НаборЗаписейИсторияОбъектов, "Владелец");
    
    Для А = 0 По ЭтотОбъект.Метаданные().Реквизиты.Количество() - 1 Цикл
        ОбработатьИзменениеРеквизита(НаборЗаписейИсторияОбъектов, ЭтотОбъект.Метаданные().Реквизиты[А].Имя);
    КонецЦикла;
    
КонецПроцедуры

Процедура ПриЗаписи(Отказ)
    
    Если НаборЗаписейИсторияОбъектов.Количество() <> 0 Тогда
        
        Для Каждого Запись Из НаборЗаписейИсторияОбъектов Цикл
            Запись.Объект = Ссылка;
        КонецЦикла;
        
        НаборЗаписейИсторияОбъектов.Записать(Ложь);
        
    КонецЕсли;
    
КонецПроцедуры

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

Пример приведен для иерархического подчиненного справочника.

Если брать другой объект, например, документ, то состав служебных реквизитов будет другой, не «Код», «Наименование», «Родитель» и «Владелец», а «Дата» и «Номер».

В следующих статьях будут рассмотрены примеры использования механизма, описанного в данной статье.

Замаялся.

От Гения 1С: Смотрите Книга знаний: v8: Парциальная регистрация изменений в базе данных

26.05.2017

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

Данная статья является анонсом новой функциональности.

Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.


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


Полный список изменений в новой версии приводится в файле v8Update.htm.

Реализовано в версии 8.3.11.2867.

Мы реализовали новый механизм, история данных, который компактно хранит историю изменения прикладных данных пользователями. С помощью готовых интерфейсных решений или с помощью встроенного языка вы можете теперь гибко анализировать изменения данных, сравнивать разные версии и восстанавливать данные в то состояние, которое они имели в выбранной версии.

В каких сценариях нужна работа с историей данных

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

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

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

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

При этом во всех перечисленных сценариях хочется, чтобы эти возможности достигались с минимальными потерями производительности и места на диске.

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

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

Есть и ещё одна особенность, которая связана не с функциональностью, и не с техническими требованиями, а со спецификой рынка 1С:Предприятия. Можно придумать очень хороший механизм, который и работать будет быстро, и функциональность будет иметь большую. Но если для его настройки, включения и обслуживания понадобятся значительные технические знания, это может свести на нет все его преимущества.

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

Какие возможности для анализа истории уже существуют в платформе

Главный инструмент, который вы можете использовать для анализа того, «что происходит в системе», это журнал регистрации. В числе прочего он регистрирует факты изменения данных. То есть можно узнать, кто и когда изменил данные некоторого объекта. Но его возможности в обсуждаемой области на этом и заканчиваются, потому что по журналу регистрации нельзя понять, какой именно реквизит был изменён, какое было его предыдущее состояние. И уж тем более нельзя с помощью журнала регистрации восстановить предыдущее состояние реквизита или всего объекта.

Другой инструмент, который существует довольно давно и есть во всех тиражных решениях, это БСП – библиотека стандартных подсистем. В её составе есть подсистема версионирования объектов. Эта подсистема содержит все перечисленные функции, однако она имеет некоторые практические ограничения.

Во-первых, она является частью библиотеки, поэтому её внедрение в прикладное решение требует участия квалифицированного разработчика. Хорошо, если БСП изначально присутствует в прикладном решении. Но если её там нет, администратор, или, тем более, квалифицированный пользователь, не смогут самостоятельно её внедрить.

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

Преимущества решения, встроенного в платформу

Когда мы проанализировали имеющуюся ситуацию, имеющийся опыт использования БСП, взвесили все «за» и «против», мы пришли к выводу, что наиболее эффективным решением будет реализовать историю данных в составе самой технологической платформы. Это позволит достичь следующих преимуществ:

  • Чтобы воспользоваться этим механизмом администратору или пользователю не придётся изменять конфигурацию, всё необходимое уже есть в платформе. Нужно только включить.
  • Этот механизм будет работать быстрее, чем аналоги, реализованные в составе конфигурации, т.к. он будет использовать возможности, недоступные из встроенного языка.
  • Сама история данных будет занимать меньше места, так как будет храниться не копия данных, а только их разница с предыдущей версией. Кроме этого само версионирование можно применять не ко всем реквизитам, а только к тем, которые интересуют. Это также даст дополнительную экономию.
  • Можно будет поддержать версионирование не только тех объектов, которые обладают уникальной ссылкой (справочники, документы и т.п.), но и необъектных сущностей, таких как записи регистров сведений, например.

Основные сведения о механизме

Механизм истории данных полностью реализован внутри платформы, не требует какой-либо установки дополнительных программных средств, в любой момент готов к работе, но, по умолчанию, не включён.

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

«Включение» механизма заключается в том, чтобы указать, для каких именно объектов конфигурации будет вестись история изменений. Причём ведение истории можно включать не только для всего объекта целиком, но и для его отдельных составных частей: реквизитов, измерений, ресурсов. В том числе для реквизитов табличных частей. Таким образом, вы можете выбирать: хранить полную информацию, или экономить место.

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

Данные истории мы храним в отдельных таблицах информационной базы. Для повышения эффективности мы храним только разницу между версиями данных. Если у вас есть «тяжёлый» документ с большим количеством строк в табличной части, а вы меняете только один реквизит в самом документе, то в истории данных сохранится только одно это изменение. То есть у вас не будет храниться множество копий этого объекта, и занимать место на диске.

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

Обработка изменения данных

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

А вот второй этап инициируется разработчиком. Второй этап заключается в том, что при обработке очереди эти данные извлекаются, помещаются в хранилище версий, и становятся доступными для работы с ними.

Для того чтобы таким образом обработать очередь, у менеджера истории данных (МенеджерИсторииДанных) есть метод ОбновитьИсторию(). Мы предполагаем, что вы будете использовать его так же, как похожий метод, предназначенный для обновления индекса полнотекстового поиска. То есть обновлять историю вы будете в некотором регламентном задании, которое выполняется с определённой периодичностью.

Мы полагаем, что в результате такой асинхронной работы будет обеспечена как эффективная запись объектов, так и минимизация потерь производительности.

Пользовательский интерфейс

В пользовательском интерфейсе 1С:Предприятия новый механизм называется История изменений. Он включает в себя несколько форм, которые позволяют выполнять те действия, которые были перечислены в начале этой статьи.

Список версий по конкретному объекту

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

04.png

Она позволяет увидеть список всех изменений (версий) объекта.

03.png

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

В этом списке, в колонке Комментарий, вы можете указать произвольный комментарий, который поможет вам в расследовании каких-то ситуаций.

Отбор версий

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

08.png

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

Отчёт о данных версии

Вы можете открыть любую версию объекта, чтобы посмотреть её данные.

05.png

Данные будут представлены специальным отчётом, в котором подсвечиваются значения, изменённые по отношению к предыдущей версии.

Отчёт о разнице между версиями

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

06.png

Результат сравнения версий будет также показан с помощью отчёта. Этот отчёт напоминает тот, который используется в БСП. Добавленные, изменённые и удалённые значения подсвечиваются.

07.png

Программный интерфейс

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

Прежде всего, из встроенного языка вы можете включить/настроить ведение истории. Например, вы можете включить ведение истории для двух реквизитов документа Заказ: реквизита Комментарий самого документа, и реквизита Цена его табличной части, которая называется Товары:

Настройки = Новый НастройкиИсторииДанных; Настройки.Использование = Истина; Настройки.ИспользованиеПолей.Вставить(«Комментарий», Истина); Настройки.ИспользованиеПолей.Вставить(«Товары.Цена», Истина); ИсторияДанных.УстановитьНастройки(Метаданные.Документы.Заказ, Настройки);

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

Например, вас интересуют все версии документа Заказ с номером 0000001, в которых менялось значение реквизита Количество табличной части, которая называется ПозицииЗаказа. Получить их можно следующим образом:

Отбор = Новый Структура(«Данные, ИзменениеЗначенийПолей»); Отбор.Данные = Документы.Заказ.НайтиПоНомеру(«0000001»); Отбор.ИзменениеЗначенийПолей = Новый Массив; Отбор.ИзменениеЗначенийПолей.Вставить(«ПозицииЗаказа.Количество»); Версии = ИсторияДанных.ВыбратьВерсии(Отбор, «НомерВерсии, Дата, ТипИзменения, ИмяПользователя, Комментарий»);

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

Теги:
история данных 
8.3.11 

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

Содержание

  1. Общая информация
  2. Описание и возможности
  3. Устройство механизма
  4. Использование механизма
  5. Управление использованием истории данных
  6. Запись версии
  7. Получение списка версий
  8. Получение данных версии
  9. Сравнение версий
  10. Удаление версий
  11. Прочие операции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

&НаСервере

Процедура УправлениеИспользованиемИсторииДанных()

//Получения значения свойства «История данных»

//установленного в конфигураторе у объекта

ОбъектВключен = Метаданные.Справочники.Справочник1.ИсторияДанных;

//у реквизита объекта

РеквизитВключен = Метаданные.Справочники.Справочник1.Реквизиты.Найти(«Реквизит1»).ИсторияДанных;

//у реквизита табличной части объекта

РеквизитТЧВключен = Метаданные.Справочники.Справочник1.ТабличныеЧасти.ТабличнаяЧасть1.Реквизиты.Найти(«Реквизит1»).ИсторияДанных;

//у стандартного реквизита объекта

СтандартныйРеквизитВключен = Метаданные.Справочники.Справочник1.СтандартныеРеквизиты.Наименование.ИсторияДанных;

//Получение информации об изменениях настроек истории данных

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

//Изменение настройки истории данных средствами встроеннго языка

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

//Настройка для самого объекта

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

//Для реквизитов объекта

Насторойки.ИспользованиеПолей.Вставить(«Реквизит1», Ложь);

Насторойки.ИспользованиеПолей.Вставить(«ТабличнаяЧасть1.Реквизит1», Ложь);

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

//Возвращаем настройки истории данных из конфигуратора

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

КонецПроцедуры

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

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

&НаСервере

Процедура ЗаписьВерсииДанных()

Данные = Справочники.Справочник1.НайтиПоНаименованию(«Элемент1»).ПолучитьОбъект();

ДатаСоздания = ‘20180101’;

Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(«Администратор»);

ИсторияДанных.ЗаписатьВерсию(Данные, ДатаСоздания,

Пользователь.УникальныйИдентификатор, Пользователь.Имя,

Пользователь.ПолноеИмя, ВидИзмененияДанных.Добавление,

«Тестируем запись версий»);

КонецПроцедуры

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

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

&НаСервере

Процедура ВыбратьВерсииДанных()

СсылкаНаОбъект = Справочники.Справочник1.НайтиПоНаименованию(«Элемент1»);

Отбор = Новый Структура;

Отбор.Вставить(«Данные», СсылкаНаОбъект);

СписокПолей = Новый Массив;

СписокПолей.Добавить(«Реквизит1»);

Отбор.Вставить(«ИзменениеЗначенийПолей», СписокПолей);

//Результатом метода будет таблица значений

//мы можем настроить ее колонки

//отсортировать в нужном порядке

//и ограничить количество выбраных версий

Версии = ИсторияДанных.ВыбратьВерсии(Отбор,

«НомерВерсии, Дата, ИмяПользователя, Комментарий», «НомерВерсии Убыв», 100);

КонецПроцедуры

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

&НаСервере

Процедура ВыбратьВерсииДанных()

СсылкаНаОбъект = Справочники.Справочник1.НайтиПоНаименованию(«Элемент1»);

Отбор = Новый Структура;

Отбор.Вставить(«Данные», СсылкаНаОбъект);

Условие1 = Новый Структура;

Условие1.Вставить(«Поле», «Реквизит1»);

Условие1.Вставить(«ЗначениеПослеИзменения», «123»);

Условие2 = Новый Структура;

Условие2.Вставить(«Поле», «Реквизит1»);

Условие2.Вставить(«ЗначениеПослеИзменения», «321»);

ЗначенияПолей = Новый Массив;

ЗначенияПолей.Добавить(Условие1);

ЗначенияПолей.Добавить(Условие2);

Отбор.Вставить(«ЗначенияПолей», ЗначенияПолей);

Версии = ИсторияДанных.ВыбратьВерсии(Отбор,

«НомерВерсии, Дата, ИмяПользователя, Комментарий», «НомерВерсии Убыв»);

КонецПроцедуры

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

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

&НаСервере

Процедура ПолучениеДанныхВерсии()

СсылкаНаОбъект = Справочники.Справочник1.НайтиПоНаименованию(«Элемент1»);

//определим номер версии как в примере выше

НомерВерсии = ОпределитьНомерВерсии();

//получаем объект нужной версии и записываем его

СпрОбъект = ИсторияДанных.СформироватьПоВерсии(СсылкаНаОбъект, НомерВерсии);

//данные версии будут записаны в текущий объект

СпрОбъект.Записать();

КонецПроцедуры

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

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

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

&НаСервере

Процедура ПолучениеДанныхВерсии()

СсылкаНаОбъект = Справочники.Справочник1.НайтиПоНаименованию(«Элемент1»);

НомерВерсии = ОпределитьНомерВерсии();

//получаем данные версии в виде структуры

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

Сообщить(СтруктураДанных.Реквизит1)

КонецПроцедуры

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

&НаСервере

Процедура ПолучениеДанныхВерсии()

СсылкаНаОбъект = Справочники.Справочник1.НайтиПоНаименованию(«Элемент1»);

НомерВерсии = ОпределитьНомерВерсии();

//получаем метаданные версии в виде структуры

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

Сообщить(СтруктураДанных.Представление);

Сообщить(СтруктураДанных.Поля.Реквизит1)

КонецПроцедуры

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

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

&НаСервере

Процедура СравнениеВерсий(НомерВерсииПослеИзменений, НомерВерсииДоИзменений)

СсылкаНаОбъект = Справочники.Справочник1.НайтиПоНаименованию(«Элемент1»);

//сначала указываем номер версии после изменений

//затем номер версии до изменений

//это важно

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

НомерВерсииПослеИзменений, НомерВерсииДоИзменений);

КонецПроцедуры

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

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

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

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

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

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

&НаСервере

Процедура УдалениеВерсий()

СсылкаНаОбъект = Справочники.Справочник1.НайтиПоНаименованию(«Элемент1»);

//удаляем версии с номера 1 по номер 3

ИсторияДанных.УдалитьВерсии(СсылкаНаОбъект, 1, 3);

//удаляем все версии с начала года

ИсторияДанных.УдалитьВерсии(СсылкаНаОбъект, НачалоГода(ТекущаяДата()), ТекущаяДата());

//удаляем все историю указанного справочника

ИсторияДанных.УдалитьВерсии(Метаданные.Справочники.Справочник1);

КонецПроцедуры

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

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

&НаСервере

Процедура ПрочиеОперации()

СсылкаНаОбъект = Справочники.Справочник1.НайтиПоНаименованию(«Элемент1»);

//обновляем историю по конкретному объекту

ИсторияДанных.ОбновитьИсторию(СсылкаНаОбъект);

//обновляем историю во всей базе

ИсторияДанных.ОбновитьИсторию();

//записываем коментарий для версии объекта с номером 1

ИсторияДанных.ЗаписатьКомментарий(СсылкаНаОбъект, 1, «комментарий»);

КонецПроцедуры

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

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

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

Загрузка…

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

В сети существует интересный продукт, предназначеный для фиксации изменений в программе «Бизнес-Плюс:Журнал изменений», который стоит на момент написания статьи 12 000 рублей. Любой уважающий себя 1С-ник должен для начала самостоятельно попробовать написать что то подобное 

Вы можете сказать, а чем меня не устраивает встроенный журнал регистрации, который по одному документу формируется 5 минут Этим и не устраивает. регистрация изменений в шапке документов, думаю, понятна каждому, а вот регистрация изменений в табличных частях различных документов немного сложнее. задача состояла в том, чтобы зафиксировать всю историю изменений в произвольной табличной части произвольного документа или справочника 1С версии 8.

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

Создаем справочник «История изменений»

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

Справочник история изменений

Справочник история изменений

Реквизиты:
Объект — ДокументСсылка, СправочникСсылка (По этому объекту в элементе справочника будет хранится история)

Табличная часть — изменения:
ДатаЗаписи — Дата (дата и время записи изменения)
НазваниеТабличнойЧасти — Строка (длина 50, Название табличной части по которой требуется фиксировать изменения)
ТаблицаИзменений — Строка (длина неограничена, тут будет хранится наша таблица значений)
Автор — Пользователь (кто сделал изменения)

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

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

//Это основная функция которую будет вызывать для записи изменения
//Фиксируются только новые и измененные строки
//Табличная часть - в эту переменную передаем табличную часть документ
//НазваниеТабличнойЧасти - название табличной части. именно по этому параметру будет искаться предыдущее значение табличной части.
//Объект - объект, в принципе может и не поднадобиться
Процедура ЗафиксироватьИзменения(ТабличнаяЧасть, НазваниеТабличнойЧасти, Объект) Экспорт
СтараяТаблица = ПолучитьСтаруюТаблицу(НазваниеТабличнойЧасти); //Получаем старую таблицу
НоваяТаблица = ТабличнаяЧасть.Выгрузить();

  Если ТипЗнч(СтараяТаблица)=Тип("ТаблицаЗначений") Тогда
//Если в новой таблице нет строк тогда просто записываем новую таблицу
Если НоваяТаблица.Количество()=0 и СтараяТаблица.Количество()>0 Тогда
ЗафиксироватьТаблицу(НоваяТаблица, НазваниеТабличнойЧасти);
ИначеЕсли НоваяТаблица.Количество()>0 и СтараяТаблица.Количество()>0 Тогда
//Надо сравнивать
Если ЕстьИзмененияВТаблицах(СтараяТаблица, НоваяТаблица) Тогда
ЗафиксироватьТаблицу(НоваяТаблица, НазваниеТабличнойЧасти);
КонецЕсли;
КонецЕсли;
Иначе
//Сравнивать не надо - это первая фиксация
//Фиксируем только если в таблице есть строки
Если НоваяТаблица.Количество()>0 Тогда
ЗафиксироватьТаблицу(НоваяТаблица, НазваниеТабличнойЧасти);
КонецЕсли;
КонецЕсли;
КонецПроцедуры

  //Функция получает ТаблицуЗначений - предыдущее значение табличной части
Функция ПолучитьСтаруюТаблицу(НазваниеТабличнойЧасти) Экспорт
МассивСтрок = Изменения.НайтиСтроки(Новый Структура("НазваниеТабличнойЧасти", НазваниеТабличнойЧасти));
Если МассивСтрок.Количество()>0 Тогда
ТаблицаИзменений = ЗначениеИзСтрокиВнутр(МассивСтрок.Получить(МассивСтрок.Количество()-1).ТаблицаИзменений);
Возврат ТаблицаИзменений;
Иначе
ТаблицаИзменений = Неопределено;
Возврат ТаблицаИзменений;
КонецЕсли;
КонецФункции

  //Функция сравнивает две строки, которые являются предыдущим и текущим значением ТабличнойЧасти документа
Функция ЕстьИзмененияВТаблицах(СтараяТаблица, НоваяТаблица)
Если ЗначениеВСтрокуВнутр(СтараяТаблица)=ЗначениеВСтрокуВнутр(НоваяТаблица) Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции

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

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

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

Процедура ЗафиксироватьИзмененияТабличнойЧасти(ТабличнаяЧасть, НазваниеТабличнойЧасти, ОбъектСсылка) Экспорт;
Если ТабличнаяЧасть.Количество()>0 Тогда
Запрос = Новый Запрос();
ТекстЗапроса = "ВЫБРАТЬ | ИсторияИзменений.Ссылка |ИЗ | Справочник.ИсторияИзменений КАК ИсторияИзменений |ГДЕ | ИсторияИзменений.Объект = &ОбъектСсылка";

  Запрос.Текст = ТекстЗапроса;
Запрос.Параметры.Вставить("ОбъектСсылка", ОбъектСсылка);

  ТЗ = Запрос.Выполнить().Выгрузить();
Если ТЗ.Количество()>0 Тогда
СправочникИзменений = ТЗ.Получить(0).Ссылка;
СправочникИзменений = СправочникИзменений.ПолучитьОбъект();
Иначе
СправочникИзменений = Справочники.ИсторияИзменений.СоздатьЭлемент();
СправочникИзменений.Объект = ОбъектСсылка;
СправочникИзменений.Записать();
КонецЕсли;

  СправочникИзменений.ЗафиксироватьИзменения(ТабличнаяЧасть, НазваниеТабличнойЧасти, ОбъектСсылка);
КонецЕсли;
КонецПроцедуры

Создаем форму элемента справочника «История изменений»

Рисуем форму элемента:

История изменений 1С

История изменений 1С

Форма элемента справочника история изменений выглядит в начальном виде именно так. В поле старые значения будут показываться предыдущие значения, а в поле новые значения… ну вы догадались. В эти поля являются табличным полями с названиями соответственно «ТаблицаСтароеЗначение» и «ТаблицаНовоеЗначение».

А теперь код формы:

Процедура АнализироватьТаблицы()
Если (ТаблицаСтароеЗначение.Количество() = 0) или (ТаблицаНовоеЗначение.Количество() = 0) Тогда

  Иначе
ТЗРезНовая = ТаблицаНовоеЗначение.Скопировать();
ТЗРезНовая.Очистить();
ТЗРезСтарая = ТЗРезНовая.Скопировать();
КоличествоКолонок = ТЗРезНовая.Колонки.Количество();

  н=0;
Пока н < ТаблицаНовоеЗначение.Количество() Цикл
НовСтрока = ТаблицаНовоеЗначение.Получить(н);
з=0;
Пока з<ТаблицаСтароеЗначение.Количество() Цикл
СтараяСтрока = ТаблицаСтароеЗначение.Получить(з);
КоличествоСовпадений = 0;
Для Каждого Колонка из ТаблицаНовоеЗначение.Колонки Цикл
//обрабатывать колонку НомерСтроки мы не будет, так как строки могут меняться
Если Колонка.Имя = "НомерСтроки" Тогда
КоличествоСовпадений = КоличествоСовпадений + 1;
Продолжить;
Иначе
НовоеЗначение = НовСтрока[Колонка.Имя];
СтароеЗначение = СтараяСтрока[Колонка.Имя];
Если НовоеЗначение = СтароеЗначение Тогда
КоличествоСовпадений = КоличествоСовпадений + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если КоличествоСовпадений = КоличествоКолонок Тогда
ТаблицаСтароеЗначение.Удалить(СтараяСтрока);
ТаблицаНовоеЗначение.Удалить(НовСтрока);
Если н < ТаблицаНовоеЗначение.Количество() Тогда
НовСтрока = ТаблицаНовоеЗначение.Получить(н);
КонецЕсли;
Иначе
з = з + 1;
КонецЕсли;

  КонецЦикла;
н=н+1;
КонецЦикла;
КонецЕсли;
КонецПроцедуры

  Процедура ИзмененияПриАктивизацииСтроки(Элемент)
Если Изменения.Количество() > 0 Тогда
ТаблицаНовоеЗначение = ЗначениеИзСтрокиВнутр(Элемент.ТекущиеДанные.ТаблицаИзменений);
ЭлементыФормы.ТаблицаНовоеЗначение.СоздатьКолонки();

  ТаблицаСтароеЗначение = Неопределено;

  Если Элемент.ТекущиеДанные.НомерСтроки > 1 Тогда
н = Элемент.ТекущиеДанные.НомерСтроки-1;
Пока н > 0 Цикл
Если Изменения.Получить(н-1).НазваниеТабличнойЧасти = Элемент.ТекущиеДанные.НазваниеТабличнойЧасти Тогда
ТаблицаСтароеЗначение = ЗначениеИзСтрокиВнутр(Изменения.Получить(н-1).ТаблицаИзменений);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;

  Если ТипЗнч(ТаблицаСтароеЗначение) = Тип("ТаблицаЗначений") Тогда
ЭлементыФормы.ТаблицаСтароеЗначение.СоздатьКолонки();
КонецЕсли;
КонецЕсли;

  АнализироватьТаблицы();
КонецПроцедуры

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

Пример фиксации изменений табличной части для любого документа в котором есть табличная часть «Работы»:

Процедура ПослеЗаписи()

  //тут какой-то код

  Попытка
ЗафиксироватьИзмененияТабличнойЧасти(Работы, "Работы", ЭтотОбъект.Ссылка);
Исключение

  КонецПопытки;
КонецПроцедуры

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

14 Сентябрь 2012 г.

Когда с базой 1С работают несколько сотрудников, возникают вопросы:

  • как отследить действия пользователей в системе;
  • как посмотреть в 1С кто изменял документ;
  • где увидеть историю изменения документа;
  • как вернуть данные к прежнему виду?

Найти ответы помогут Журнал регистрации и История изменений.

Работу с Журналом регистрации и Историей изменений рассмотрим на примере конфигурации 1С Бухгалтерия 8.3.

Содержание

  • Журнал регистрации и История изменений
  • Журнал регистрации
    • Где найти журнал регистрации
    • Настройка журнала
    • Как читать журнал
  • 1С история изменений документа или справочника
    • Включение и настройка
    • Просмотр истории изменений документа или справочника
    • Восстановление предыдущей версии документа или справочника

Журнал регистрации и История изменений

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

Журнал регистрации больше ориентирован на фиксирование действий с программой в целом — таких, как изменение параметров, настроек. А механизм Истории изменений — на хранение предшествующих версий документов и справочников. Он появился в типовых конфигурациях с версии 8.3.11, а с 8.3.13.1513 к списку объектов добавились константы, планы обмена и планы видов характеристик. Журнал регистрации начинает собирать информацию автоматически с момента установки программы, а для начала работы Истории изменений требуется ее включение и настройка.

Журнал регистрации

Журнал регистрации дает возможность выявить пользователей, совершавших какие-либо действия в программе. Открывать и просматривать его может только пользователь с правами администратора. В журнале фиксируются:

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

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

Подробнее Журнал регистрации в 1С 8.3

Где найти журнал регистрации

Журнал регистрации, в котором хранится история изменений в 1С 8.3, можно найти в разделе: Администрирование — Обслуживание — Журнал регистрации.

Настройка журнала

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

  • Показывать — количество записей в окне журнала;
  • Критичность— выберите:
    • Все события — без отбора по событиям;
    • Ошибка — возникшие в программе ошибки;
    • Предупреждение — выведенные на экран предупреждения для пользователей;
  • Интервал — задайте, если нужен список записей в журнале регистрации за период, отличный от указанного в поле Отбор (по умолчанию там указана текущая дата).

Кнопка Установить отбор — это расширенный отбор для получения данных по конкретному событию или объекту. Чтобы отобразить сведения по документу, настройте:

  • Интервал — период, за который сформируются записи о действиях с документом. Если период неизвестен, устанавливается максимальный: с даты создания документа по текущее число;
  • Метаданные — укажите для получения информации по всем документам одного вида;
  • Данные — укажите конкретный документ. Для этого выберите в поле из списка наименование документа.

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

Кнопка Применить и закрыть — завершение настройки расширенного отбора.

Сформируется отчет по зафиксированным событиям по документу за указанный период. Для открытия измененного объекта выберите из контекстного меню пункт Открыть данные для просмотра.

Как читать журнал

В журнале регистрации выводятся графы:

  • Дата, время — дата и время события;
  • Пользователь, компьютер, приложение, сеанс — имя пользователя, имя компьютера, с которого запущена программа, режим запущенного приложения (стандартно для всех пользователей, работающих с базой данных 1С — Тонкий клиент);
  • Событие, данные и метаданные, комментарий:
    • событие — произошло с Добавление информации (возможны: Изменение, Проведение);
    • данные — событие связанно с Данными (возможны: Доступ, Пользователи, Сеанс, Фоновое задание);
    • метаданные — объект, с которым произошло событие: Счет покупателю 0000-000001 от 26.10.2020 16:50:31, относится к типу Документ, вид Счет покупателю;
    • комментарий программа указывает в случае возникновения ошибки или предупреждения.

История изменений документа в 1С 8.3 (или справочника) хранит все версии объекта — от создания до последнего редактирования и проведения. Механизм позволяет:

  • отследить изменения, сделанные пользователем;
  • увидеть предыдущие данные;
  • сопоставить измененную информацию со старой;
  • вернуть документ/справочник к изначальному виду.

Включение и настройка

Расположение функции в программе:

  • зайдите в систему под пользователем с правами администратора;
  • меню Администрирование – Общие настройки;
  • откройте раздел История изменений и установите флаг Хранить историю изменений.

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

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

Настройка истории хранения по конкретным видам документов/справочников позволит не загружать базу лишними данными и сохранит производительность системы.

Укажите, при каких обстоятельствах требуется добавлять записи в историю, нажав Установить когда сохранять версии и выбрав пункт из списка:

  • Никогда — не хранить данные об изменениях;
  • При записи:
    • для документов — собирать историю редактирования не проведенных документов;
    • для справочников — сохраняются все изменения;
  • При проведении (для документов) — фиксировать изменения в проведенных документах;
  • По умолчанию предлагает настройки:
    • для справочников — Никогда;
    • для документов — При проведении (для документов).

Установить срок хранения версий — определяется время хранения версий:

  • За последнюю неделю;
  • За последний месяц;
  • За последние три месяца;
  • За последние шесть месяцев;
  • За последний год;
  • Бессрочно — хранить историю всегда.

Версии с истекшим сроком хранения система считает устаревшими. При установке флага Автоматически удалять устаревшие версии программа будет их удалять самостоятельно. По умолчанию удаление настроено на каждый день в 3:00, но по ссылке Настроить расписание можно поменять настройки времени и частоты запуска процедуры удаления устаревших версий — от нескольких раз день до одного раза в год. Версии с Бессрочным сроком хранения всегда актуальны и автоматически программой не удаляются.

Просмотр истории изменений документа или справочника

Как в 1С посмотреть историю изменения документа/справочника после включения опции:

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

Если этих пунктов нет, проверьте Настройку истории (Администрирование — Общие настройки — История изменений): возможно, не заданы параметры для хранения объектов этого вида.

  • Откроется окно История изменений с отчетом о редактировании документа/справочника. Включает дату изменения и имя пользователя, сделавшего корректировки.

Жирным цветом выделена текущая версия. Для просмотра деталей нажмите кнопку Открыть версию. Версия документа/справочника на выбранную дату отображается в виде отчета со значениями реквизитов.

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

Сравнение версий документа/справочника:

  • Откройте окно История изменений.
  • Выделите строки с зажатой клавишей Shift или Ctrl и нажмите кнопку Сравнить. Сформируется отчет по изменениям, где каждой выбранной позиции отведена колонка. Порядок столбцов по умолчанию: в последней колонке отражены начальные данные (из выбранных версий), а в первой — конечные изменения (среди выбранных для сравнения). Сопоставлять можно любое количество версий.

Измененное значение реквизита подсвечивается.

Восстановление предыдущей версии документа или справочника

Чтобы восстановить данные до определенного состояния, выделите нужную строку и нажмите Перейти на версию. Документ/справочник вернется к состоянию на выбранное число в истории появится запись о создании новой версии с комментарием, она будет выделена жирным цветом как актуальная на текущий момент. Кнопка доступна только в режиме администратора.

Таким образом, посмотреть в 1С кто корректировал данные можно несколькими способами. Журнал регистрации и История изменений заложены во все типовые решения фирмы 1С. У каждого из них есть преимущества и недостатки. В Журнале регистрации предусмотрен расширенный механизм отбора информации по всей базе данных, а история изменений привязана и открывается по конкретному документу или справочнику. На практике для получения эффективных результатов при поиске измененных данных используют оба способа совместно.

См. также:

  • Журнал регистрации в 1С 8.3
  • Поиск и удаление дублей
  • Загрузка данных из табличного документа 1С 8.3
  • Как выгрузить документ, отчет из 1С 8.3 в Excel
  • Сбилась нумерация документов в 1С 8.3: как исправить
  • Как удалить помеченные на удаление документы
  • Поиск и замена значений 1С 8.3
  • Исправление технических ошибок при работе с 1С:Бухгалтерия

Если Вы еще не подписаны:

Активировать демо-доступ бесплатно →

или

Оформить подписку на Рубрикатор →

После оформления подписки вам станут доступны все материалы Бухэксперт8, записи поддерживающих эфиров и вы сможете задавать любые вопросы по программе 1С.

Подписывайтесь на наши YouTube и Telegram чтобы не пропустить
важные изменения 1С и законодательства

Помогла статья?

Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно

Довольно часто в процессе работы с 1С возникает необходимость узнать, кто и какие изменения внес в данные. Например, в документе поменялись проводки, или в справочнике изменились реквизиты. Как узнать, кто “нахулиганил”? Для этого в типовых конфигурациях используется механизм БСП(Библиотека стандартных подсистем) – Версионирование.
В этой статье мы рассмотрим настройку этого механизма, и анализ версий, на примере демо-базы 1С Бухгалтерия 3.

Настройка версионирования

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

Варианты версионирования, срок хранения версий

Объекты, для которых можно настроить версионирование, сгруппированы по видам – справочники и документы. Далеко не у всех объектов предусмотрен механизм версионирования, это нужно учитывать. Для каждого объекта можно настроить правило хранения истории изменений – вариант версионирования и срок хранения версий. Кроме того, можно задать эти настройки сразу для всей группы объектов, например, для всех справочников. И еще один способ группового изменения настроек – это выделить несколько строк с зажатым CTRL. После этого следует использовать кнопки с выпадающим меню: “Установить вариант версионирования” и “Установить срок хранения версий”.

1С Настройка версионирования

Чтобы настроить хранение истории изменений для справочников, нужно выбрать вариант версионирования “Версионировать при записи”. Для документов рекомендуется выбирать вариант “Версионировать при проведении”. В этом случае до проведения либо записи уже проведенного объекта версии создаваться не будут, что позволит избежать хранения версий-черновиков.

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

Устаревшие версии — анализ объема, удаление по расписанию

Оценить объем хранимой информации о версиях объектов можно при помощи специального отчета, который открывается по ссылке “Количество и объем хранимых версий объектов”. В отчете можно оценить визуально количество и объем при помощи диаграмм, кроме того, внизу отчета выводится таблица с числовыми значениями количества версий и объема в мегабайтах. Данный отчет позволяет проанализировать, какие объекты дают самую большую нагрузку на систему хранения версий, и принять решение о необходимости изменения срока хранения версий.

1С отчет по объему хранимых версий объектов

В случае, когда у объекта настроено хранение версий, отличное от “Бессрочно”, со временем версии становятся “устаревшими”. Удалить их можно либо вручную, нажав кнопку “Очистить”, либо настроить расписание. Расписание настраивается аналогично расписанию любых других регламентных заданий – можно настроить время выполнения обработки, периодичность в днях, а также уточнить недельное и месячное расписание.

1С История изменения объектов - удаление устаревших версий

Работа с историей изменений

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

1С История изменения объекта

Фильтр по реквизитам

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

1С история изменений - фильтр по реквизитам

В открывшемся окне можно отметить флажками реквизиты, изменения по которым нужно отфильтровать. После закрытия окна версии, в которых нужные нам реквизиты не менялись, будут скрыты.

1С история изменений - выбор реквизитов

Сравнение нескольких версий

Чаще всего анализ истории изменений сводится к вопросу – “кто и когда поменял такой-то реквизит у такого-то объекта?”. Для этого можно использовать сравнение версий. Механизм версионирования поддерживает множественное сравнение, но удобнее сравнивать изменения в версиях попарно. Для того чтобы сравнить несколько версий объекта, нужно выделить их с зажатым CTRL, и нажать кнопку “Сравнить версии”. Откроется отчет по изменениям:

1С Отчет по изменениям версий

В отчете можно проанализировать, в какой версии реквизит был изменен, в какой – удален, в какой – добавлен.

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

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

1С Отчет по версии объекта

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

Понравилась статья? Поделить с друзьями:
  • 1с как обновить реквизит управляемой формы
  • 1с как обратиться к реквизиту формы отчета
  • 1с как перебрать все реквизиты справочника
  • 1с как получить программно реквизиты формы
  • 1с макеты печатных форм добавить реквизиты