Имя: Пароль:
1C
1С v8
Сравнение двух таблиц значений
0 Штурман
 
04.03.15
04:56
Есть две ТЗ, в которых некоторые значения первых колонок совпадают.
Надо их сравнить.
Пишу кодом так:

    для каждого з из НовТЗ цикл
        для каждого с из ТЗпу цикл
            если з.Физлицо = с.Физлицо тогда
                сообщить(з.Физлицо);
            конецесли;
        конеццикла;
    конеццикла;

Почему-то сообщает только одно физлицо, хотя ТЗ содержит кучу строк
Что не так в коде?
1 anaed
 
04.03.15
05:29
только 1 физлицо совпадает?
2 Штурман
 
04.03.15
05:53
(1) выводит только одно физлицо, хотя по факту там очень много физлиц сопадает

отладчиком смотрел, почему-то только один проход делает, типа взяло первое физлицо из первой ТЗ, и ищет его во второй ТЗ и все, а остальных не ищет
3 Dilgorp
 
04.03.15
05:54
(2) может тогда запросом, чем цикл в цикле?
4 anaed
 
04.03.15
05:56
(2) может быть код все же отличается от приведенного в (0)?
5 patria0muerte
 
04.03.15
05:57
Странно. Попробуй по другому. Что то типа:

СтруктураПоиска = Новый Структура("Физлицо");

Для Каждого СтрокаПоиска Из НовТЗ Цикл
    
    СтруктураПоиска.Физлицо = СтрокаПоиска.Физлицо;
    
    НайденныеСтроки = ТЗпу.НайтиСтроки(СтруктураПоиска);
    
    Если НайденныеСтроки.Количество > 0 Тогда
        
        Сообщить("Дубль: " + СтрокаПоиска.Физлицо)
        
    КонецЕсли;
    
КонецЦикла;
6 anaed
 
04.03.15
05:58
(5) лучше уж запросом
7 patria0muerte
 
04.03.15
05:58
Или в своем протрассируй чем то типа:
Сообщить("" + з.Физлицо + " : " + с.Физлицо);
8 Dilgorp
 
04.03.15
05:58
ВЫБРАТЬ
  НовТЗ.Физлицо
ПОМЕСТИТЬ НовТЗ
ИЗ
  &НовТЗ КАК НовТЗ
;

ВЫБРАТЬ
  ТЗпу.Физлицо
ПОМЕСТИТЬ ТЗпу
ИЗ
  &ТЗпу КАК ТЗпу
;
ВЫБРАТЬ
  НовТЗ.Физлицо
ИЗ
  НовТЗ КАК НовТЗ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗпу КАК ТЗпу
    ПО НовТЗ.Физлицо = ТЗпу.Физлицо
9 patria0muerte
 
04.03.15
05:59
По любому там половина - строки а не ссылки, или еще какой нибудь подобный косяк.
10 Штурман
 
04.03.15
05:59
(3) (6) не, запросом не охота, придется много таблиц значений через менеджер временных таблиц перегонять в запрос, а там уже сравнивать, много кода писать придется, хотелось бы просто через сравнение друх ТЗ
11 Штурман
 
04.03.15
05:59
(5) сейчас попробую
12 Штурман
 
04.03.15
06:01
(5) выдает ошибку:

{Форма.Форма.Форма(115)}: Поле объекта не обнаружено (Количество)
        Если НайденныеСтроки.Количество > 0 Тогда
13 Dilgorp
 
04.03.15
06:02
(12)Количество()
14 patria0muerte
 
04.03.15
06:02
(12) Ну блин... скобки я забыл поставить.. это не поле, а метод...
15 Штурман
 
04.03.15
06:03
(7) выдало одного и того же сотрудника в одну строку два раза
типа
Иванов Иванов
16 Штурман
 
04.03.15
06:03
(14) вывело только одну строку:

Дубль: Иванов
17 Штурман
 
04.03.15
06:04
(4) код не отличается, в (0) вставил копипастом
18 Dilgorp
 
04.03.15
06:04
(16) тогда точно (9)
19 Штурман
 
04.03.15
06:07
(18) ну если написать так:

для каждого з из НовТЗ цикл
        для каждого с из ТЗпу цикл
            если Строка(з.Физлицо) = Строка(с.Физлицо) тогда
                //сообщить(з.Физлицо);
                Сообщить("" + з.Физлицо + " : " + с.Физлицо);
            конецесли;
        конеццикла;
    конеццикла;

то все-равно одного человека выводит
20 patria0muerte
 
04.03.15
06:09
(19) Ты глазками в таблички посмотри, мышкой там потыкай, типы данных посмотри, и полюбому сам все сразу поймешь...
21 Штурман
 
04.03.15
06:16
(20) хочешь сказать, что первые колонки в обоих ТЗ должны быть одного типа?

Дописал так:
...
ОписаниеФизлица = Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица");
тз.Колонки.Добавить("Физлицо", ОписаниеФизлица);
...
и тд
22 Штурман
 
04.03.15
06:22
Еще раз сейчас взял, посмотрел отладчиком

Точку останова поставил на

если Строка(з.Физлицо) = Строка(с.Физлицо) тогда

В табло смотрю
з.Физлицо - Значение Иванов, Типа - Справочник физлиц
с.Физлицо - Значение Петров, Типа - Справочник физлиц

т.е. типы совпадают

Только вот в процессе отладки, видно, что з.Физлицо все время одно значение висит - одно физлицо Иванов, и не меняется практически

А вот с.Физлицо постоянно меняется, типа Иванов, Петров, Сидоров и т.д

Получается, что цикл обходит только вторую ТЗ, а первую нет, и берет из первой ТЗ только одно физлицо и сравнивает с остальными, а когда совпало, прекращает работу, вместо того, чтобы взять из первой ТЗ еще одно физлицо для сравнения
23 Штурман
 
04.03.15
06:24
А все, товарищи, разобрался :)

Оказалось, в первой ТЗ было только одно физлицо, а остальных не заполнил :)
24 Штурман
 
04.03.15
06:24
Всем спасибо
25 чувак
 
04.03.15
06:27
(23) ну ты иш ты йоб
26 patria0muerte
 
04.03.15
06:28
(23) Ты это, высыпайся почаще, товарищь...
Ошибка? Это не ошибка, это системная функция.