Имя: Пароль:
1C
 
как проще всего сравнить 2 таблицы
0 Сергиус
 
27.06.11
11:13
Необходимо определить, что две таблицы полностью идентичны(т.е. у них совпадает каждый соответствующий элемент каждой строки). Каким способом, кроме перебора сравнения по-элементно, это можно сделать наиболее правильно и элегантно?
1 Ненавижу 1С
 
гуру
27.06.11
11:14
(0) таблице в бд? тогда запросом
2 Лефмихалыч
 
27.06.11
11:14
запросом
3 Сергиус
 
27.06.11
11:15
А что именно сравнивать в запросе?
4 Ненавижу 1С
 
гуру
27.06.11
11:15
если это табзнач, то добавить колонку и добавить все строки второй таблицы к первой, при этом в доп. колоке первой установить 1, а у второй -1, свернуть, если будут <>0, то есть различия
5 Ненавижу 1С
 
гуру
27.06.11
11:15
(3) поля
6 Лефмихалыч
 
27.06.11
11:17
(3) таблицы. Сюрприз?
PS А что ты делал 3 г. 3 мес. ?
7 Ненавижу 1С
 
гуру
27.06.11
11:18
(6) смотря где делал
8 Лефмихалыч
 
27.06.11
11:19
(7) судя по темам - в восьмерке
9 Сергиус
 
27.06.11
11:20
(6) я понимаю что таблицы. Просто в каждой таблице по 20 полей. Нужно каждое из этих 20-ти полей сравнить друг с другом в запросе?

p.s. Ты хочешь сказать, что сравнение таблиц такая часто встречающаяся задача?
10 Сергиус
 
27.06.11
11:21
(4) Сделать свертку по 20-ти полям..?
11 Лефмихалыч
 
27.06.11
11:21
(9) Да, нужно полное соединение по условию совпадения всех полей
Любой запрос с соединением 2 и более таблиц - это по сути сравнение таблиц.
12 Сергиус
 
27.06.11
11:23
(11) понятно..
13 Сергиус
 
27.06.11
11:24
В любом случае спасибо за советы Всем.
14 Fragster
 
гуру
27.06.11
11:24
сохранить в mxl, а потом сравнить через файл-сравнить файлы
15 ВераТ
 
27.06.11
11:25
функция типовой не подойдет?

// Функция сравнивает две таблицы значений на идентичность структуры и данных
//
// Параметры
//  ТаблицаЗначений1 - ТаблицаЗначений для сравнения
//  ТаблицаЗначений2 - ТаблицаЗначений для сравнения
//
// Возвращаемое значение:
//   Булево, идентичны или нет две таблицы
//
Функция СравнитьТаблицыЗначений(ТаблицаЗначений1, ТаблицаЗначений2)

в общем модуле УправлениеКонтактами
16 Сергиус
 
27.06.11
11:27
(15) то, что надо, спасибо!
17 73
 
27.06.11
11:28
(11) ТЗ с дублями запросом не сравнить...
18 НЕА123
 
27.06.11
11:31
(17)
НомерСтроки вроде есть.
19 73
 
27.06.11
11:32
(1*) У ТЧ есть, у ТЗ - нет.
20 73
 
27.06.11
11:32
(19) -> (18)
21 НЕА123
 
27.06.11
11:32
(16)
кишки функции глянь. пойдет?
22 Ненавижу 1С
 
гуру
27.06.11
11:33
(17) а если через объединение и группировку подобно (4) ?
23 Сергиус
 
27.06.11
11:35
(21) похоже на правду.
24 Сергиус
 
27.06.11
11:36
Взял из типовой бух:

