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

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С:Предприятие 8 1С 8.3 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"!

29280 руб.

27.03.2025    69483    41    29    

54

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

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

21.10.2017    98381    405    SergeyMordvin    177    

357

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

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

6100 руб.

06.02.2023    6597    33    4    

35

Зарплата Печатные формы Анализ учета Бухгалтер 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ Платные (руб)

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

12200 руб.

15.10.2025    2474    2    25    

6

Перенос данных 1C Анализ учета Бухгалтер 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

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

8052 руб.

19.04.2022    12000    9    10    

14

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

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

6100 руб.

26.06.2022    15063    24    8    

29

SALE! 50%

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

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

12200 6100 руб.

08.02.2021    24056    16    78    

33

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

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

13216 руб.

19.11.2024    2408    10    1    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 2100 22.10.23 18:49 Сейчас в теме
Имхо, зря к строке приводите. Лучше использовать XMLСтрока(), тогда ссылки будут сравнивать по гуид, а не по представлению
Matveev_VS; 0x00; ivanov660; +3 Ответить
2. John_d 6082 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 секунд (измененые и новые элементы)
Для отправки сообщения требуется регистрация/авторизация