Стояла задача:
сравнить данные Документов, которые находятся в разных базах, метаданные которых похожи
(в шапке часть реквизитов отличается и некоторые табличные части отсутствуют).
Решение задачи:
У Документов есть поле ВерсияДанных. Это поле всегда обновляется при Записи, даже когда Документ не был изменён. Поэтому пришлось искать другое решение.
Решил собирать структуру данных по Документу в формате json, которая будет сопоставляться с аналогичной структурой во второй базе.
Итог сравнения двух документов, поле Хэш в цифровом формате.
А далее, можно принимать решение обновлять документ или нет, во второй базе.
Ниже, пример кода:
МассивУдаляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов.Добавить("Контрагент");
МассивУдаляемыхТабЧастей = Новый Массив;
МассивУдаляемыхТабЧастей.Добавить("Состав2");
РезультатСтруктура = ПолучитьJSONпоСсылке(СсылкаНаОбъект, МассивУдаляемыхРеквизитов, МассивУдаляемыхТабЧастей);
РезультатJson = СтруктураВJson(РезультатСтруктура);
Хэш = КонтрольнаяСумма(РезультатJson);
Ниже, полезные функции для решения этой задачи:
// когда нужно все реквизиты документа кинуть в JSON, а некоторые исключить
Функция ПолучитьJSONпоСсылке(СсылкаНаОбъект, МассивУдаляемыхРеквизитов = Неопределено, МассивУдаляемыхТабЧастей = Неопределено) Экспорт
// Описание:
// МассивУдаляемыхРеквизитов - структура, список реквизитов, которых не должно быть в результате
// МассивУдаляемыхТабЧастей - структура, список табличных частей, которых не должно быть в результате
Об = СсылкаНаОбъект.ПолучитьОбъект();
ДокСтруктура = новый Структура;
Для каждого Реквизит Из Об.Метаданные().СтандартныеРеквизиты Цикл // СтандартныеРеквизиты
ДокСтруктура.Вставить(Реквизит.Имя, Строка(Об[Реквизит.Имя]));
КонецЦикла;
Для каждого Реквизит Из Об.Метаданные().Реквизиты Цикл // Реквизиты
// удаляем реквизиты,21 которые не нужны
Если НЕ МассивУдаляемыхРеквизитов = Неопределено Тогда
Если МассивУдаляемыхРеквизитов.Найти(Реквизит.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ДокСтруктура.Вставить(Реквизит.Имя, Строка(Об[Реквизит.Имя]));
КонецЦикла;
Для каждого ТабличнаяЧасть из Об.Метаданные().ТабличныеЧасти цикл
ИмяТабЧасти = ТабличнаяЧасть.Имя;
табЧасть = Об[ТабличнаяЧасть.Имя];
мТЧ = Новый Массив;
// удаляем ТабЧасти, которые не нужны
Если НЕ МассивУдаляемыхТабЧастей = Неопределено Тогда
Если МассивУдаляемыхТабЧастей.Найти(ИмяТабЧасти) <> Неопределено Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
Для каждого Стр из табЧасть Цикл
сТЧ = Новый Структура;
Для каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
сТЧ.Вставить(Реквизит.Имя,Строка(Стр[Реквизит.Имя]));
КонецЦикла;
мТЧ.Добавить(сТЧ);
КонецЦикла;
ДокСтруктура.Вставить(ИмяТабЧасти, мТЧ);
КонецЦикла;
Возврат ДокСтруктура;
КонецФункции
Функция СтруктураВJSON
Функция СтруктураВJSON(новСтруктура) Экспорт
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, новСтруктура);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Функция КонтрольнаяСумма
// ХешФункция.CRC32 по-умолчанию используется
Функция КонтрольнаяСумма(Текст, Хэш = Неопределено) Экспорт
Если Хэш = Неопределено Тогда
Хэш = ХешФункция.CRC32;
КонецЕсли;
ХешированиеДанных = Новый ХешированиеДанных(Хэш);
ХешированиеДанных.Добавить(Текст);
Возврат ХешированиеДанных.ХешСумма;;
КонецФункции