Загрузка файла Excel в справочник, свернуть строки, 1с 8.2
Здравствуйте. Имеется справочник в самописной конфигурации (на платформе 8.2, без УФ), в который необходимо загрузить данные из файла Excel. В файле есть ФИО физических лиц, их адрес, телефон и некое количество обращений.
Есть обработка, которая читает файл и записывает его в справочник.
Проблема в том, что файл собирался из разных источников и в нем много одинаковых физических лиц, необходимо убрать дубли, просуммировав количество обращений по каждому физлицу. Свернуть их по количеству нет никаких проблем. А как быть с адресами и телефонами?
Пример того, что есть и что должно быть в файле.
P.S. Просьба сильно не пинать, если есть подобная тема. Я не нашла.
Есть обработка, которая читает файл и записывает его в справочник.
Проблема в том, что файл собирался из разных источников и в нем много одинаковых физических лиц, необходимо убрать дубли, просуммировав количество обращений по каждому физлицу. Свернуть их по количеству нет никаких проблем. А как быть с адресами и телефонами?
Пример того, что есть и что должно быть в файле.
P.S. Просьба сильно не пинать, если есть подобная тема. Я не нашла.
Прикрепленные файлы:
Книга1.xlsx
По теме из базы знаний
- Прайс-заказ с картинками
- Загрузка номенклатуры, остатков и цен. Розница 2.2, 2.3
- Пример переноса справочников, документов и движений через Эксель и "Конвертацию данных 2" из оптовой учетной системы 1С 7.7 Комплексной 4.2 и розничной учетной системы Рарус Торговый комплекс -> в 1С 8.3 ЕРП 2.4 (расширение и дополнительные реквизиты)
- Все консоли запросов для 1С
- Расширяемый редактор форматированного текста для 1С (WYSIWYG)
Найденные решения
Для Каждого Стр2 из СписокКонтрагентовСвернутый Цикл ////////////////////перебор строк второй, свернутой таблицы
СтрокиПоКонтрагенту = СписокКонтрагентов.НайтиСтроки(Новый структура("Контрагент",стр2.Контрагент));
Для каждого стр из СтрокиПоКонтрагенту Цикл
Если Найти(стр2.Адрес, стр.Адрес)=0 Тогда
стр2.Адрес=стр2.Адрес+стр.Адрес;
КонецЕсли;
Если Найти(стр2.Телефон, стр.Телефон)=0 Тогда
стр2.Телефон=стр2.Телефон+стр.Телефон;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) А Вы каким методом читаете?
При чтении добавьте колонку "Аналитика", состоящую из конкатенации трех своих полей. Сверните по этой колонке.
Ознакомьтесь с результатом, если результат не удовлетворяет, тогда воспользуйтесь API Dadata.ru (примеров обработок тут тьма), позволит причесать данные. И тогда их можно будет повторно свернуть. можете ко мне обратиться я Вам пришлю код на запрос.
В итоге Вы получите свернутых контрагентов и чистенькие адреса с телефонами.
P.S. Имейте ввиду, что возможно стоит подумать о промежуточном варианте хранения данных, поскольку DADATA.RU дает возможность обращаться к их API бесплатно только 10 000 раз в день. Плюс к этому сами понимаете API достаточно медленный.
Отработаете по принципу ДДО: Долго, Дорого, Офи**нно.
При чтении добавьте колонку "Аналитика", состоящую из конкатенации трех своих полей. Сверните по этой колонке.
Ознакомьтесь с результатом, если результат не удовлетворяет, тогда воспользуйтесь API Dadata.ru (примеров обработок тут тьма), позволит причесать данные. И тогда их можно будет повторно свернуть. можете ко мне обратиться я Вам пришлю код на запрос.
В итоге Вы получите свернутых контрагентов и чистенькие адреса с телефонами.
P.S. Имейте ввиду, что возможно стоит подумать о промежуточном варианте хранения данных, поскольку DADATA.RU дает возможность обращаться к их API бесплатно только 10 000 раз в день. Плюс к этому сами понимаете API достаточно медленный.
Отработаете по принципу ДДО: Долго, Дорого, Офи**нно.
1."Есть обработка, которая читает файл и записывает его в справочник." - если обработка не очень сложная можно сделать загрузку под себя имеющегося файла
2.Можно написать простую обработку на 1с, которая из Исходной таблицы получит Таблицу Результат.
2.Можно написать простую обработку на 1с, которая из Исходной таблицы получит Таблицу Результат.
Это все понятно. ТЗ.Свернуть (""Контрагент ","КоличествоОбращений") работает прекрасно. Но вот ТЗ.Свернуть (""Контрагент, Адрес, Телефон","КоличествоОбращений") уже не так прекрасно. Адреса и телефоны забиты как попало. И в результате будет столько строк с одинаковыми ФИО и разными (для базы) адресами и телефонами.
(5) как все работает на данный момент:
1. читается файл. Все строки из файла пишутся в табличную часть обработки, после чего приводятся в порядок (убираются лишние пробелы, меняется Ё на е и т д.)
2. Далее кнопка "Свернуть" - выгрузка ТЧ в ТЗ, свертка ТЗ по контрагенту (ТЗ.Свернуть (""Контрагент ","КоличествоОбращений")), загрузка свернутой ТЗ в новую ТЧ.
3. А дальше все очень медленно:
Далее свернутые данные записываются в справочник (ну это уже не нужные подробности)
Такой способ работает и достаточно неплохо. Проблема в том, что файл очень большой, в нем порядка 30 тысяч строк. Сворачиваться эти данные будут ну очень долго....Через 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 суток (!!!!!!) обработана только половина...
Для Каждого Стр2 из СписокКонтрагентовСвернутый Цикл ////////////////////перебор строк второй, свернутой таблицы
СтрокиПоКонтрагенту = СписокКонтрагентов.НайтиСтроки(Новый структура("Контрагент",стр2.Контрагент));
Для каждого стр из СтрокиПоКонтрагенту Цикл
Если Найти(стр2.Адрес, стр.Адрес)=0 Тогда
стр2.Адрес=стр2.Адрес+стр.Адрес;
КонецЕсли;
Если Найти(стр2.Телефон, стр.Телефон)=0 Тогда
стр2.Телефон=стр2.Телефон+стр.Телефон;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот