Имя: Пароль:
1C
 
Существует ли ограничение по длине строки для УстановитьСтроку()
, ,
0 EvgKolivagin
 
04.03.22
09:10
Добрый день!

При вызове метода УстановитьСтроку() получаю такую ошибку:

Ошибка при вызове метода контекста (УстановитьСтроку)
    ЧтениеXML.УстановитьСтроку(СтрокаXML,,);
по причине:
Некорректные данные для конвертации

Код в обработке токой:

&НаКлиенте
Процедура Загрузить(Команда)
    ЧтениеТекста = Новый ЧтениеТекста(Объект.Файл_AS_ADM_HIERARCHY,КодировкаТекста.UTF8);
    СтрокаXML = ЧтениеТекста.Прочитать();
    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(СтрокаXML);
КонецПроцедуры

Загружается файл размером 1,5 ГБ, при загрузке файла 800 мб такой ошибки нет. Получается есть ограничение на размер загружаемой строки?

И как быть если нужно загрузить большй файл...
1 pechkin
 
04.03.22
09:13
Чтение хмл само умеет из файла читать. Зачем через строку?
2 EvgKolivagin
 
04.03.22
09:16
(1) Честно говоря действовал по примеру, сейчас попробую напрямую, спасибо!
3 Garykom
 
гуру
04.03.22
09:17
(0) Еще учти что передача между сервером и клиентом больших файлов (за гиг) портит их
4 EvgKolivagin
 
04.03.22
09:23
(3) Я хочу прочитать данные в Массив на клиенте, передать его на сервер и там обрабатывать.
5 Garykom
 
гуру
04.03.22
09:34
Сжимай перед передачей (клиент-сервер и обратно) и после тестируй архив перед распаковкой в случае больших объемов
Ну или просто разбивай на кусочки до гига
6 EvgKolivagin
 
04.03.22
09:35
(1) Чтение напрямую помогло, но теперь вся оперативная память была поглащена процессом и 1с зависла. (5) Разбивать на куски с помощью WinRar?
7 Garykom
 
гуру
04.03.22
09:36
(6) Зачем винрар? Если в 1С встроен зип
8 Garykom
 
гуру
04.03.22
09:39
ну и
https://wonderland.v8.1c.ru/blog/novye-instrumenty-dlya-raboty-s-dvoichnymi-dannymi-obespechivayut-kak-posledovatelnyy-dostup-k-danny/

РазделитьФайл() и ОбъединитьФайлы()
РазделитьДвоичныеДанные() и СоединитьДвоичныеДанные()
9 EvgKolivagin
 
04.03.22
09:39
(7) А есть ли способ читать xml не загружая его целиком в оперативную память?
10 Garykom
 
гуру
04.03.22
09:39
(9) Почитай про отличие SAX от DOM
11 acht
 
04.03.22
09:40
(9) Есть. На инфостарте таких статей много
12 EvgKolivagin
 
04.03.22
09:40
(8) Спасибо, но боюсь с таким поглащением оперативной памяти у меня и сервер не справится. Думаю я концептуально неверно подхожу к реализации
13 EvgKolivagin
 
04.03.22
09:41
(10) Спасибо, сейчас займусь.
14 Garykom
 
гуру
04.03.22
09:45
(12) Учти что если файлы XML реально большие и обрабатывать их надо быстро и часто
То придется выносить это за пределы 1С в нечто иное (ВК или API или еще как)
А в 1С уже готовое выдавать

В случае же если обработка XML нужна под управлением данных из 1С то придется извращаться с каким то языком/способом/правилами
Которые из 1С выгружаются во внешнее до начала обработки, там быстро обрабатываются и в 1С результат
15 lodger
 
04.03.22
09:55
вот это помещает весь xml в память? точно?

Чтение= Новый ЧтениеXML;
Чтение.ОткрытьФайл("c:/docs/data.xml");
Пока Чтение.Прочитать() Цикл
    // Обработка узла XML

КонецЦикла;
16 EvgKolivagin
 
04.03.22
09:58
(14) Буду иметь ввиду, спасибо!
17 EvgKolivagin
 
04.03.22
10:08
(15) Это только первая часть, далее я создаю Фабрику XDTO

&НаКлиенте
Процедура Загрузить(Команда)
    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(Объект.Файл_AS_ADM_HIERARCHY);
    
    МассивИерархииАдресныхОбъектов = Новый Массив;
    
    ЧтениеXMLСхемы = Новый ЧтениеXML;
    ЧтениеXMLСхемы.ОткрытьФайл(Объект.Файл_AS_ADM_HIERARCHY_XSD);
    
    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXMLСхемы);
    
    ПостроительСхемXML = Новый ПостроительСхемXML;
    СхемаXML = ПостроительСхемXML.СоздатьСхемуXML(ДокументDOM);
    
    НаборСхемXML = Новый НаборСхемXML;
    НаборСхемXML.Добавить(СхемаXML);
    
    НоваяФабрикаXDTO = Новый ФабрикаXDTO(НаборСхемXML);
    ТипXDTO = НоваяФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema","Объекты иерархии");
    ИерархияАдресныхОбъектовXDTO = НоваяФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипXDTO);
КонецПроцедуры
18 EvgKolivagin
 
04.03.22
10:09
(17) И вот на этой строке ИерархияАдресныхОбъектовXDTO = НоваяФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипXDTO);
заполняется вся память
19 lodger
 
04.03.22
12:25
(18) ну так это ты сам выбрал инструмент, который читает xml целиком.
в таком варианте у тебя пути - поставить х64, нарастить оперативку, отдать эту работу серверу.
20 lodger
 
04.03.22
12:27
попробуй (15). читай поэлементно.