Мир Вам
Коллеги. а никто не пересекался с такой задачей как обработка данных реестра https://pro1c.org.ua/redirect.php?https://data.gov.ua/dataset/1c7f3815-3259-45e0-bdf1-64dca07ddc10 ?
Идея в чем: причесать справочник контрагентов типовой либо не типовой базы согласно данных из открытых данных. Но в лоб как то не особо хорошо вышло. Слишком большой файл для 1С.
Проекты "Пактум Контрагент" и от "Портфель" конечно прекрасны для такой оперативной задачи, но слишком накладно если все за раз и сразу.
Вот ищу хотя бы идей или методу.
Напишите свою процедуру чтения и разбора файла.
pablo @ Сегодня, 14:26
,
пробовали. на небольших файлах - работает, а вот оригинал в 1Гб - не справляется 1С, тем более что самый большой файл - более 5Гб
В данный момент пишу парсер на Delphi именно для этих 2 файлов
Vond @ Вчера, 23:28
,
Парсинг таких больших данных делается специальными библиотеками и неинтерпретируемыми языками, иначе приготовьтесь страдать.
К каждой задаче нужно подходить индивидуально, иначе 1С головного мозга придёт.
Пересекался, делал для 8.3.
Основная проблема в том что файлики с https://pro1c.org.ua/redirect.php?https://data.gov.ua/ уж очень большие и нужно время что бы их полностью обработать.
А так писал в служебную базу, а потом через http сервисы обращался к ней за информацией (перенаправлял запросы пактрума на свою базу)
awp @ 20.07.20, 21:43
,
и куда будет складывать делфи их? Кстати как с нюансом и новизной которая анонсируется в ближайшее время по госреестру? Делфи гибкая будет и все поймет?
Batchir @ 21.07.20, 13:46
,
а можно детальнее? 1С все же сама их обработала и сложила все в новую базу куда то? просто я не дождался в свое время, а сейчас по новой к задаче подхожу хочется учесть чужой опыт чтоб избежать "граблей"
ну или купить наверное
Vond, а какой именно файл пытаетесь обработать?
Vofka,
доброе утро. вот сей файл: https://pro1c.org.ua/redirect.php?https://data.gov.ua/dataset/1c7f3815-3259-45e0-bdf1-64dca07ddc10/resource/06bbccbd-e19c-40d5-9e18-447b110c0b4c
Vond,
Фишка в том что есть огромный файл.
Его нужно читать последовательно, а не целиком.
Алгоритм следующий:
1. Читаешь последовательно строки XML с помощью
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
ЧтениеXML.Прочитать();
// начинаем читать дальше строки файла
Пока ЧтениеXML.Прочитать() Цикл //Цикл по структуре
// .........
КонецЦикла;
Спасибо, предположения совпали с опытом других - тоже результат. Сам файл тоже интересно записан, все в 1 строку. пока накусаешь нужных правильных файлов тоже еще тот квест ну хоть так
Упрощенно код который разбивает файл на куски выглядит так:
ИмяБезРасширения = ""; // Чистое имя используется для генерации новых файлов
ИмяФайла = ""; // ИмяФайла - закачанный и разархивированный файл XML
ПутьКНовымФайлам = ""; // путь куда будут сохраняться новые файлы
Если ЭтоLinuxСервер() ТОгда // отдельная функция которая распознает где крутится сервер 1С
Слеш = "/";
Иначе
Слеш = "\";
КонецЕсли;
// читаем файл,
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
//Разделяем указанный файл на несколько частей заданного размера, по 100000 записей.
НомерФайла = 0;
КоличествоСтрокФайла = 0;
КоличествоЗаписейДляПрерыванияАлгоритма = 100000;
ЗаписьXML = Неопределено;
Пока ЧтениеXML.Прочитать() Цикл //Цикл по структуре
ИмяЧтения = ЧтениеXML.Имя;
ТипУзлаЧтения = ЧтениеXML.ТипУзла;
Если ИмяЧтения = "DATA" Тогда
// этот тег нам не нужен, пропускаем и переходим к записям
Продолжить;
КонецЕсли;
Если ИмяЧтения = "RECORD" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
// увеличиваем счетчик обработанной записи для того что бы как только достигнет нужного числа мы запишем файл и начнем новый
КоличествоСтрокФайла = КоличествоСтрокФайла + 1;
КонецЕсли;
// инициируем запись нового файла
Если КоличествоСтрокФайла = 1 И ЗаписьXML = Неопределено Тогда
НомерФайла = НомерФайла + 1;
ЗаписьXML = Новый ЗаписьXML;
ИмяНовогоФайла = ПутьКНовымФайлам + Слеш + ИмяБезРасширения + "_"+ НомерФайла + ".xml";
ЗаписьXML.ОткрытьФайл(ИмяНовогоФайла, "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML(); //
ЗаписьXML.ЗаписатьНачалоЭлемента("DATA"); // начинаем общий тег для хранения списка записей
КонецЕсли;
// в упращенном файле используются только начало, конец элемента и текст
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЧтения);
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
ЗаписьXML.ЗаписатьКонецЭлемента();
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
КонецЕсли;
// определяем что в новом файле уже нужное нам количество записей
Если КоличествоСтрокФайла = КоличествоЗаписейДляПрерыванияАлгоритма И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ИмяЧтения = "RECORD" Тогда
ЗаписьXML.ЗаписатьКонецЭлемента(); // DATA
ЗаписьXML.Закрыть();
// обнуляем значения для того чтоб попало в проверку генерации нового файла
КоличествоСтрокФайла = 0;
ЗаписьXML = Неопределено;
КонецЕсли;
КонецЦикла;
Если ЗаписьXML <> Неопределено Тогда
// последний файл с вероятностью 99.99% не записан
ЗаписьXML.ЗаписатьКонецЭлемента(); // DATA
ЗаписьXML.Закрыть();
КоличествоСтрокФайла = 0;
ЗаписьXML = Неопределено;
КонецЕсли;
Свои 5 копеек вставлю (во чем-то повторюсь).
1. Про DOM забудьте - только XML.
2. В данных много косяков: ошибки, проблемные символы, фейковые (тестовые) данные...
3. В данных отсутствует идентификатор уникальности записей. Соответственно, возникнет множество коллизий.
Petre @ 03.08.20, 13:00
,
Данные внутри полное г. Как такое вообще можно давать на уровне государства? У ФОПов нет ИНН, да и Юриков тоже. Может я не правильно смотрел? Подскажите кто где берет.Спасибо.
ПС: Файл разбил на куски по 80мб кодом на С# - 40сек.
awp @ Yesterday, 21:02
,
Предполагаю, они просто выгрузили из своих dbf-ов "как есть".
ИНН - это уже другая база - https://pro1c.org.ua/redirect.php?https://data.gov.ua/dataset/4c65d66d-1923-4682-980a-9c11ce7ffdfe.
Petre @ Сегодня, 9:22
,
А как ее связать с реестром? и нет фопов. по наименованию ? Интересно как такие сервисы как пактум и юконтрол это связывают?
Такое ощущение что они просто выполнили требование дать доступ людям, а вот уже что внутри всем пох......... Вангую, что пактумы и юконтролы берут в ином месте
awp @ Today, 10:59
,
Значимая часть ЄДРПОУ является началом вхождения в ИНН.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua