Здравствуйте. Имеется справочник в самописной конфигурации (на платформе 8.2, без УФ), в который необходимо загрузить данные из файла Excel. В файле есть ФИО физических лиц, их адрес, телефон и некое количество обращений.
Есть обработка, которая читает файл и записывает его в справочник.
Проблема в том, что файл собирался из разных источников и в нем много одинаковых физических лиц, необходимо убрать дубли, просуммировав количество обращений по каждому физлицу. Свернуть их по количеству нет никаких проблем. А как быть с адресами и телефонами?

Пример того, что есть и что должно быть в файле.

P.S. Просьба сильно не пинать, если есть подобная тема. Я не нашла.
---
```1c
    Для Каждого Стр2 из СписокКонтрагентовСвернутый Цикл ////////////////////перебор строк второй, свернутой таблицы
    СтрокиПоКонтрагенту = СписокКонтрагентов.НайтиСтроки(Новый структура("Контрагент",стр2.Контрагент));
    Для каждого стр из СтрокиПоКонтрагенту Цикл
    Если Найти(стр2.Адрес, стр.Адрес)=0 Тогда
    стр2.Адрес=стр2.Адрес+стр.Адрес;
    КонецЕсли;
    Если Найти(стр2.Телефон, стр.Телефон)=0 Тогда
    стр2.Телефон=стр2.Телефон+стр.Телефон;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
```
---
А Вы каким методом читаете?
При чтении добавьте колонку "Аналитика", состоящую из конкатенации трех своих полей. Сверните по этой колонке.
Ознакомьтесь с результатом, если результат не удовлетворяет, тогда воспользуйтесь API Dadata.ru (примеров обработок тут тьма), позволит причесать данные. И тогда их можно будет повторно свернуть. можете ко мне обратиться я Вам пришлю код на запрос.
В итоге Вы получите свернутых контрагентов и чистенькие адреса с телефонами.

P.S. Имейте ввиду, что возможно стоит подумать о промежуточном варианте хранения данных, поскольку DADATA.RU дает возможность обращаться к их API бесплатно только 10 000 раз в день. Плюс к этому сами понимаете API достаточно медленный.

