Имя: Пароль:
1C
1С v8
Как сравнить на идентичность две ТЗ?
0 Гений 1С
 
гуру
20.06.13
14:24
Есть две таблицы значений. Как сравнить их на идентичность.
Причем порядок строк может быть разный?

Я думаю сделать так:
1. Проверяем что колонки совпадают. Если нет - РАЗНЫЕ.
2. Сортируем по всем колонкам.
3. Идем по каждой строчке. Если встречаем расхождение - РАЗНЫЕ и прерываем.
4. Если дошли до конца, то ИДЕНТИЧНЫЕ.

Есть метод попроще?
ЗначениеВСтрокуВНутр почемуто даже для отсортированных разные значения показывает...

Вот как-то так.
1 1Cv8_accepted
 
20.06.13
14:26
(0) О, какие люди! )) Запросы в голову не приходят?
2 fmrlex
 
20.06.13
14:29
(0) Нда. Я тоже за запрос.
3 Песец
 
20.06.13
14:30
Скопипастить из типовой соответствующую функцию не предлагать.
4 Гений 1С
 
гуру
20.06.13
14:39
(1) (2) а если ТЗ не типизированная. Запрос не скушает, гыгыгы...
5 Гений 1С
 
гуру
20.06.13
14:39
(3) выложи ее сюды, фили
6 Рэйв
 
20.06.13
14:40
Если ЗначениеВСтроку(ТЗ1)=ЗначениеВСтроку(ТЗ2) Тогда
   Сообщить("О чудо!Они одинаковые!");
КонецЕсли;
7 mozzga
 
20.06.13
14:42
берем первую строку таблицы1 и ищем подобную в таблице2, если нет то <>
8 Рэйв
 
20.06.13
14:42
(0)>>ЗначениеВСтрокуВНутр почемуто даже для отсортированных разные значения показывает.

Так не бывает
9 Ненавижу 1С
 
гуру
20.06.13
14:43
1. Проверяем что колонки совпадают. Если нет - РАЗНЫЕ.
2. Добавляем в одну из них (или ее копию) поле Флаг, проставляем его равным 1
3. Добавляем из второй строки, но с флагом -1.
4. сворачиваем с суммированием по флагу.
5. если есть ненулевые флаги, то разные
10 Песец
 
20.06.13
14:43
(5) Я как раз и написал, чтоб не выкладывали, а то неинтересно будет :)
11 Песец
 
20.06.13
14:43
// Функция выполняет сравнение двух коллекций строк, для которых доступен обход
// посредством оператора Для каждого … Из … Цикл.
// Сравниваемые коллекции должны отвечать следующим требованиям:
//    - доступен обход посредством оператора Для каждого … Из … Цикл,
//    - наличие в обеих коллекциях всех колонок, перечисленных в параметре ИменаКолонок
//  (если ИменаКолонок не заполнен - всех колонок)
//
// Параметры:
//    КоллекцияСтрок1 - коллекция, отвечающая вышеописанным требованиям
//    КоллекцияСтрок2 - коллекция, отвечающая вышеописанным требованиям
//    ИменаКолонок    - строка, разделенная запятыми - имена колонок,
//                        по которым производится сравнение.
//                        Не является обязательным для коллекций,
//                        состав колонок которых можно выявить:
//                        ТаблицаЗначений, СписокЗначений, Соответствие, Структура,
//                        если не указан - сравнение производится по всем колонкам.
//                        Для коллекций других типов является обязательным
//    ИсключаяКолонки    - имена колонок, которые игнорируются при сравнении, необязательный
//    УчитыватьПоследовательностьСтрок - булево, если Истина, то коллекции признаются
//                        идентичными только если одинаковые строки размещены
//                        в коллекциях на одинаковых местах
//
Функция КоллекцииИдентичны(КоллекцияСтрок1, КоллекцияСтрок2, ИменаКолонок = "", ИсключаяКолонки = "", УчитыватьПоследовательностьСтрок = Ложь) Экспорт
12 Лефмихалыч
 
20.06.13
14:44
1. Пройтись по колонкам, проверить, чтобы одинаковые были. Параллельно собрать строки с описанием полей запроса и описанием полей соединения
2. Засунуть в случае совпадения колонок обе ТЗ в запрос
3. соединить полным соединением на (Есть NULL или <>)
4. Если не Результат.Пустой() Тогда не совпадают
13 1Cv8_accepted
 
20.06.13
14:45
(0), (9) Тогда уж сортируй хотя бы, и перед основным циклом сравни количества колонок и записей, например...
14 Deon
 
20.06.13
14:46
(12) а если в одной таблице есть 2 полностью одинаковые строки?
15 Лефмихалыч
 
20.06.13
14:46
или даже - обе в запрос и в запросе добавить флаг, который суммировать, сгруппировав объединение таблиц). Тоже вариант.
16 vde69
 
20.06.13
14:47
можно так http://infostart.ru/public/68432/ хотя это не быстро будет...
17 Лефмихалыч
 
20.06.13
14:47
(14) а, ну да, доподнительным пакетом выбрать Количество(ВТ1.*), Количество(ВТ2.*) и сравнить
18 acsent
 
20.06.13
14:47
сериализация в xml
19 Aprobator
 
20.06.13
14:48
(18) при разной сортировке?
20 patapum
 
