Имя: Пароль:
1C
1C 7.7
v7: Сохранить большой текст в файл - молча вылетает
,
0 серый КТУЛХУ
 
08.12.21
04:24
//СтрДлина(ТекстЖсон) = 6058631
Стрим = СоздатьОбъект("ADODB.Stream");
Стрим.Type=2; Стрим.charset="windows-1251"; Стрим.Open();
Стрим.WriteText(ТекстЖсон);    // 1с-ина тихо сворачивается в коврик (((
Стрим.SaveToFile(ФайлЖсон,2); Стрим.Close(); Стрим = 0;
... в принципе могу пропарсить этот текст - но это тааак медленно... от сорока минут и больше дето...
может как-то еще можно извернуться, а, люди?
1 серый КТУЛХУ
 
08.12.21
04:46
таблин. если побить на куски при выводе - Ок. НО!
при попытке скриптом распарсить этот жсон - тоже тупо сворачивается в коврик:

scriptCtrl =  СоздатьОбъект("MSScriptControl.ScriptControl");
scriptCtrl.Language="jscript";
код = "              
|                    
| function parseJSON(strJSON) {
|  var tmpFunc = (new Function('return('+strJSON+');'))();
|  return(tmpFunc);
| }
|
| // Получить элемент массива
| function aGet(Array, index) {
|  return(Array[index]);
| }
|
| // Получить ключ пары по индексу
| function oKey(Obj, index) {
|  var size = 0, key;
|  for (key in Obj) {
|   if (size == index) break;
|   if (Obj.hasOwnProperty(key)) size++;
|  }
|  return(key);
| }
|
| // Получить значение пары по ключу
| function oValueByKey(Obj, key) {
|  return(Obj[key]);
| }
|
| //Получить количество пар в объекте
| Object.size = function(obj) {
|  var size = 0, key;
|  for (key in obj) {
|   if (obj.hasOwnProperty(key)) size++;
|  }
|  return(size);
| }
|
| //Получить размер объекта (количество пар в нём)
| function oSize(Obj) {
|  return(Object.size(Obj));
| }
|
| // Получить тип объекта (number, string, object, array)
| function eType(Element) {
|  if (Element instanceof Array) {
|    return(""array"");
|  } else if (Object.prototype.toString.call(Element) === '[object Array]') {
|    return(""array"");
|  } else {
|   return(typeof(Element));
|  }
| }
|";
scriptCtrl.AddCode(код);
Рез = scriptCtrl.run("parseJSON", ТекстЖсон ); // тут тихо ложится...
2 Aleksey
 
08.12.21
05:41
рекомендую сохранить его кусками по 1000 строк. Так больше чем на порядок быстрее.
А если очень нужно на выходе один большой файл, то можно его слить средствами винды
т.е. после выгрузки "кусков"

КомандаСистемы("copy d:\0\*.tmp d:\0\Data.json");
КомандаСистемы("del d:\0\*.tmp /f /q");
3 Aleksey
 
08.12.21
05:42
Тогда средствами винды копируем все наши куски в один файл и после этого подчищаем за собой
4 Salimbek
 
08.12.21
07:33
(0) Попробуйте BinaryData из 1С++ (если религия позволяет)
5 Salimbek
 
08.12.21
07:34
6 Злопчинский
 
08.12.21
11:10
клюшки в строковой переменой ограничена 32Кб
может поэтому вылетает
7 серый КТУЛХУ
 
08.12.21
11:22
я прошу прощния, выгрузить уже ПОЛУЧИЛОСЬ "порциями":

Стрим = СоздатьОбъект("ADODB.Stream");
Стрим.Type=2;
Стрим.charset="windows-1251";
Стрим.Open();
//Стрим.WriteText(ТекстЖсон);    // вылетает по памяти
Порция = 100000; КвоПорций = СтрДлина(ТекстЖсон)/Порция;
КвоПорций = Цел(КвоПорций) + ?(КвоПорций=Цел(КвоПорций),0,1);
Для СчетчикПорций = 1 По КвоПорций Цикл
  НачПоз = 1+(СчетчикПорций-1)*Порция;
  Стрим.WriteText(Сред(ТекстЖсон,1+(СчетчикПорций-1)*Порция,Порция));
КонецЦикла;
Стрим.SaveToFile(ФайлЖсон,2);
Стрим.Close();
Стрим = 0;

теперь вылетает при попытке парсинга json - см.(2).
вроде нашел обсуждение такое же - но без результата - Парсинг JSON
8 acht
 
08.12.21
11:28
Цель-то какая у этих подергиваний из памяти на диск - с диска в память?
В теме явно было "Сохранить большой текст в файл", сейчас уже парсинг откуда-то взялся...
9 acht
 
08.12.21
11:30
Тебе надо разобрать строку, которая лежит в переменной 1C ТекстЖсон и у которой длина 6058631 символов?
10 acht
 
