Имя: Пароль:
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), ну даже с этим все равно, просто результат который предоставился, не зная что было изменео, приходится пересматривать все поля, чтобы найти что же все таки разошлось. спс за информацию.
Закон Брукера: Даже маленькая практика стоит большой теории.