Загрузка файла Excel в справочник, свернуть строки, 1с 8.2

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

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

P.S. Просьба сильно не пинать, если есть подобная тема. Я не нашла.
Прикрепленные файлы:
Книга1.xlsx
По теме из базы знаний
Найденные решения
13. catena 110 26.04.18 08:53 Сейчас в теме
Для Каждого Стр2 из СписокКонтрагентовСвернутый Цикл  ////////////////////перебор строк второй, свернутой таблицы
           СтрокиПоКонтрагенту = СписокКонтрагентов.НайтиСтроки(Новый структура("Контрагент",стр2.Контрагент));
          Для каждого стр из СтрокиПоКонтрагенту Цикл
                  Если Найти(стр2.Адрес, стр.Адрес)=0 Тогда
                           стр2.Адрес=стр2.Адрес+стр.Адрес;
                  КонецЕсли;
                  Если Найти(стр2.Телефон, стр.Телефон)=0 Тогда
                           стр2.Телефон=стр2.Телефон+стр.Телефон;
                  КонецЕсли;
          КонецЦикла;
 КонецЦикла;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
26. plebedinskiy 50 26.04.18 10:42 Сейчас в теме
(1) А Вы каким методом читаете?
При чтении добавьте колонку "Аналитика", состоящую из конкатенации трех своих полей. Сверните по этой колонке.
Ознакомьтесь с результатом, если результат не удовлетворяет, тогда воспользуйтесь API Dadata.ru (примеров обработок тут тьма), позволит причесать данные. И тогда их можно будет повторно свернуть. можете ко мне обратиться я Вам пришлю код на запрос.
В итоге Вы получите свернутых контрагентов и чистенькие адреса с телефонами.

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