08.12.21
11:33
Ну так не заводи ее в переменные 1С вообще. Сделай обертку на MSScriptControl.ScriptControl и проведи вообще всю обработку внутри его, начиная от получения данных. В 1С отдашь только результат, попиленный на маленькие переменные.
11 Salimbek
 
08.12.21
14:12
(1) А что у вас должно получиться в переменной Рез в итоге?
12 серый КТУЛХУ
 
08.12.21
14:24
(11) распарсенный в СЗ жсон:
представление - имя параметра, значение - ясночто.
массивы - в виде ТЗ с колонкой "Значение"
13 серый КТУЛХУ
 
08.12.21
14:25
(10): не силен в жскриптинге ((
14 серый КТУЛХУ
 
08.12.21
14:30
ЗЫ: утащил с https://expert.chistov.pro/public/1167222/ парсинг жсона.
на ОбъектИзЖсон = ПреобразоватьJSON(ТекстЖсон,0); сворачивается тоже
точнее - на вотетом:
Класс = scriptCtrl.eval("JSON");
Объект = Класс.parse(Данные, ); //трындец снова
15 Salimbek
 
08.12.21
14:44
(12) В вашем коде я не увидел ни создания ТЗ, ни создания СЗ. Поэтому с чего у вас такие ожидания были - непонятно.
(14) А вот тут создаются разные хранилища. Тут согласен с ожиданиями.
А на коротком JSON (например из статьи) он отрабатывает нормально?
16 серый КТУЛХУ
 
08.12.21
14:55
(15): в функции parseJSON при преобразовании строки в код JS автоматом получается объект json, который туда подставлен в виде строки..
странно но вылетает. сейчас еще поковыряюсь
17 серый КТУЛХУ
 
08.12.21
15:40
(15):
Объект = scriptCtrl.eval("JSON.parse(strparam, '')");
{D:\TEST-002.ERT(738)}: Ошибка компиляции Microsoft JScript: Предполагается наличие идентификатора, строки или числа
18 trad
 
08.12.21
15:52
семерка не может передавать ком-серверам (любым) длинные строки. Падает. Планка - несколько сотен килобайт. ТОчнее не помню
19 серый КТУЛХУ
 
08.12.21
15:55
(18): а как извратиться через файл?
20 trad
 
08.12.21
16:01
(19)
Текст = СоздатьОбъект("Текст");
Текст.ДобавитьСтроку(ТекстЖсон);
Текст.Записать();

А в скрипте открываешь файл и читаешь
21 trad
 
08.12.21
16:04
или использовать такую поделку

OleExSup = СоздатьОбъект("OleExSup");
Рез = OleExSup.ВызватьОЛЕМетод(Скрипт, "run", "parseJSON", ТекстЖсон);
22 Salimbek
 
08.12.21
16:47
(21) А я еще вон чего нашел, но что там под капотом - не знаю )))
https://www.1cpp.ru/forum/YaBB.pl?num=1592377547
23 trad
 
08.12.21
17:16
(22) там старый КОП. С небольшими джесонами можно работать, т.к. посимвольный парсинг кодом 1с.
На больших уснешь ждать.
24 trad
 
08.12.21
17:25
Вот новый
https://www.dropbox.com/s/pmpgyd068mzzu7k/kop1c_JSON.7z

Там есть свойство ИспользоватьScriptControl
25 серый КТУЛХУ
 
08.12.21
17:49
гляну спс.
да вроде жрет этот скрипт мой жсон.
спасибо всем.
26 серый КТУЛХУ
 
08.12.21
17:50
Парсинг текста ( длина = 5 923 254 ): затрачено секунд 208.4, Записей в результате (Таблица) = 9 257
27 серый КТУЛХУ
 
08.12.21
17:51
это скриптом. тот же самый жсон-текст 1с-ными инструментами парсился от получаса.
28 ДедМорроз
 
08.12.21
22:04
У тебя 7.7 в ней текст а строках однобайтовый.
Когда ты его даешь какому-то Com-серверу,то ему должен достаться двухбайтовый текст - это преобразование делает 1с перед тем как вызвать IDispatch этого объекта - и здесь у тебя кончается память.
К сожалению,это обойти никак нельзя.
29 ДедМорроз
 
08.12.21
22:07
Откуда ты это текст получил?
Может быть,его можно получить,минуя 1с,чтобы он был сразу 2 байта или использовать потоковое чтение.
Например,объект Scripting.FileSystemObject и его TextStream в 32 битном варианте переваривал образы дисков,которые измерялись в терабайтах.
30 серый КТУЛХУ
 
09.12.21
04:14
(29): с партнерского сайта по api - результат запроса на изменения справочников номенклатурных. у них в api не регламентируется объем, шо есть - то и нате жрите не обляпайтесь.
та не, сожрали скрипты от Чистова с инфостарта...