Нам часто требуется отслеживать изменения данных в нашей информационной базе. Механизм версионирования объектов в 1С:Предприятии — это мощный инструмент, который позволяет нам хранить историю изменений справочников, документов и других объектов. Он отличается от журнала регистрации тем, что мы можем не просто увидеть факт изменения, но и конкретные значения, которые были в объекте на определенный момент времени. Это крайне полезно для анализа, сравнения и, при необходимости, восстановления данных.
Прежде чем мы сможем программно работать с версиями, нам необходимо убедиться, что версионирование объектов включено и настроено в нашей конфигурации. Рассмотрим этот процесс по шагам:
Когда версионирование настроено, мы можем программно получить данные из любой сохраненной версии объекта. Для этого нам на помощь приходят функции общего модуля ВерсионированиеОбъектов, который является частью Библиотеки стандартных подсистем (БСП).
Ключевой функцией для получения данных версии является ВерсионированиеОбъектов.РазборВерсии(Ссылка, НомерВерсии). Давайте разберем ее подробнее:
РазборВерсии() в свою очередь вызывает процедуру ВерсионированиеОбъектов.РазборПредставленияОбъектаXML(ДанныеВерсии, Ссылка), которая считывает XML-представление версии и заполняет необходимые структуры данных. Мы можем изучить ее описание в модуле для более глубокого понимания.
После вызова функции РазборВерсии() мы получим объект, представляющий собой данные предыдущей версии. Например, если нам нужно получить данные табличной части "Услуги" из предыдущей версии документа, мы можем сделать это так:
Результат = ВерсионированиеОбъектов.РазборВерсии(Док, НомерВерсии);
ТЗ1 = Результат.ТабличныеЧасти.Получить("Услуги");
Здесь Док – это ссылка на наш текущий документ, а НомерВерсии – это числовой идентификатор предыдущей версии, которую мы хотим получить. Переменная ТЗ1 в результате будет содержать табличную часть "Услуги" из выбранной старой версии документа в виде объекта типа ТаблицаЗначений.
Часто нам не требуется полностью восстанавливать документ до предыдущей версии, а нужно лишь обновить отдельные реквизиты или строки табличной части. Рассмотрим, как мы можем это сделать, используя полученные данные.
Представим ситуацию: нам нужно обновить только поле "Содержание" в строках табличной части "Услуги" текущего документа, взяв данные из предыдущей версии. Мы можем это сделать, сопоставляя строки по их уникальному идентификатору. В БСП для этого используется реквизит ИдентификаторСтроки, который автоматически добавляется в табличные части версионируемых объектов.
Давайте проанализируем пошаговый алгоритм и посмотрим на пример кода:
Результат = ВерсионированиеОбъектов.РазборВерсии(Док, НомерВерсии);
ТЗ1 = Результат.ТабличныеЧасти.Получить("Услуги");
пр = 0; // Флаг изменений
Док1.Услуги).
Для каждого стр Из Док1.Услуги Цикл
// ...
КонецЦикла;
ТЗ1 (из предыдущей версии) по реквизиту ИдентификаторСтроки.
стрТЗ1 = ТЗ1.Найти(стр.ИдентификаторСтроки, "ИдентификаторСтроки");
стрТЗ1 не Неопределено), мы обновляем нужный реквизит текущей строки (например, Содержание) значением из старой версии. При этом устанавливаем наш флаг изменений.
Если стрТЗ1 <> Неопределено Тогда
стр.Содержание = стрТЗ1.Содержание;
пр = 1; // Указываем, что были изменения
КонецЕсли;
пр установлен в 1, это означает, что мы внесли изменения в документ. В этом случае мы сообщаем пользователю об изменениях и записываем документ.
Если пр = 1 Тогда
Сообщить("Исправлен документ " + Док1);
Док1.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
Объединив эти шаги, мы получим следующий рабочий код для частичного обновления табличной части:
пр = 0; // Флаг изменений
Результат = ВерсионированиеОбъектов.РазборВерсии(Док, НомерВерсии);
ТЗ1 = Результат.ТабличныеЧасти.Получить("Услуги");
Для каждого стр Из Док1.Услуги Цикл
стрТЗ1 = ТЗ1.Найти(стр.ИдентификаторСтроки, "ИдентификаторСтроки");
Если стрТЗ1 <> Неопределено Тогда
стр.Содержание = стрТЗ1.Содержание;
пр = 1;
КонецЕсли;
КонецЦикла;
Если пр = 1 Тогда
Сообщить("Исправлен документ " + Док1);
Док1.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
Таким образом, мы видим, что ИдентификаторСтроки играет ключевую роль в сопоставлении строк табличных частей между разными версиями объекта.
Работая с версионированием, мы должны учитывать несколько важных моментов:
Используя описанные подходы, мы сможем эффективно работать с версиями объектов, восстанавливать данные или выборочно обновлять их, что значительно упрощает поддержку и анализ изменений в нашей информационной системе.
← К списку