Сравнение данных Документов в двух базах, метаданные которых похожи

20.10.23

Задачи пользователя - Анализ учета

Сравнение данных Документов в двух базах с похожей структурой (json + хэш).

 

Стояла задача:

сравнить данные Документов, которые находятся в разных базах, метаданные которых похожи

(в шапке часть реквизитов отличается и некоторые табличные части отсутствуют).

 

Решение задачи:

 

        У Документов есть поле ВерсияДанных. Это поле всегда обновляется при Записи, даже когда Документ не был изменён. Поэтому пришлось искать другое решение.

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

       Итог сравнения двух документов, поле Хэш в цифровом формате.

А далее, можно принимать решение обновлять документ или нет, во второй базе.

 

Ниже, пример кода:

МассивУдаляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов.Добавить("Контрагент"); 
	
МассивУдаляемыхТабЧастей = Новый Массив;
МассивУдаляемыхТабЧастей.Добавить("Состав2");       
	
РезультатСтруктура = ПолучитьJSONпоСсылке(СсылкаНаОбъект, МассивУдаляемыхРеквизитов, МассивУдаляемыхТабЧастей);  

РезультатJson = СтруктураВJson(РезультатСтруктура); 
Хэш = КонтрольнаяСумма(РезультатJson);

Ниже, полезные функции для решения этой задачи:

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

			Для каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл  			
				сТЧ.Вставить(Реквизит.Имя,Строка(Стр[Реквизит.Имя])); 	
			КонецЦикла;  
			
			мТЧ.Добавить(сТЧ);            		    
		КонецЦикла;                                     
		
		ДокСтруктура.Вставить(ИмяТабЧасти, мТЧ);

	КонецЦикла;  

	Возврат ДокСтруктура;
КонецФункции

Функция СтруктураВJSON

Функция СтруктураВJSON(новСтруктура) Экспорт
    ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, новСтруктура); 
	
	Возврат ЗаписьJSON.Закрыть();  
КонецФункции

Функция КонтрольнаяСумма

// ХешФункция.CRC32 по-умолчанию используется
Функция КонтрольнаяСумма(Текст, Хэш = Неопределено) Экспорт  

	Если Хэш = Неопределено Тогда
	 	Хэш = ХешФункция.CRC32;
	КонецЕсли;
	
	ХешированиеДанных = Новый ХешированиеДанных(Хэш);
    ХешированиеДанных.Добавить(Текст);
                  
	Возврат ХешированиеДанных.ХешСумма;;
КонецФункции

 

 
 Обратите внимание, чтобы у вас 

 

сравнить данные json кэш метаданные отличаются часть табличная реквизит отсутствует xml sql com обмен похожи документ справочник найти поиск сравнение

См. также

Анализ расхождений выручки НДС и Налога на прибыль в декларациях (БП 3.0 ПРОФ и КОРП, КА 2, ЕRP)

Анализ учета Закрытие периода Платформа 1С v8.3 Бухгалтерский учет 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Налоговый учет Налог на прибыль НДС Платные (руб)

Каждый бухгалтер не раз сталкивался с требованием от налоговой инспекции пояснить расхождения в показателях декларации по Налогу на прибыль («Доходы от реализации» + «Внереализационные доходы») и налоговой базой по НДС за год. Являются ли ошибкой подобные расхождения? Как пояснить налоговой их причину? Отчет «Анализ расхождений выручки НДС и Налога на прибыль в декларациях» поможет найти все расхождения.

7200 руб.

21.10.2017    84447    266    167    

258

Дополнительный анализ расходов УСН в 1С:Бухгалтерии 3.0

Учет доходов и расходов Анализ учета Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет УСН Платные (руб)

Мы добавили девять новых проверок в Экспресс-проверку учета. Цель таких проверок — узнать, есть ли потенциальные проблемы в учёте УСН.

7200 руб.

27.09.2021    13697    28    11    

36

Отчет "ABC-анализ" для 1С УТ 11, КА, ERP

Анализ учета Анализ продаж Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