Функция СравнитьТаблицыНаборовЗаписей(ТаблицаЗначений1, ТаблицаЗначений2) Экспорт

   Если ТипЗнч(ТаблицаЗначений1) <> Тип("ТаблицаЗначений") ИЛИ ТипЗнч(ТаблицаЗначений2) <> Тип("ТаблицаЗначений") Тогда
       Возврат Ложь;
   КонецЕсли;
   
   Если ТаблицаЗначений1.Количество() <> ТаблицаЗначений2.Количество() Тогда
       Возврат Ложь;
   КонецЕсли;

   Если ТаблицаЗначений1.Колонки.Количество() <> ТаблицаЗначений2.Колонки.Количество() Тогда
       Возврат Ложь;
   КонецЕсли;
   
   // Проверим поля
   Для каждого Колонка Из ТаблицаЗначений1.Колонки Цикл
       Если ТаблицаЗначений2.Колонки.Найти(Колонка.Имя) = Неопределено Тогда
           Возврат Ложь;
       КонецЕсли;
   КонецЦикла;
   Для каждого Колонка Из ТаблицаЗначений2.Колонки Цикл
       Если ТаблицаЗначений1.Колонки.Найти(Колонка.Имя) = Неопределено Тогда
           Возврат Ложь;
       КонецЕсли;
   КонецЦикла;
   
   // сформируем строку индекса для оптимизации поиска по таблице значений
   СтрокаИндекса = "";
   Для каждого Колонка Из ТаблицаЗначений1.Колонки Цикл
       Если СтрокаИндекса = "" Тогда
           СтрокаИндекса = Колонка.Имя;
       Иначе
           СтрокаИндекса = СтрокаИндекса+","+Колонка.Имя;
       КонецЕсли;
   КонецЦикла;
   // добавим индекс
   ТаблицаЗначений2.Индексы.Добавить(СтрокаИндекса);
   
   // Проверим записи
   Для каждого СтрокаТаблицы Из ТаблицаЗначений1 Цикл
       СтруктураПоиска = Новый Структура;
       Для каждого Колонка Из ТаблицаЗначений1.Колонки Цикл
           СтруктураПоиска.Вставить(Колонка.Имя, СтрокаТаблицы[Колонка.Имя]);
       КонецЦикла;
       СтрокиТаблицы2 = ТаблицаЗначений2.НайтиСтроки(СтруктураПоиска);
       Если СтрокиТаблицы2.Количество() <> 1 Тогда
           Возврат Ложь;
       КонецЕсли;
   КонецЦикла;
   
   // сформируем строку индекса для оптимизации поиска по таблице значений
   СтрокаИндекса = "";
   Для каждого Колонка Из ТаблицаЗначений2.Колонки Цикл
       Если СтрокаИндекса = "" Тогда
           СтрокаИндекса = Колонка.Имя;
       Иначе
           СтрокаИндекса = СтрокаИндекса+","+Колонка.Имя;
       КонецЕсли;
   КонецЦикла;
   // добавим индекс
   ТаблицаЗначений1.Индексы.Добавить(СтрокаИндекса);
   
   Для каждого СтрокаТаблицы Из ТаблицаЗначений2 Цикл
       СтруктураПоиска = Новый Структура;
       Для каждого Колонка Из ТаблицаЗначений2.Колонки Цикл
           СтруктураПоиска.Вставить(Колонка.Имя, СтрокаТаблицы[Колонка.Имя]);
       КонецЦикла;
       СтрокиТаблицы1 = ТаблицаЗначений1.НайтиСтроки(СтруктураПоиска);
       Если СтрокиТаблицы1.Количество() <> 1 Тогда
           Возврат Ложь;
       КонецЕсли;
   КонецЦикла;
   
   Возврат Истина;
   
КонецФункции // СравнитьТаблицыЗначений()
25 73
 
27.06.11
11:36
(22) Так получится. Соединением - нет.
26 Vbonivur
 
27.06.11
11:37
(0) Меню Файл -> Сравнить файлы ... думаю проще некуда
27 Лефмихалыч
 
27.06.11
11:40
(17) долго строки пронумеровать?
28 Сергиус
 
27.06.11
11:40
(26) какие файлы то сравнивать? речь идет о таблицах как об объектах 1с.
29 73
 
27.06.11
11:42
(27) Долго-недолго, но без этого (11) не будет работать.
ЗЫ. Существенное замечание.
30 73
 
27.06.11
11:46
И кстати, в (24):
индекс идентичных строк игнорируется;
дубли - не допускаются.
31 НЕА123
 
27.06.11
11:47
(29)
хз.
(24) автору понравилось. хотя там...
про дубли уж молчу.
32 73
 
27.06.11
11:59
(31) Ну да.
Сначала бы определиться поточнее: что есть полностью идентичные таблицы. И возможны ли в них дубли строк.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан