Коллеги. а никто не пересекался с такой задачей как обработка данных реестра [необходимо зарегистрироваться для просмотра ссылки] ? Идея в чем: причесать справочник контрагентов типовой либо не типовой базы согласно данных из открытых данных. Но в лоб как то не особо хорошо вышло. Слишком большой файл для 1С. Проекты "Пактум Контрагент" и от "Портфель" конечно прекрасны для такой оперативной задачи, но слишком накладно если все за раз и сразу. Вот ищу хотя бы идей или методу.
pablo @ Сегодня, 14:26
, пробовали. на небольших файлах - работает, а вот оригинал в 1Гб - не справляется 1С, тем более что самый большой файл - более 5Гб
Группа: Местный
Сообщений: 635
Спасибо сказали: 171 раз
Рейтинг: 136.4
Vond @ Вчера, 23:28
, Парсинг таких больших данных делается специальными библиотеками и неинтерпретируемыми языками, иначе приготовьтесь страдать. К каждой задаче нужно подходить индивидуально, иначе 1С головного мозга придёт.
#define private public enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1435 раз
Рейтинг: 0
Пересекался, делал для 8.3. Основная проблема в том что файлики с [необходимо зарегистрироваться для просмотра ссылки] уж очень большие и нужно время что бы их полностью обработать. А так писал в служебную базу, а потом через http сервисы обращался к ней за информацией (перенаправлял запросы пактрума на свою базу)
awp @ 20.07.20, 21:43
, и куда будет складывать делфи их? Кстати как с нюансом и новизной которая анонсируется в ближайшее время по госреестру? Делфи гибкая будет и все поймет?
Batchir @ 21.07.20, 13:46
, а можно детальнее? 1С все же сама их обработала и сложила все в новую базу куда то? просто я не дождался в свое время, а сейчас по новой к задаче подхожу хочется учесть чужой опыт чтоб избежать "граблей" ну или купить наверное
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1435 раз
Рейтинг: 0
Vond, Фишка в том что есть огромный файл. Его нужно читать последовательно, а не целиком. Алгоритм следующий: 1. Читаешь последовательно строки XML с помощью
ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла); ЧтениеXML.Прочитать(); // начинаем читать дальше строки файла
Пока ЧтениеXML.Прочитать() Цикл //Цикл по структуре // ......... КонецЦикла;
В этом случае оперативная память не загружается и в ней находятся только прочитанные на момент чтения строки. Минус в том что мы не можем контролировать что загружено из файла что нет и если что-то пойдет не так то нам нужно начинать сначала. 2. Поэтому перед тем как выполнять записи в базу я этот большой XML дробил программно на кучу (по 100000 записей, это на усмотрение) В результате у меня было N количество небольших файлов ожидающих загрузки данных. 3. После того как новые файлы сформированы запускаем уже разбор этих отдельных файлов. Читаю каждый файл и гружу по нему данные. Если успешно загрузился, то грохаю его, если прошла какая-то ошибка, то пропускаю (перемещаю в отдельный каталог. что бы потом выяснить на чем прошел затык) И так выполняется пока все они не будут обработаны.
Сообщение отредактировал Batchir - 30.07.20, 10:20
Спасибо, предположения совпали с опытом других - тоже результат. Сам файл тоже интересно записан, все в 1 строку. пока накусаешь нужных правильных файлов тоже еще тот квест ну хоть так
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1435 раз
Рейтинг: 0
Упрощенно код который разбивает файл на куски выглядит так:
ИмяБезРасширения = ""; // Чистое имя используется для генерации новых файлов ИмяФайла = ""; // ИмяФайла - закачанный и разархивированный файл 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 = Неопределено; КонецЕсли;
Вырезал куски, у меня просто там куча всего ещё написано для отладки и настройки алгоритмов загрузки. Но для понимания должно хватить)
Сообщение отредактировал Batchir - 03.08.20, 11:20
Группа: Местный
Сообщений: 2909
Из: Київ, Україна
Спасибо сказали: 1162 раз
Рейтинг: 1248.1
Свои 5 копеек вставлю (во чем-то повторюсь). 1. Про DOM забудьте - только XML. 2. В данных много косяков: ошибки, проблемные символы, фейковые (тестовые) данные... 3. В данных отсутствует идентификатор уникальности записей. Соответственно, возникнет множество коллизий.
Допрацьовую: - "Бухгалтерія для України 2.1"; - "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".
Группа: Местный
Сообщений: 522
Спасибо сказали: 70 раз
Рейтинг: 51.3
Petre @ 03.08.20, 13:00
, Данные внутри полное г. Как такое вообще можно давать на уровне государства? У ФОПов нет ИНН, да и Юриков тоже. Может я не правильно смотрел? Подскажите кто где берет.Спасибо.
ПС: Файл разбил на куски по 80мб кодом на С# - 40сек.
Группа: Местный
Сообщений: 2909
Из: Київ, Україна
Спасибо сказали: 1162 раз
Рейтинг: 1248.1
awp @ Yesterday, 21:02
, Предполагаю, они просто выгрузили из своих dbf-ов "как есть". ИНН - это уже другая база - [необходимо зарегистрироваться для просмотра ссылки].
Допрацьовую: - "Бухгалтерія для України 2.1"; - "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".
Группа: Местный
Сообщений: 522
Спасибо сказали: 70 раз
Рейтинг: 51.3
Petre @ Сегодня, 9:22
, А как ее связать с реестром? и нет фопов. по наименованию ? Интересно как такие сервисы как пактум и юконтрол это связывают?
Такое ощущение что они просто выполнили требование дать доступ людям, а вот уже что внутри всем пох......... Вангую, что пактумы и юконтролы берут в ином месте
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!