Задача 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"
Примечание: следует иметь в виду, что в запросе не учитывается регистр букв в строковых значениях