Имя: Пароль:
1C
1C 7.7
v7: Загрузка из файла JSON
,
0 zenon46
 
14.05.24
14:39
Доброго дня!
Может кто-то сталкивался с загрузками больших строк из файлов json, собственно файл 11 мегабайт.
Пробовал использовать класс JSON = КОП_JSON.ert - работает НО ОЧЕНЬ долго, на маленьких объемах отлично, на нужном объеме, не дождаться, пробовал грузить файл 1.2 мегабайта, около 40 минут, дальше пробовал использовать MSScriptControl.ScriptControl - на нем просто платформа закрывается.
Есть еще какие-то варианты ?
1 Djelf
 
14.05.24
15:05
Используй последние версии 1sqlitе: https://cloud.mail.ru/public/9znr/ZJ6ULE9aR

Описание интерфейса: https://www.sqlite.org/json1.html

Скорость термоядерная, но вложенных структур не получишь, только плоские таблицы.

P.S. Напрямую из файла данные не кушает, но 11 метров для клюшек не проблема.
P.P.S. Если вдруг будет вылетать по памяти, создавай базу sqlite не в :memory:, а в файле (тогда объем базы почти неограничен).
P.P.P.S. Файл можно залить во временную табличку sqlite в этот временный файл, а в совсем новых версиях в бинарном/сокращенном формате, этот формат значительно ускоряет последующую обработку, и дергать его уже можно из базы, а не с сырых данных на диске по 10 раз.
2 Ivan_495
 
14.05.24
14:54
(0) а у api нет функции загрузка по частям?
3 zenon46
 
14.05.24
14:56
(2) нет, ответ с сайта приходит целиком.
4 MWWRuza
 
гуру
14.05.24
15:10
Да, я тоже столкнулся с тем, что MSScriptControl.ScriptControl падает на сколько-то значимых по объему файлах...
ВК из (1) справляется отлично, но, конечно обработка плоских таблиц те еще танцы с бубном... В этом отношении MSScriptControl.ScriptControl намного проще и удобнее. Но, при желании все можно получить и из них - у меня получение остатков и оборотов из ЧЗ так сделано, работает.
5 zenon46
 
14.05.24
15:49
(4) передал в MS - не строку, а ссылку на файл, что бы он сам его прочитал, не падает, жду результат...
PS отработал скрипт, не засекал, но примерно минут 20.
6 trad
 
14.05.24
15:47
(0) у КОП_JSON есть свойство ИспользоватьScriptControl
Ставишь 1 и внутри будет работать MSScriptControl.ScriptControl
А чтобы передача больших строк не валило ОЛЕ нужно применять OleExSup.dll
7 Djelf
 
14.05.24
15:56
(4) Это не совсем так, все возможно.
Плоская таблица из sqlite и метод итз Группировать решают проблему.
Теоретически, можно собрать внутренее представление таблицы, а потом при загрузке в ТЗ или ИТ преобразовать во вложенные таблицы.
Подумаю об этом в следующей жизни...
8 ptiz
 
14.05.24
15:54
(0) Написать сервис на 1С 8.3
9 zenon46
 
14.05.24
16:06
(8) тут нету ее, а покупать ради этой задачи, сомнительная затея.
10 Djelf
 
14.05.24
16:36
(9) Комьюнити версия? На ну нафиг... сервис на голанг в 100500 раз будет быстре...
11 ptiz
 
14.05.24
16:42
(9) Посмотреть в сторону onescript - преобразовывать в более легкий для 7.7 формат. Конечно, это как из пушки по воробьям, но тем не менее.
12 zenon46
 
16.05.24
16:57
Господа, как победить, при разборе входящего JSON файла, кодировка UTF8, получаю вот такое :

сз_URL_Файлов.ПолучитьЗначение(m) = "Сертификат"

в файле вот это место : "title": "Сертификат"

Как-то можно перекодировать в 1251 ?
13 Djelf
 
16.05.24
17:05
(12) Любым, для твоего случая, доступным, их очень много есть.
Выбирай сам, самый доступный и удобный.
14 Kigo_Kigo
 