Отработаете по принципу ДДО: Долго, Дорого, Офи**нно.
---
1."Есть обработка, которая читает файл и записывает его в справочник." - если обработка не очень сложная можно сделать загрузку под себя имеющегося файла
2.Можно написать простую обработку на 1с, которая из Исходной таблицы получит Таблицу Результат.
---
Я бы написал свою загрузку простеньккую, которая бы заливала значения в таблицу значений и там уже свернул по нужным столбцам
---
Это все понятно. ТЗ.Свернуть (""Контрагент ","КоличествоОбращений") работает прекрасно. Но вот ТЗ.Свернуть (""Контрагент, Адрес, Телефон","КоличествоОбращений") уже не так прекрасно. Адреса и телефоны забиты как попало. И в результате будет столько строк с одинаковыми ФИО и разными (для базы) адресами и телефонами.
---
Обойти файл и сформировать ТЗ, добавляя контрагента в нее - искать - если есть - в колонке телефон делать добавление строки и т.п
---
как все работает на данный момент:
1. читается файл. Все строки из файла пишутся в табличную часть обработки, после чего приводятся в порядок (убираются лишние пробелы, меняется Ё на е и т д.)
2. Далее кнопка "Свернуть" - выгрузка ТЧ в ТЗ, свертка ТЗ по контрагенту (ТЗ.Свернуть (""Контрагент ","КоличествоОбращений")), загрузка свернутой ТЗ в новую ТЧ.
3. А дальше все очень медленно:

```1c
    Для Каждого СтрокаТЧ из СписокКонтрагентов Цикл ///////////берем первую большую таблицу
    Сообщить("Обрабатывается строка большой таблицы: "+СтрокаТЧ.НомерСтроки);
    НайденныеСтроки = МассивСтр.Найти(СтрокаТЧ.Контрагент);
    Если НайденныеСтроки = Неопределено тогда
    МассивСтр.Добавить(СтрокаТЧ.Контрагент);
    Иначе
    Продолжить;
    КонецЕсли;

    МассивТелДляКонтрагента = Новый Массив();
    МассивТелДляКонтрагента.Добавить(СтрокаТЧ.Телефон);

    МассивАдресовДляКонтрагента = Новый Массив();
    МассивАдресовДляКонтрагента.Добавить(СтрокаТЧ.Адрес);

    Тел = СтрокаТЧ.Телефон;

    Адрес = СтрокаТЧ.Адрес;

    Для Каждого СТр1 из СписокКонтрагентов Цикл /////// опять строка той же самой таблицы
    Если (СтрокаТЧ.Контрагент = Стр1.Контрагент) и (СтрокаТЧ.НомерСтроки<>СТр1.НомерСтроки) Тогда

    ТекТелНеОбработан = Истина;
    ТекАдресНеОбработан = Истина;

    Для j=0 по МассивТелДляКонтрагента.ВГраница()Цикл
    Если МассивТелДляКонтрагента[j]=стр1.Телефон Тогда
    ТекТелНеОбработан = Ложь;
    КонецЕсли;
    КонецЦикла;

    Для k=0 по МассивАдресовДляКонтрагента.ВГраница()Цикл
    Если МассивАдресовДляКонтрагента[k]=стр1.Адрес Тогда
    ТекАдресНеОбработан = Ложь;
    КонецЕсли;
    КонецЦикла;

    Если ТекТелНеОбработан Тогда
    МассивТелДляКонтрагента.Добавить(стр1.Телефон);
    Тел = Тел+", "+Стр1.Телефон;
    КонецЕсли;

    Если ТекАдресНеОбработан Тогда
    МассивАдресовДляКонтрагента.Добавить(стр1.Адрес);
    Адрес = Адрес+", "+Стр1.Адрес;
    КонецЕсли;

    КонецЕсли;

    Конеццикла;

    Для Каждого Стр2 из СписокКонтрагентовСвернутый Цикл ////////////////////перебор строк второй, свернутой таблицы
    Состояние("Обрабатывается строка "+ стр2.НомерСтроки);
    Если Стр2.Контрагент<>СтрокаТЧ.Контрагент Тогда
    Продолжить;
    Иначе

    стр2.Адрес = Адрес;
    стр2.Телефон = тел;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
```

Далее свернутые данные записываются в справочник (ну это уже не нужные подробности)

Такой способ работает и достаточно неплохо. Проблема в том, что файл очень большой, в нем порядка 30 тысяч строк. Сворачиваться эти данные будут ну очень долго....Через 5 суток (!!!!!!) обработана только половина...
---
Вообще, алгоритм в (6) какой-то больно упоротый, вложенная выборка из самой большой таблицы - жестоко.
---
такое досталось по наследству...потому и переделать пытаюсь
---
а на этом этапе "выгрузка ТЧ в ТЗ" сразу при добавлении в ТЗ можно искать новый ли контрагент или нет и если нет то колонки или суммировать(КоличествоОбращений) или складывать строки(Телефон)
---
или складывать строки(Телефон)

можно поподробнее?
---
Не добавлять каждый раз строку, а сперва искать, и если нашли, дозаполнять существующую.
---
ну например в ТЗ есть уже запись по Иванову например это Стр, тогда Стр.Телефон = ?(ЗначениеЗаполнено(Стр.Телефон), Стр.Телефон + " " + ТутТелефон из тек стр ТЧ, ТутТелефон из тек стр ТЧ)
---
Может быть можно сделать с помощью сводных таблиц Excel(это как другой вариант)
---
```1c
    Для Каждого Стр2 из СписокКонтрагентовСвернутый Цикл ////////////////////перебор строк второй, свернутой таблицы
    СтрокиПоКонтрагенту = СписокКонтрагентов.НайтиСтроки(Новый структура("Контрагент",стр2.Контрагент));
    Для каждого стр из СтрокиПоКонтрагенту Цикл
    Если Найти(стр2.Адрес, стр.Адрес)=0 Тогда
    стр2.Адрес=стр2.Адрес+стр.Адрес;
    КонецЕсли;
    Если Найти(стр2.Телефон, стр.Телефон)=0 Тогда
    стр2.Телефон=стр2.Телефон+стр.Телефон;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
```
---
спасибо, сейчас попробуем
---
результат по Иванову получился таким:

Иванов Иван Иванович 212 Энская область..... ххххххххххххх

Второй номер телефона не записался...
---
ну так ищите, где неправильно скопипастили, у меня отрабатывает
---
Вроде как СКД умеет так сворачивать. Но вроде это зависит от версии платформы. Надо смотреть...
---
СКД тут не прокатит вообще.
---
Эт почему? Табличку в нее можно загрузить. Выгрузить в табличку тоже можно.
---
Т.е не просто сложить строки , нужно учитывать одинаковость, тогда в колонках Телефон, Адрес можно держать массивы и в их искать при добавлении.
---
Длину колонки проверьте
---
и адрес, и телефон длина 500
---
Ну, тут я бессильна. Выше на картинке видно, что все работает. Что там у вас твориться, я не могу телепатировать.
---
спасибо!!!! Спасибо!!!!! Спасибо!!!!!!!!!!!! Чистка кэша - наше все!!!!