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

09.03.20

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

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

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

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

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

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

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

 


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

 

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

 

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

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

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

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

1 стартмани

18.03.2024    2653    0    John_d    8    

53

GUID в 1С 8.3 - как с ними быть

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

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

12.02.2024    4589    atdonya    22    

44

Переоткрытие внешних обработок

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

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

30.11.2023    3950    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8797    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2069    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 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    16138    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7241    quazare    8    

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

Делай раз: Приводим таблицы к общей структуре.
Делай два: Сортируем идентично.
Делай три: Возврат ЗначениеВстрокуВнутр(Таблица1) = ЗначениеВстрокуВнутр(Таблица2);
2. vik070777 293 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 293 12.03.20 12:07 Сейчас в теме
(3) Да видел, но если добавить сюда код преобразования таблиц к одинаковому виду, чтоб поля были только необходимые то в принципе тоже самое и получим.
Оставьте свое сообщение