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

18.09.16

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

На эту тему уже есть статьи, но этот способ нигде не описан. Хотя я его использую с тех пор, как занимаюсь программированием. Его преимущество в простоте и универсальности: можно применять на 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"

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

сравнить таблицы сравнение таблиц приемы хитрости методика теория

См. также

Универсальные функции Программист Платформа 1С v7.7 Россия Абонемент ($m)

В библиотеку собраны различные функции по работе с документами, журналами, типами данных, строками, датой и временем, таблицами значений, Excel, файлами, XML, JSON, Http-сервисами, SMTP серверами и т.п.

1 стартмани

22.12.2023    1229    14    user706545_kseg1971    0    

4

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Получение реквизитов контрагентов из 1С:Контрагент для старых конфигураций под 1с 7.7.

25.04.2022    2277    zhenyat    7    

7

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

Функция выводит таблицу значений в табличный документ. (v7.7) Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.

30.06.2021    4989    Zoltan_Black    11    

2

Универсальные функции Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Установка принтера по умолчанию в 1С 7.7. Обработка может быть полезна в том случае, когда нужно установить принтер по умолчанию, а доступа к рабочему столу нет (например, терминальный режим без рабочего стола или remoteApp)

1 стартмани

13.02.2019    13825    4    alsen    3    

5

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 1С:Комплексная 7.7 Абонемент ($m)

Предлагается набор функций 1с 7.7 для формирования строки json стандартными средствами.

1 стартмани

10.12.2018    10627    malovandrey    6    

19
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dock 44 21.03.18 10:10 Сейчас в теме
Конечно не "универсальный" способ, но очень интересный и красивый подход! однозначный плюс.
Кстати, очень даже помог! особенно вариант с запросом.
2. Alex_Iz 28.08.21 13:16 Сейчас в теме
Спасибо за отличную идею!
3. Иваныч 23 27.04.22 15:44 Сейчас в теме
Попробую для сравнения цен, возможно что выйдет. Плюс поставил
Оставьте свое сообщение