gifts2017

Универсальный способ сравнения таблиц

Опубликовал Пишу код как картины (yurii_host) в раздел Программирование - Практика программирования

На эту тему уже есть статьи, но этот способ нигде не описан. Хотя я его использую с тех пор, как занимаюсь программированием. Его преимущество в простоте и универсальности: можно применять на 1С, SQL, а также в любом другом языке программирования.

Задача 1. Проверить равенство таблиц.

Дано: две таблицы с идентичной структурой.

Требуется: проверить, что все значения в одной таблице совпадают со значениями в другой таблице. При этом разный порядок строк и/или порядок колонок различием не считается.

Решение:

1. Слить обе таблицы в одну

2. Добавить сверочную колонку. Заполнить ее числом 1 для строк первой таблицы и -1 для строк второй таблицы.

3. Свернуть, просуммировав сверочную колонку.

4. Если таблицы идентичны, то после свертки во всех строках значение в сверочной колонке будет 0

Функция ТаблицыИдентичны(знач Таблица1, Таблица2)
	
	// 1. Получаем список колонок
	ИменаКолонокГруппировки = "";
	Для каждого Колонка из Таблица1.Колонки Цикл
		ИменаКолонокГруппировки = ИменаКолонокГруппировки + Колонка.Имя + ",";
	КонецЦикла;
	ИменаКолонокГруппировки = Лев(ИменаКолонокГруппировки, СтрДлина(ИменаКолонокГруппировки)-1);
	
	// 2. Добавляем вспомогательную колонку
	ИмяКолонкиСуммирования = "__Сверка__";
	Таблица1.Колонки.Добавить(ИмяКолонкиСуммирования, Новый ОписаниеТипов("Число"));
	Таблица1.ЗаполнитьЗначения(-1, ИмяКолонкиСуммирования);
	
	// 3. Помещаем вторую таблицу в первую
	Для каждого Строка из Таблица2 Цикл
		НоваяСтрока = Таблица1.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
		НоваяСтрока[ИмяКолонкиСуммирования] = 1;
	КонецЦикла;
	
	// 4. Сворачиваем
	Таблица1.Свернуть(ИменаКолонокГруппировки, ИмяКолонкиСуммирования);
	
	// 5. Сверяем
	Отбор = Новый Структура(ИмяКолонкиСуммирования, 0);
	Возврат Таблица1.НайтиСтроки(Отбор).Количество() = Таблица1.Количество();
	
КонецФункции

Задача 2. Найти различия в таблицах.

Не буду приводить код, т.к. основная часть есть в предыдущей задачи. Очевидно, что различия будут содеражаться в свернутой таблице в строках, где значение в сверочной колонке будет не равно 0. При этом если значение отрицательное, значит строки содержатся только в первой таблице, положительное - только во второй таблице.

Задача 3. Найти различия в таблицах при помощи запроса.

Этот же принцип можно применять в запросах.

ТекстЗапроса = "
|ВЫБРАТЬ
|	сводно.Товар,
|	сводно.Количество,
|	СУММА(сводно.Сверка) КАК Сверка
|ИЗ
|	(ВЫБРАТЬ
|		т1.Товар КАК Товар,
|		т1.Количество КАК Количество,
|		-1 КАК Сверка
|	ИЗ
|		Таблица1 КАК т1
|	
|	ОБЪЕДИНИТЬ ВСЕ
|	
|	ВЫБРАТЬ
|		т2.Товар,
|		т2.Количество,
|		1
|	ИЗ
|		Таблица2 КАК т2) КАК сводно
|
|СГРУППИРОВАТЬ ПО
|	сводно.Товар,
|	сводно.Количество
|
|ИМЕЮЩИЕ
|	СУММА(сводно.Сверка) <> 0"

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

См. также

Подписаться Добавить вознаграждение
В этой теме еще нет сообщений.