ABC-анализ — метод, позволяющий классифицировать ресурсы фирмы по степени их важности. Отличный отчет для анализа выручки и продаж! Может применяться в сфере деятельности любого предприятия. В его основе лежит принцип Парето — 20% усилий обеспечивают 80% результата.

6000 руб.

26.06.2022    11353    16    6    

19

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

Загрузка и выгрузка в Excel Регламентированный учет и отчетность Анализ учета БДР, БДДС Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Инструмент является симбиозом базового функционала Excel с возможностью получения и использования данных 1С для конструирования произвольных отчетов. Область применения - от простого получения нескольких контрольных сумм по типу "Отчет руководителю", до составления сложных аналитических отчетов всех видов учета.

12000 руб.

08.02.2021    19662    12    66    

28

Сверка остатков товаров БУХ3 - УТ11

Анализ учета Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Платные (руб)

Обработка позволяет сравнивать количественные остатки номенклатуры между Бухгалтерия 3.0 и УТ 11.5

3600 руб.

06.02.2023    4130    6    1    

11

Сверка документов между 1С:УНФ и 1С: Бухгалтерией 8

Перенос данных 1C Анализ учета Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

"Сверка документов" используется для проверки расхождений по документам в 1С:УНФ и 1С: Бухгалтерия 8.

7920 руб.

19.04.2022    9798    6    8    

8

Сверка данных УНФ - БУХ по документам и по долгам

Взаиморасчеты Анализ учета Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Обработка позволяет сравнивать по документам и сверять по долгам покупателей и поставщиков между базами УНФ 1.6, УНФ 3.0 и Бухгалтерия 3.0,

6000 руб.

24.08.2022    6341    4    0    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 1802 22.10.23 18:49 Сейчас в теме
Имхо, зря к строке приводите. Лучше использовать XMLСтрока(), тогда ссылки будут сравнивать по гуид, а не по представлению
Matveev_VS; 0x00; ivanov660; +3 Ответить
2. John_d 5425 23.10.23 11:36 Сейчас в теме
Процедура ПередЗаписью(Отказ)       	
	Если ЭтотОбъект.Контрагент<>ЭтотОбъект.Ссылка.Контрагент Тогда   
		//Писать в периодически регистр с  измерение ДокСсылка ресурс Изменен=Истина;	
	КонецЕсли;			
КонецПроцедуры

Можно написать проверку по всем реквизитам документа из Метаданные.Документы.Док
3. dkoder 5 25.10.23 09:10 Сейчас в теме
Идея хорошая, тоже подумывал про хэш.

1. Не понял зачем получать объект по ссылке. Можно же из ссылки все получить.
2. Нужно не просто похожие конфигурации. Нужно что бы последовательность реквизитов в метаданных была одинакова, а то хэш разъедется. Думаю надо сначала в таблицу значений метаданные реквизитов загнать и отсортировать. (под спойлером не увидел ;))
3. Ну и самый главный минус - формирование хэш`ей в цикле, что очень долго. При этом надо формировать в каждой базе. Думаю лучше кэширование хэшей делать в регистре сведений.

Я пришел к следующей схеме:
- формирую по метаданным запросы. (1. у меня ГУИД`ы не совпадают, поэтому ГУИД из другой базы храню в отдельном месте, но если ГУИД`ы совпадают в БД и использую в тексте запроса УНИКАЛЬНЫЙИДЕНТИФИКАТОР(), то гораздо проще)(2. есть нюанс формирования запроса, нужно приводить типы, что бы типизировать колонку таблицы значений, что то типа ВЫРАЗИТЬ(Док.Дата КАК ДАТА) КАК Дата).
- выгружаю в таблицы значений ТЗДок, ТЗДокТЧТаб1, ТЗДокТЧТаб2,...
- далее или ЗначениеВСтрокуВнутр, или ЗначениеВФайл - получаем данные в строковом виде
- передаем - получаем строку в другой БД (я через HTTP сервис гоняю), и восстанавливаем в таблицы значений
- далее по колонкам таблиц формирую запросы в которых сразу подгружаю таблицы значений и делаю проверку с данными БД (обычно через свертку)

например, справочник номенклатура ~100'000 позиций по 6 реквизитам проверяется за 20 секунд (измененые и новые элементы)
Оставьте свое сообщение