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

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 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Управленческий учет Платные (руб)

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

108900 руб.

20.02.2024    3670    8    1    

11

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

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

8500 руб.

21.10.2017    93145    359    173    

332

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

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

16800 руб.

27.03.2025    3916    12    11    

14

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

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

12500 руб.

19.11.2024    690    3    0    

4

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

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

15000 руб.

28.07.2022    10764    13    25    

31

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

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

6000 руб.

26.06.2022    13502    21    8    

26

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

Расширение «Контрольные отчеты» для автоматизации процесса проверки ведения учета в ПП. Со списком ошибок могут работать ответственные пользователи. Помогает в процессе внедрения ПП находить нарушения в бизнес-процессах. 

12000 руб.

08.08.2023    2789    4    3    

8

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

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

3600 руб.

06.02.2023    5343    19    4    

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