Имя: Пароль:
1C
1С v8
Сравнить 2 таблицы значений
0 diabolo
 
13.07.16
15:14
Добрый день. Подскажите как можно сравнить 2 таблицы значений чтобы выдавалось в итоге: строка1 пункт 1 1 таблицы не равен пункту 1 второй таблицы и т.д. Количество пунктов будет ограничено, аблица значений получается из ексель файла не отсортированого.
Пробовал запихнуть в запрос 2 таблицы и там сравнивать, но что то я не понял по чем и как связать между собой 2 таблицы. Чтобы потом просто проверять выбором если пункт 1_1 = пункту 1_2 тогда все ок, иначе несоответсвие. и выводить после всего только поля у которых несоотвествие, может есть проще варианты подскажите?
1 Зая Бусечка
 
13.07.16
15:15
Запрос, полное объединение по пункт_1
2 diabolo
 
13.07.16
15:19
(1) Что в итоге получим? на пункт 1 например 10 строк в первой таблице и на пункт 1 20 строк второй таблицы, плюс 6 строк второй таблицы совпадают польностью по всем другим полям с первой таблицей.
3 Зая Бусечка
 
13.07.16
15:20
(2) где не есть NULL
4 diabolo
 
13.07.16
15:59
(3) Что то в итоге получается? Какое поле не есть нут Пункт_1?
Слабовато я что то представляю :(
5 Serginio1
 
13.07.16
16:02
6 diabolo
 
13.07.16
16:12
(5) Там что то не понятное со знаками. Нужно пройти все записи 2-х таблиц и сравнить их построчно. причем 1 строка 1-й таблицы может совпадать с 99 строкой 2-й таблицы полностью, или отличатся одним или несколькими другими полями.
7 diabolo
 
13.07.16
16:14
(6) вот как именно понять что для 1 строки 1 таблицы соответствует 99 строка 2-й таблицы, причем значения первого пункта первой таблицы может совпадать с другими
строками этой же таблицы.
8 diabolo
 
13.07.16
16:22
Привожу пример:

Таблица1
НомерИзделия НомерДокумента Сумма

00001        1              500
00002        2              500
00001        3              400

Так как в процессе эти файлы могли измениться то мог поменятся и номер документа и сумма.

Таблица2
НомерИзделия2 НомерДокумента2 Сумма2

00001         5              501
00002         2              505
00001         3              400

В итоге должно быть найдено что 1 строка 1-й таблицы соответсвует 1-й строке 2-й таблицы (но это может быть и 99 строка), чтобы потом в итоге написать что по 1 строке был изменен номер документа и сумма, по 2-й строке сумма, по 3 ничего не изменилось
9 Ildarovich
 
13.07.16
16:40
(8) вам дали правильную ссылку. В терминологии той статьи "измерения" - это будет НомерИзделия. Таблицы будут стыковаться по значению в этой колонки.
То есть вызов должен быть таким:
РазницаТаблицЗначений(Таблица0, Таблица1, "НомерИзделия")
а сама функция может иметь вид:
Функция РазницаТаблицЗначений(Таблица0, Таблица1, Измерения) Экспорт
    
    ВсеКолонки = "";
    Для Каждого Колонка Из Таблица0.Колонки Цикл
        ВсеКолонки = ВсеКолонки + ", " + Колонка.Имя
    КонецЦикла;
    ВсеКолонки = Сред(ВсеКолонки, 2);
    
    Таблица = Таблица1.Скопировать();    
    
    Таблица.Колонки.Добавить("Знак", Новый ОписаниеТипов("Число"));
    
    Таблица.ЗаполнитьЗначения(1, "Знак");
    
    Для Каждого Строка Из Таблица0 Цикл ЗаполнитьЗначенияСвойств(Таблица.Добавить(), Строка) КонецЦикла;
    
    Таблица.Колонки.Добавить("Счёт");
    Таблица.ЗаполнитьЗначения(1, "Счёт");
    
    Таблица.Свернуть(ВсеКолонки, "Знак, Счёт");
    
    Ответ = Таблица.Скопировать(Новый Структура("Счёт", 1), ВсеКолонки + ", Знак");
    
    Ответ.Сортировать(Измерения);
    
    Возврат Ответ
    
КонецФункции
Она вернет список строк. Измененная строка будет записана под исходной.
10 diabolo
 
13.07.16
17:01
(9) Сделал по этому примеру. Для примера взял 3 строки в первой таблице и 2 строки в другой таблице, поменял во второй таблице в первой строке номер, во второй строке сумму. В итоге получил 5 строк 2 строки 1-й таблице со знаком один, 2 строки второй таблицы со знаком 0 и 5 строка 1 таблицы со знаком 0. Что поменялось неизвестно.
11 Ildarovich
 
13.07.16
17:26
Что же, оказалось, что форма представления результата вас не устраивает, можете переделать, информация о результатах сравнения вся в ответе есть:
Номер изделия    Номер документа    Сумма    Знак    
0001    000х    1    1    Это означает, что теперь строка для изделия "0001" такая
0001    0001    1        А была такая. Изменения видны друг под другом: старое значение снизу, новое сверху
0002    0002    х    1    
0002    0002    2        
0003    0003    3        Строка без пары означает, что этой строки в новой таблице нет. Она удалена.
12 Garykom
 
гуру
13.07.16
17:42
(0) Это случаем не какая то система мониторинга файликами екселя рассылаемыми?
13 Garykom
 
гуру
13.07.16
17:43
(12)+ Файликов то скоко всего 2 или их многа-многа? :)
14 ovrfox
 
13.07.16
18:04
Вообще то сравнить две таблицы (значений) не тривиальная операция. Когда -то делал для журналирования документа.
Общий алгоритм такой : выбираются ключевые поля сравнения (можно все), назначается вес сравнения для каждого поля (можно 1). Сравниваются ключевые поля каждой строки с каждой и подсчитывается число похожести. Естественно, после выбора первой пары, она удаляется из сравнения.
В конце получаем пары с некоим коэффициентом похожести. Пары с 0-вым или даже некоим положительным, но малым  коэффициентом считаются различными.
В моем случае все коэфициенты по 11 полям были 1, а по номенклатуре был 6. Если коэффициент был меньше 6 - то пара считалась различной. Таким алгоритмом достаточно точно определялись пары, сбоев не было замечено.
15 ovrfox
 
13.07.16
18:08
(14) забыл сказать, что после вычисления числа похожести для каждой пары строк, список сравнения упорядочивался по убыванию числа похожести и для пары, которая бралась первой, потом вычеркивались остальные строки сравнения, содержащие одну из строк.
16 diabolo
 
14.07.16
08:06
(11) спс что расписали, но порядок вывода строк был немного другой, о том что я писал в(10), ну даже с этим все равно, просто результат который предоставился, не зная что было изменео, приходится пересматривать все поля, чтобы найти что же все таки разошлось. спс за информацию.
Программист всегда исправляет последнюю ошибку.