20.06.13
14:49
(0)
1. если колонки совпадают, то
2. добавить колонку Количество, в первой ТЗ заполнить единицами.
3. добавить строки второй таблицы, количество заполнять минус единицами.
4. свернуть
5. бежать циклом, если нашли не ноль, значит не совпали
зы. если предполагается в исходных наличие повторов, свернуть обе перед началом п.1
21 Deon
 
20.06.13
14:50
(20) прикольно
22 Aprobator
 
20.06.13
14:56
(0)
1. Согласен.
2. Проверяем количество строк в таблицах - не солвпадает - разные
3. Запомним где нить количество строк любой таблицы. Формируем таблицу с идентичной структурой и пишем туда обе 4.таблицы.
5. Сворачиваем полученную таблицу по всем колонкам.
6. Количество строк в полученной таблицы отличается от пункта 3 - РАЗНЫЕ, иначе - ПРОФИТ!
23 Aprobator
 
20.06.13
14:58
хотя, если возможны дули строк - не взлетит.
24 Aprobator
 
20.06.13
14:59
дубли )
25 patapum
 
20.06.13
15:00
(22) +100
(24) свернуть обе перед началом
26 acsent
 
20.06.13
15:01
(19) при одинаковой конечно. xml сериализация уберет ненужные иденитфикаторы
27 Aprobator
 
20.06.13
15:04
хм - надо будет взять на заметку.
28 lamesnake
 
20.06.13
15:15
(22) (25) А если в одной таблице одна строка задублирована, а в другой - другая?
29 Ненавижу 1С
 
гуру
20.06.13
15:30
(20) ты же спер из (9)
30 luns
 
20.06.13
15:57
в вакууме не очень интересно решать. не известно большие ли таблицы и прочее.
ну а так, я за запрос, так как можно сразу и отличающиеся строки на выходе поймать, чтобы что то с ними сделать.
я давненько вроде так движения сравнивал.
31 Гений 1С
 
гуру
20.06.13
18:00
(20) о да, это известный метод, гыгыгы
32 exwill
 
20.06.13
18:32
(0) Вычислить CRC для каждой таблицы.
33 mehfk
 
20.06.13
18:45
(32) напиши Нуралиеву или на инфастард, чтобы замутили ф-цию глобального контекста вычислитьцрц32объекта() и до кучи вычислитьмд5объекта().

а по сути - сортировка может не совпадать - че делать?
34 Cyberhawk
 
20.06.13
18:46
А каковы критерии идентичности исходных ТЗ?
35 exwill
 
20.06.13
18:51
(33) Сначала отсортировать, потом вычислить.
Хороший метод для Гения.
36 mehfk
 
20.06.13
18:59
(35)А для того чтобы одинэсник мог извратиться как хочет в сортировке в методе Сортировать() предусмотреть второй параметр, который передает ссылку на ф-цию сортировки :)
37 mistеr
 
20.06.13
19:02
(34) Гениев это не волнует.
38 mehfk
 
20.06.13
19:03
(36) fix не сортировки, а сравнения
39 mistеr
 
20.06.13
19:04
(34) Строго говоря, "идентичны" означает ссылки на одну и ту же ТЗ. Можно говорить о равенстве или эквивалентности. Но опять же, кого это волнует.
40 Cyberhawk
 
20.06.13
19:07
(39) давай введем характеристики ТЗ: число столбиков, число строк, типы столбиков, порядок строк. Все эти хар-ки должны быть идентичными? Или наоборот: равенство двух ТЗ по этому набору хар-к позволяет говорить об идентичности двух ТЗ? Или набор хар-к какой-то другой?
41 MaxS
 
20.06.13
19:10
Как запросом сравнить, если в ТЗ несравниваемые типы данных?
Например, строка длиной 0, другое ТЗ, хранилищезначения с дистрибутивом Windows одной версии, но разных релизов.
Или внешне одинаковые картинки, но разной компрессии. И т.д. и т.п.
42 romix
 
20.06.13
19:11
Первая таблица

ААА 1
БББ 1
ЦЦЦ 1

Вторая таблица

ААА -1
БББ -1
ХХХ -1

Дописывание второй таблицы в конец первой и свертка (Свернуть) дает нули там где идентичное и +1/-1 там где расхождения.
43 mehfk
 
20.06.13
19:13
(42) У меня в первой таблице в первойсправочник
44 mehfk
 
20.06.13
19:16
"Сотрудники" а во второй "ФизЛица". Представление одинаковое. Но у васи пупкина наименование вася пупкин, а фио на 1 января 2001 года вася иванов. Как сравнивать?
45 Посмотрим
 
20.06.13
19:28
(44) при чем тут это? Задача другая стоит
46 Ковычки
 
20.06.13
19:29
(8) существует еще формат колонок и их имена
47 Посмотрим
 
20.06.13
19:29
в (9) уже ответ дан, чего мусолите?
48 ice777
 
20.06.13
20:00
(47) мне в (12) от левмихалыча больше импонирует отчего-то.
Так забавнее.
49 EvgeniuXP
 
20.06.13
20:40
(44) от сотрудника взять владельца (ФизЛицо) и сравнивай.
50 Эмбеддер
 
20.06.13
20:44
как вариант без заморочек, можно делать так: значения помещаем в одну таблицу. поля, по которым группируем - без изменений, а количества, суммы и т.п. делаем разными колонками (например сумма_1, сумма_2, количество_1 и количество_2). потом если свернуть, то достаточно проверить что сумма_1=сумма_2 и т.д
правда, применяю не для проверки равенства таблиц, но для таблиц тоже подойдет
51 Эмбеддер
 
20.06.13
20:45
вариант (9) конечно лучше