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

09.03.20

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

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

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

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

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

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

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

 


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

 

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

 

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

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

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    2572    Abysswalker    7    

41

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5594    DeerCven    15    

57

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

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

21.05.2024    46811    dimanich70    83    

165

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

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

1 стартмани

18.03.2024    6931    6    John_d    13    

59

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

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

12.02.2024    58093    atdonya    31    

68

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

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

30.11.2023    8699    ke.92@mail.ru    17    

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

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