Имя: Пароль:
1C
1С v8
Проверить строки ТЗ на дубли по значениям пары реквизитов
0 Dmitriy_
Kolesnikov
 
24.08.17
11:26
Когда надо проверить строки на дубли по значению одной колонки, я делаю так.
1. Создаю массив для элементов, которые не должны дублироваться
2. Обхожу ТЗ с последней строки, при этом ищу в новом массиве значение проверяемой колонки
3. Если значение в массиве найдено - удаляю текущую строку (потому что дубль). Если не найден - добавляю значение в массив имеющихся.

Теперь мне надо сравнить строки по дублированию пар значений (в двух колонках). То есть надо исключить ситуацию, когда в первой и второй колонке двух строк значения совпадают.
Какие вижу варианты:
1. При обходе создавать новую структуру, в неё добавлять два элемента: "ключ" первой - имя первой колонки, "ключ" второй - имя второй колонки, "значения" соответственно. Искать в массиве эту структуру. Если не найдена - добавлять её в массив.
2. При обходе создавать новое соответствие, в неё добавлять один элемент: "ключ" - значение первой колонки, "значение" - значение второй колонки. Дальше аналогично.

Какой вариант лучше?
Есть ли третий?

В таблицах мало строк будет (не больше 10)
1 Вафель
 
24.08.17
11:29
Запросом
2 Вафель
 
24.08.17
11:30
Это если номера строк нужны, если ненужны, то есть вариант попроще
3 lodger
 
24.08.17
11:39
ну если так хочется просто накодить...
0) копируем ТЗ1 в ТЗ2
1) запускаем цикл обхода строк ТЗ1
2) внутри 1) запускаем обход ТЗ2
3) считаем сколько раз попались рек1 и рек2 из ТЗ1 в ТЗ2, когда счетчик больше 1, тогда запоминаем строки ТЗ2 в массив (перед запоминанием ищем строку в массиве, если нет добавим, если есть пропустим).
4) обойдем массив и из ТЗ2 удалим строки.
5) профит. ТЗ2 это ТЗ1 без дублей по вашим кастомным ключам.
4 Ёпрст
 
24.08.17
11:40
Свернуть табличку - проще всего
5 mistеr
 
24.08.17
11:42
(0) >Есть ли третий?

Классический. Скопировать, добавить колонку, Заполнить (единицей), Свернуть, НайтиСтроки
6 Dmitriy_
Kolesnikov
 
28.08.17
02:02
(5) как в структуре ПараметрыОтбора в НайтиСтроки я укажу, что ищу "Количество" > 2?
О, придумал. Я буду искать количество = 1, а в цикле обхода ТЗ проверять, что строка не попадает в возвращенный массив строк.
7 Dmitriy_
Kolesnikov
 
28.08.17
02:25
Вроде красиво и лаконично получилось. Колонок, по которым проверяем дубли, может быть произвольное количество.

    // ВознагражденияБезнал: по Сотрудник + Должность
    тзкВознагражденияБезнал = тзВознагражденияБезнал.Скопировать();
    тзкВознагражденияБезнал.Колонки.Добавить("Кол", ОписаниеТиповЧ); // количество строк с одинаковым значением в проверяемой колонке (колонках)
    тзкВознагражденияБезнал.ЗаполнитьЗначения(1, "Кол");
    тзкВознагражденияБезнал.Свернуть("Сотрудник, Должность", "Кол");
    ит = тзВознагражденияБезнал.Количество() - 1;
    Пока ит > 0 цикл
        стр = тзВознагражденияБезнал[ит];
        масСтрТЗК = тзкВознагражденияБезнал.НайтиСтроки(новый Структура("Сотрудник, Должность", стр.Сотрудник, стр.Должность));
        стрТЗК = масСтрТЗК[0];
        Если стрТЗК.Кол > 1 тогда
            тзВознагражденияБезнал.Удалить(стр);
            стрТЗК.Кол = стрТЗК.Кол - 1;
        КонецЕсли;
        ит = ит - 1;
    КонецЦикла;
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.