16.05.24
17:07
(12) Функция ПреобразоватьСтрокуВУТФ8(Стр)
    Длина=СтрДлина(Стр);
    Итог="";
    Для Н=1 По Длина Цикл
        Знак=Сред(Стр,Н,1);
        Код=КодСимв(Знак);
        Если Код<128 Тогда
            Итог=Итог+Знак;
        Иначе
            Если (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда
                Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
            ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда
                Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
            ИначеЕсли (Знак="ё") Тогда
                Итог=Итог+Симв(209)+Симв(145);
            ИначеЕсли (Знак="Ё") Тогда
                Итог=Итог+Симв(208)+Симв(129);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции
Функция ПреобразоватьСтрокуИзУТФ8(Стр)
    Длина=СтрДлина(Стр);
    Итог="";
    Для Н=1 По Длина Цикл
        Знак=Сред(Стр,Н,1);
        Код=КодСимв(Знак);
        Если Код<128 Тогда
            Итог=Итог+Знак;
        ИначеЕсли (Код>=128)И(Код<192) Тогда
        Иначе
            Н=Н+1;
            Знак2=Сред(Стр,Н,1);
            Код2=КодСимв(Знак2);
            Если Код=208 Тогда
                Если Код2=129 Тогда Итог=Итог+"Ё";
                Иначе Итог=Итог+Симв(КодСимв("А")+Код2-144);
                КонецЕсли;
            ИначеЕсли Код=209 Тогда
                Если Код2=145 Тогда Итог=Итог+"ё";
                Иначе Итог=Итог+Симв(КодСимв("р")+Код2-128);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции
ПыСы не мое
15 Kigo_Kigo
 
16.05.24
17:07
это у семерешников уже давно должно быть в глобальнике
16 trad
 
16.05.24
17:46
(12) попытаться запросить файл сразу в кодировке 1251
17 Злопчинский
 
16.05.24
19:23
Форекс уже умеет кодировать и декодировать в УТФ8
18 Злопчинский
 
16.05.24
19:26
19 big
 
16.05.24
20:00
А был бы XML, можно было бы ОЧЕНЬ быстро обработать ВСТРОЕННЫМИ средствами операционной системы. Джейсон - дрянь, кто бы что не говорил.

з.ы. Пардон, вырвалось ))
20 Djelf
 
16.05.24
20:24
(14) 11 метров посимвольно, на языке 1С...
"Да я тебя!" (с)Операция "Ы"
Знаем, помним. Есть такой доисторический метод. Храним в своих сердцах, рядом с сердцами Клааса, Данко и Соколом:
Безумству храбрых поем мы славу!
Безумство храбрых – вот мудрость жизни!
О смелый Сокол! В бою с врагами истек ты кровью…

Песня о Соколе (c)Максим Горький
21 Волшебник
 
16.05.24
20:24
Некрофилы...

Пардон, вырвалось
22 Djelf
 
16.05.24
20:35
(21) Уточняю - Это Некроманты...
Так будет полит-корректней, всякие "филы" не полит корректно, а вот "манты" вполне нейтрально...
Вчера их кушал - вкусно!
23 Волшебник
 
16.05.24
20:33
(22) Это у Вас вырвалось, а у меня другое вырвалось... Уж простите
24 Djelf
 
16.05.24
20:43
(23) А где я написал что что-то "вырвалось"?
Передергиваете карты, однако...
25 Волшебник
 
16.05.24
20:48
(24) Понятно. Я Вас записал в чёрный блокнотик.
26 Aleksey
 
16.05.24
23:00
(4) вроде выкладывали относительно недавно тут версию через MSScriptControl.ScriptControl, которая не падает. по крайне мере у меня перестала падать, но я и 11 метров не гружу
там просто строка разбивалась и обрабатывалась кусками
27 Злопчинский
 
16.05.24
23:35
(25) обложка в блокнотике - жёлтая?
28 zenon46
 
17.05.24
08:34
(26) не падает, я просто не строку передаю, а сам файл открыть.
    |    function parseJSON(path) {
    |    var fso = new ActiveXObject('Scripting.FileSystemObject');
    |    var ts = fso.OpenTextFile(path, 1, true);
    |    var str = ts.readAll();
    |    ts.close();
    |    var json = eval('(' + str + ')');
    |    return(json);
29 Kigo_Kigo
 
17.05.24
08:50
(20) дык не весь файл, а тока получаемые значения на русском
30 MWWRuza
 
гуру
17.05.24
12:11
Что-то Djelf скромно молчит... У него в карлике есть отлично и быстро работающие функции перекодировки чего и во что угодно :-)
31 Djelf
 
17.05.24
14:57
(30) Я уже отписался в этой теме. Нет вопросов = нет ответов.
32 victuan1
 
22.05.24
07:52
(17) "Формекс уже умеет кодировать и декодировать в УТФ8"
А вот джейсон парсить туда и обратно не умеет)
33 trad
 
22.05.24
08:58
{
"fld1": 1,
"fld2": true,
"fld3": "true",
"fld4": null
}

Как вы считаете, во что должен быть преобразован такой json в семерке?
34 victuan1
 
22.05.24
09:02
(33) В СписокЗначений, Структуру, ТаблицуЗначений, ИНдексированнуюТаблицу.
Нужно просто определить стандарт.
35 trad
 
22.05.24
09:02
(34) я же значения конкретные привел не просто так
36 victuan1
 
22.05.24
11:05
Например:
true = 46465464567878;
null = 164964364164691;
Сп = СоздатьОбъект("СписокЗначений");
Сп.Установить("fd1", 1);
Сп.Установить("fd2", true);
Сп.Установить("fd3", "true");
Сп.Установить("fd4", null);
37 Djelf
 
22.05.24
14:11
(33) Не проблема разобрать такое в sqlite.
А дальше... как хотите, так и вертите.
SELECT *
FROM json_tree(
'{"fld1": 1,"fld2": true,"fld3": "true","fld4": null}')
38 trad
 
22.05.24
14:44
(37) интересный тип - true
39 Djelf
 
22.05.24
15:54
(38) Это не я придумал ;)
40 mishaPH
 
22.05.24
16:01
(0) через MS SQL как-то можно.
41 Злопчинский
 
22.05.24
19:10
(32) ещё покер не играет и куртизанок не обеспечивает...