Отработаете по принципу ДДО: Долго, Дорого, Офи**нно.
2. Olga12 181 26.04.18 07:42 Сейчас в теме
1."Есть обработка, которая читает файл и записывает его в справочник." - если обработка не очень сложная можно сделать загрузку под себя имеющегося файла
2.Можно написать простую обработку на 1с, которая из Исходной таблицы получит Таблицу Результат.
3. SaschaL 26.04.18 07:57 Сейчас в теме
Я бы написал свою загрузку простеньккую, которая бы заливала значения в таблицу значений и там уже свернул по нужным столбцам
4. NovichoKooX 3 26.04.18 08:00 Сейчас в теме
Это все понятно. ТЗ.Свернуть (""Контрагент ","КоличествоОбращений") работает прекрасно. Но вот ТЗ.Свернуть (""Контрагент, Адрес, Телефон","КоличествоОбращений") уже не так прекрасно. Адреса и телефоны забиты как попало. И в результате будет столько строк с одинаковыми ФИО и разными (для базы) адресами и телефонами.
5. Olga12 181 26.04.18 08:19 Сейчас в теме
Обойти файл и сформировать ТЗ, добавляя контрагента в нее - искать - если есть - в колонке телефон делать добавление строки и т.п
6. NovichoKooX 3 26.04.18 08:28 Сейчас в теме
(5) как все работает на данный момент:
1. читается файл. Все строки из файла пишутся в табличную часть обработки, после чего приводятся в порядок (убираются лишние пробелы, меняется Ё на е и т д.)
2. Далее кнопка "Свернуть" - выгрузка ТЧ в ТЗ, свертка ТЗ по контрагенту (ТЗ.Свернуть (""Контрагент ","КоличествоОбращений")), загрузка свернутой ТЗ в новую ТЧ.
3. А дальше все очень медленно:
	Для Каждого СтрокаТЧ из СписокКонтрагентов Цикл ///////////берем первую большую таблицу
		Сообщить("Обрабатывается строка большой таблицы: "+СтрокаТЧ.НомерСтроки);
		НайденныеСтроки = МассивСтр.Найти(СтрокаТЧ.Контрагент);
		Если НайденныеСтроки = Неопределено тогда
			МассивСтр.Добавить(СтрокаТЧ.Контрагент);
		Иначе
			Продолжить;
		КонецЕсли;
		
		МассивТелДляКонтрагента = Новый Массив();
		МассивТелДляКонтрагента.Добавить(СтрокаТЧ.Телефон);
		
		МассивАдресовДляКонтрагента = Новый Массив();
		МассивАдресовДляКонтрагента.Добавить(СтрокаТЧ.Адрес);
		
		
		Тел = СтрокаТЧ.Телефон;
		
		Адрес = СтрокаТЧ.Адрес;
		
		Для Каждого СТр1 из СписокКонтрагентов Цикл /////// опять строка той же самой таблицы
			Если (СтрокаТЧ.Контрагент = Стр1.Контрагент) и (СтрокаТЧ.НомерСтроки<>СТр1.НомерСтроки) Тогда
				
				ТекТелНеОбработан = Истина;
				ТекАдресНеОбработан = Истина;
				
				
				Для j=0 по МассивТелДляКонтрагента.ВГраница()Цикл
					Если МассивТелДляКонтрагента[j]=стр1.Телефон Тогда
						ТекТелНеОбработан = Ложь;	
					КонецЕсли;
				КонецЦикла;
				
				Для k=0 по МассивАдресовДляКонтрагента.ВГраница()Цикл
					Если МассивАдресовДляКонтрагента[k]=стр1.Адрес Тогда
						ТекАдресНеОбработан = Ложь;	
					КонецЕсли;
				КонецЦикла;				
				
				
				Если  ТекТелНеОбработан Тогда
					МассивТелДляКонтрагента.Добавить(стр1.Телефон);
					Тел = Тел+", "+Стр1.Телефон;
				КонецЕсли;
				
				Если  ТекАдресНеОбработан Тогда
					МассивАдресовДляКонтрагента.Добавить(стр1.Адрес);
					Адрес = Адрес+", "+Стр1.Адрес;
				КонецЕсли;
				
			КонецЕсли;
			
		Конеццикла;
		
		Для Каждого Стр2 из СписокКонтрагентовСвернутый Цикл  ////////////////////перебор строк второй, свернутой таблицы
			Состояние("Обрабатывается строка "+ стр2.НомерСтроки);
			Если Стр2.Контрагент<>СтрокаТЧ.Контрагент Тогда
				Продолжить;
			Иначе
				
				стр2.Адрес = Адрес;
				стр2.Телефон = тел;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
Показать



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

Такой способ работает и достаточно неплохо. Проблема в том, что файл очень большой, в нем порядка 30 тысяч строк. Сворачиваться эти данные будут ну очень долго....Через 5 суток (!!!!!!) обработана только половина...
12. catena 110 26.04.18 08:46 Сейчас в теме
Вообще, алгоритм в (6) какой-то больно упоротый, вложенная выборка из самой большой таблицы - жестоко.
15. NovichoKooX 3 26.04.18 09:00 Сейчас в теме
(12) такое досталось по наследству...потому и переделать пытаюсь
7. Olga12 181 26.04.18 08:36 Сейчас в теме
а на этом этапе "выгрузка ТЧ в ТЗ" сразу при добавлении в ТЗ можно искать новый ли контрагент или нет и если нет то колонки или суммировать(КоличествоОбращений) или складывать строки(Телефон)
8. NovichoKooX 3 26.04.18 08:43 Сейчас в теме
(7)
или складывать строки(Телефон)


можно поподробнее?
9. catena 110 26.04.18 08:45 Сейчас в теме
(8)Не добавлять каждый раз строку, а сперва искать, и если нашли, дозаполнять существующую.
10. Olga12 181 26.04.18 08:45 Сейчас в теме
ну например в ТЗ есть уже запись по Иванову например это Стр, тогда Стр.Телефон = ?(ЗначениеЗаполнено(Стр.Телефон), Стр.Телефон + " " + ТутТелефон из тек стр ТЧ, ТутТелефон из тек стр ТЧ)
11. Olga12 181 26.04.18 08:46 Сейчас в теме
Может быть можно сделать с помощью сводных таблиц Excel(это как другой вариант)
13. catena 110 26.04.18 08:53 Сейчас в теме
Для Каждого Стр2 из СписокКонтрагентовСвернутый Цикл  ////////////////////перебор строк второй, свернутой таблицы
           СтрокиПоКонтрагенту = СписокКонтрагентов.НайтиСтроки(Новый структура("Контрагент",стр2.Контрагент));
          Для каждого стр из СтрокиПоКонтрагенту Цикл
                  Если Найти(стр2.Адрес, стр.Адрес)=0 Тогда
                           стр2.Адрес=стр2.Адрес+стр.Адрес;
                  КонецЕсли;
                  Если Найти(стр2.Телефон, стр.Телефон)=0 Тогда
                           стр2.Телефон=стр2.Телефон+стр.Телефон;
                  КонецЕсли;
          КонецЦикла;
 КонецЦикла;
Показать
16. NovichoKooX 3 26.04.18 09:00 Сейчас в теме
(13) спасибо, сейчас попробуем
20. NovichoKooX 3 26.04.18 09:36 Сейчас в теме
(13) результат по Иванову получился таким:

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


Второй номер телефона не записался...
21. catena 110 26.04.18 09:49 Сейчас в теме
(20) ну так ищите, где неправильно скопипастили, у меня отрабатывает
Прикрепленные файлы:
14. ImHunter 315 26.04.18 08:54 Сейчас в теме
Вроде как СКД умеет так сворачивать. Но вроде это зависит от версии платформы. Надо смотреть...
17. NovichoKooX 3 26.04.18 09:01 Сейчас в теме
(14) СКД тут не прокатит вообще.
18. ImHunter 315 26.04.18 09:02 Сейчас в теме
(17) Эт почему? Табличку в нее можно загрузить. Выгрузить в табличку тоже можно.
19. Olga12 181 26.04.18 09:17 Сейчас в теме
Т.е не просто сложить строки , нужно учитывать одинаковость, тогда в колонках Телефон, Адрес можно держать массивы и в их искать при добавлении.
22. catena 110 26.04.18 09:49 Сейчас в теме
Длину колонки проверьте
23. NovichoKooX 3 26.04.18 09:52 Сейчас в теме
(22) и адрес, и телефон длина 500
24. catena 110 26.04.18 09:55 Сейчас в теме
Ну, тут я бессильна. Выше на картинке видно, что все работает. Что там у вас твориться, я не могу телепатировать.
25. NovichoKooX 3 26.04.18 10:32 Сейчас в теме
(24) спасибо!!!! Спасибо!!!!! Спасибо!!!!!!!!!!!! Чистка кэша - наше все!!!!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот