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

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 обмен похожи документ справочник найти поиск сравнение

См. также

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

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

7200 руб.

21.10.2017    87891    320    172    

288

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

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

12000 руб.

28.07.2022    9566    9    25    

27

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Анализ учета Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Данная обработка позволит Вам легко и просто, а главное - быстро, выполнить сравнение данных между ЛЮБЫМИ базами (и РИБ, по правилам конвертаций) по контрольным суммам выбранных объектов баз 1С, работающих на платформах 8.3 и выше. Удобный и понятный интерфейс в виде "мастера". Высокая скорость сравнения достигается за счет специального алгоритма расчета контрольной суммы объекта/записи и сравнения по данным суммам объектов 2х баз через файл. Имеется возможность выбора реквизитов, по которым система будет сравнивать объекты. Сравнение количества записей в движениях документов, возможность сравнивать данные по правилам конвертации и не только! Выбор объектов конфигурации для КАЖДОГО узла в отдельности с индивидуальным отбором для каждого объекта конфигурации, работа с FTP, сохранение или загрузка настроек, сохранение или загрузка результата сравнения, регистрация на обмен объекта и его движений. (Обновление от 12.11.2024, версия 2.2-2.5)

19200 руб.

27.10.2017    42369    25    13    

43

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

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

3600 руб.

06.02.2023    4703    15    3    

17

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

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

6000 руб.

24.08.2022    6762    7    1    

10

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

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

2500 руб.

28.08.2020    22568    26    50    

45

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

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

6000 руб.

26.06.2022    12279    17    6    

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