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

01.03.25

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

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

 

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

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

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

 

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

 

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

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

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

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

 

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

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

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

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

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

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

	КонецЦикла;  

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

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

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

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

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

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

 

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

 

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

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

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

28800 руб.

27.03.2025    49125    28    22    

39

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

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

8500 руб.

21.10.2017    96397    392    174    

349

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

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

84800 руб.

20.02.2024    5448    12    4    

13

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

Инструмент "Расширенная экспресс-проверка" можно использовать в дополнение к типовой проверке, он ответит на вопросы, всё ли у вас хорошо в учёте и готовы ли вы к сдаче отчётности

13000 руб.

19.11.2024    1578    8    1    

9

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

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

6000 руб.

06.02.2023    5991    27    4    

30

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

Расширение автоматически анализирует управленческий учёт 1С:УНФ, помогает находить и исправлять ошибки, а также проверять те места, которые хорошо бы проверить. Разработка для тех, кто хочет построить управленческий финансовый учет в УНФ.

15000 руб.

28.07.2022    11606    15    26    

33

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

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

6000 руб.

26.06.2022    14390    22    8    

27

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

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

3000 руб.

28.08.2020    24750    30    51    

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

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

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

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

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