Сравнение двух различных Таблиц значений с общими колонками

09.03.20

Разработка - Универсальные функции

Возникла задача сравнить две таблицы значений по настраиваемому списку колонок и вывести сопоставление в различиях не только по позициям сравнения, но и на факт отсутствия данных строк.

Часто возникает задача по сравнению двух таблиц значений и очень много информации об этом в интернете, но вот я решил предоставить свой вариант, возможно, что кому-либо это пригодится.

К примеру, есть необходимость сравнить список товаров в заказе покупателя и в документе приобретения товаров и услуг не только на факт расхождения количества, но и на наличие или отсутствие номенклатуры

Для этого вызываем процедуру

......
    СписокТоваровПриобретения = ДокументПриобретенияюТовары.Выгрузить();
    СписокТоваровВЗаказе = ДокументЗаказа.Товары.Выгрузить();

	ДанныеРезультата = ВыполнитьСравнениеДвухТаблицЗначений(СписокТоваровПриобретения,СписокТоваровВЗаказе, "Номенклатура");
	
	Если ДанныеРезультата.ИдентичныеТаблицы ТОгда
		Возврат;
	КонецЕсли;
	Результат.Вставить("ТаблицаРасхождений",ДанныеРезультата.ТаблицаРасхождений);
.....

 


Функция ВыполнитьСравнениеДвухТаблицЗначений(ТаблицаБазовая, ТаблицаСравнения, СписокКолонокСравнения) Экспорт
	
 	СписокКолонок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СписокКолонокСравнения,",",Истина);
	//Результирующая таблица
	ВременнаяТаблица = Новый ТаблицаЗначений;
	Для каждого Колонка из СписокКолонок Цикл
		ВременнаяТаблица.Колонки.Добавить(Колонка);
		ВременнаяТаблица.Колонки.Добавить(Колонка+"Сравнение");
	КонецЦикла;	
	ВременнаяТаблица.Колонки.Добавить("НомерСтр");
	ВременнаяТаблица.Колонки.Добавить("НомерСтр"+"Сравнение");
	//---------
	СравниваемаяТаблица = ТаблицаСравнения.Скопировать();
	СравниваемаяТаблица.Колонки.Добавить("УжеИспользуем",Новый ОписаниеТипов("Булево"));
	
	Для каждого Строка из ТаблицаБазовая Цикл
		НоваяСтрока = ВременнаяТаблица.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
		НоваяСтрока.НомерСтр = Строка.НомерСтроки;
		//формируем структуру для поиска по заданному сопоставлению
		ОтборДляПоискаСтрок = Новый Структура("УжеИспользуем",Ложь);
		Для каждого Колонка из СписокКолонок Цикл
			ОтборДляПоискаСтрок.Вставить(Колонка,Строка[Колонка]);
		КонецЦикла;
		
		НайдемСтроки = СравниваемаяТаблица.НайтиСтроки(ОтборДляПоискаСтрок);
		Если НайдемСтроки.Количество()>0 Тогда
			СтрокаСопоставления = НайдемСтроки[0];
			НоваяСтрока.НомерСтрСравнение = СтрокаСопоставления.НомерСтроки;
			Для каждого Колонка из СписокКолонок Цикл
				  Реквизит = Колонка+"Сравнение";
				  НоваяСтрока[Реквизит] = СтрокаСопоставления[Колонка];
			КонецЦикла;
			СтрокаСопоставления.УжеИспользуем = Истина;  
		КонецЕсли;
	КонецЦикла;
	//Смотрим что осталось +++
	ОтборДляПоискаСтрок = Новый Структура("УжеИспользуем",Ложь);
	НайдемСтроки = СравниваемаяТаблица.НайтиСтроки(ОтборДляПоискаСтрок);
	Для каждого Строка из НайдемСтроки Цикл
		НоваяСтрока = ВременнаяТаблица.Добавить();
		НоваяСтрока.НомерСтрСравнение = Строка.НомерСтроки;
		Для каждого Колонка из СписокКолонок Цикл
			  Реквизит = Колонка+"Сравнение";
			  НоваяСтрока[Реквизит] = Строка[Колонка];
		КонецЦикла	
	КонецЦикла;
	//Проверяем что получилось
	ТаблицыИдентичны = Истина;
	Для каждого Строка из ВременнаяТаблица Цикл
		Для каждого Колонка из СписокКолонок Цикл
			Если (Не ЗначениеЗаполнено(НоваяСтрока[Колонка])) ИЛИ (Не ЗначениеЗаполнено(НоваяСтрока[Колонка+"Сравнение"])) ТОгда
				ТаблицыИдентичны = Ложь;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		Если Не ТаблицыИдентичны ТОгда
			Прервать;
		Конецесли;
	КонецЦикла;
	
	Возврат Новый Структура("ИдентичныеТаблицы,ТаблицаРасхождений",ТаблицыИдентичны,ВременнаяТаблица);
КонецФункции

 

В случае если таблицы идентичные, то получаем полную таблицу соответствия по указанным колонкам или таблицу расхождений:

 

сравнение двух таблиц значений по различным колонкам

См. также

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    31282    dimanich70    83    

152

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    5039    6    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    35384    atdonya    29    

62

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    6655    ke.92@mail.ru    17    

66

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    18278    YA_418728146    8    

172

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

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

2 стартмани

22.08.2023    4889    80    progmaster    11    

4

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

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    19961    191    sapervodichka    113    

137
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. simonovich 10.03.20 14:12 Сейчас в теме
Вах, зачэм так сложно ?!

Делай раз: Приводим таблицы к общей структуре.
Делай два: Сортируем идентично.
Делай три: Возврат ЗначениеВстрокуВнутр(Таблица1) = ЗначениеВстрокуВнутр(Таблица2);
2. vik070777 275 10.03.20 14:47 Сейчас в теме
(1) Этот Вариант хорош если
1. Вы знаете структуру таблицы;
2. Если Вам нужен ответ только на вопрос одинаковые они или нет?
А если нужно еще различие и не только по количественным полям, а к примеру по Номенклатуре, или по Номенклатуре и количеству?
3. Cyberhawk 135 12.03.20 11:33 Сейчас в теме
Использую универсальный способ из пункта 3.1 отсюда: https://infostart.ru/public/326983/
4. vik070777 275 12.03.20 12:07 Сейчас в теме
(3) Да видел, но если добавить сюда код преобразования таблиц к одинаковому виду, чтоб поля были только необходимые то в принципе тоже самое и получим.
Оставьте свое сообщение