Работа с содержимым XML большого объёма

21.11.25

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Приходится обрабатывать содержимое XML большого объёма? Как не перенапрячь компьютеры при этом. Изложена методика загрузки (чтения) содержимого вида XML, в режиме экономии аппаратного ресурса

Интеграции между базами данных с помощью формата XML явление постоянное, хорошо знакомое и часто описанное. Тем не менее однажды получил опыт, связанный с большими объёмами получаемых данных, при не самом мощном серверном техническом ресурсе. При всём знакомстве с методикой обмена через XML, пришлось отдельно подумать над тем, как не переживать за объёмы получаемых сведений и уровень технических средств. Как-то стало привычкой и описываемую методику применяю практически всегда, на всякий случай, чтобы не сильно "удивлять" сервер и не раздражать "подвисающих" пользователей.

Итак, классическая схема, классическая на уровне курсовой работы студента, конечно. Есть содержимое XML определенной структуры, нам эта структура известна, понятна и под неё мы создаём пакет XDTO. Получаем содержимое XML, загоняем его в объёкт чтения, этот объект чтения читаем Фабрикой и вот он, желаемый объект XDTO, который можно превращать в таблицу значений, например. Всё понятно, всё работает - проверено многократно. До тех пор, пока не прилетит содержимое размером в десятки или сотни мегабайт (почему бы нет?) Или, ещё проще, файл огромный, но в нём нужен всего-лишь небольшой фрагмент. И получится следующее. Мы создадим неподъёмный по объёму объектXDTO, который должен порождать не менее объёмную таблицу значений, причём, оба этих "пухлых" объекта будут существовать одновременно. На каждом сервере можно повесить табличку "Памяти много не бывает!") Вот такой ситуации всегда хочется, нужно и можно избежать! Поделюсь опытом, вдруг кому-то пригодится.

Живой пример (реальная задача). Сразу оговорюсь, совсем гигантских объёмов здесь не проявилось, но речь поёдёт о типовых конфигурациях, участвующих в обмене, и хорошо знакомых объектах конфигурации, будет вполне наглядно. Итак, задача звучит так "в ЕРП справочник номенклатуры содержит сведения о весовых характеристиках номенклатуры. Надо эти значения перенести в базу БП, в аналогичный справочник". Несложная, но вполне жизненная задачка. С выгрузкой из ЕРП проблем не возникает. Только оговорюсь по процедуре создания Фабрики. Во внешних обработках, где необходимо создавать Фабрику по своей схеме, я предпочитаю использовать макет вида "двоичные данные". Макет содержит загруженный файл XSD. Из этого макета я создаю необходимую мне Фабрику (подробности - ниже). Файл выгрузки получился чуть меньше 10 мБайт. Забыл уточнить, я использую содержимое XML в формате FastInfoSet, т.к. в строковом представлении содержимое оказывается раз в пять объёмнее.

И теперь подробно, приступаем к чтению файла на стороне получения. Файл выбран и помещён на сервер. У нас есть двоичные данные файла, приступаем.

На стороне получения тоже внешняя обработка. В ней так же есть макет с двоичными данными схемы XSD. 

 

 

Вот так я привык получать нужную мне фабрику из макета двоичных данных:
 

Функция СоздатьФабрикуПоСхемеИзМакета()

	МакетСхемы = ЭтотОбъект.ПолучитьМакет("СхемаПриИмпорте");
	ПотокЧтенияДД = МакетСхемы.ОткрытьПотокДляЧтения();
	
	ОбъектЧтения = Новый ЧтениеXML;
	ОбъектЧтения.ОткрытьПоток(ПотокЧтенияДД);
	
	Построитель = Новый ПостроительDOM;
	СхемаЧтения = Построитель.Прочитать(ОбъектЧтения);
	
	Построитель = Новый ПостроительСхемXML;
	СхемаЧтения = Построитель.СоздатьСхемуXML(СхемаЧтения.ЭлементДокумента);
	
	НаборСхем = Новый НаборСхемXML;
	НаборСхем.Добавить(СхемаЧтения);
	
	МояФабрика = Новый ФабрикаXDTO(НаборСхем);
	
	Возврат МояФабрика 
	
КонецФункции

Следует описать - а что содержит схема, которой я читаю содержимое XML. Для наглядности переведу (импортирую) схему в конфигуратор, в пакет XDTO.

 

 

По привычной логике выгрузок-загрузок "Номенклатура" должна, вроде бы, быть элементом с минимальным количеством элементов "0" и максимальным "-1" (СписокXDTO). Но именно такой список и сделает содержимое при чтении слишком большим, мы же будем вынуждены прочесть весь список - сразу. В моём случае "Номенклатура" сделана типом. Это описание повторяющегося фрагмента содержимого XML. Теперь несложная задача - прочитать содержимое XML фрагментами (кусочками), точно попадая в начало и конец описанного в нашем типе XDTO элемента ("Номенклатура").
Пример в процедуре ниже:
 

Процедура ЗавершитьИмпортФайлаНаСервере(АдресХранения) Экспорт

	СодержимоеДД = ПолучитьИзВременногоХранилища(АдресХранения);
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("fis");
	СодержимоеДД.Записать(ИмяВременногоФайла);
	СодержимоеДД = Неопределено;

	ПотокЧтения = ФайловыеПотоки.ОткрытьДляЧтения(ИмяВременногоФайла, 65356);
	
	ОбъектЧтения = Новый ЧтениеFastInfoset;
	ОбъектЧтения.ОткрытьПоток(ПотокЧтения); 

	ЗаписьФрагмента = Новый ЗаписьFastInfoset;
	ВестиЗапись = Ложь;
	СтруктураИсполнения = СтруктураИсполненияПриИмпортеФайла();
	
	Пока ОбъектЧтения.Прочитать() Цикл
		
		Если ОбъектЧтения.ИмеетИмя И ОбъектЧтения.ЛокальноеИмя = "Номенклатура" Тогда
			
			Если ОбъектЧтения.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

				ВестиЗапись = Истина;
				ПотокФрагмента = Новый ПотокВПамяти(1024);
				ЗаписьФрагмента.ОткрытьПоток(ПотокФрагмента);
				
			ИначеЕсли ОбъектЧтения.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
		
				ЗаписьФрагмента.ЗаписатьТекущий(ОбъектЧтения);
				ВестиЗапись = Ложь;
				ЗаписьФрагмента.Закрыть();
				ПотокФрагмента.Перейти(0, ПозицияВПотоке.Начало);
				ПотокФрагмента = ПотокФрагмента.ПолучитьПотокТолькоДляЧтения();
				ВнестиСтрокуВТаблицуПереноса(СтруктураИсполнения, ПотокФрагмента);
			КонецЕсли;
		КонецЕсли;
		
		Если ВестиЗапись Тогда
			
			ЗаписьФрагмента.ЗаписатьТекущий(ОбъектЧтения);
		КонецЕсли;	
	КонецЦикла;
	
	ОбъектЧтения.Закрыть();
	ПотокЧтения.Закрыть();
	
	Если СтруктураИсполнения.ТаблицаПереноса.Количество() > 0 Тогда
		
		ТаблицаПереносаВоВременнуюТаблицуЗапроса(СтруктураИсполнения);
	КонецЕсли;	
	
	ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоФайла);
	Запрос = СтруктураИсполнения.Запрос;
	СтруктураИсполнения = Неопределено;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	НоменклатураСпр.Ссылка КАК Ссылка,
	|	ТаблицаПереноса.Вес КАК Вес
	|ИЗ
	|	Справочник.Номенклатура КАК НоменклатураСпр
	|		ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПереносаВТ КАК ТаблицаПереноса
	|		ПО НоменклатураСпр.Код = ТаблицаПереноса.Код
	|			И (СОКРЛП(НоменклатураСпр.Артикул) <> """"
	|					И СОКРЛП(ТаблицаПереноса.Артикул) <> """"
	|					И СОКРЛП(НоменклатураСпр.Артикул) = СОКРЛП(ТаблицаПереноса.Артикул)
	|				ИЛИ ИСТИНА)
	|ГДЕ
	|	НЕ ТаблицаПереноса.Вес ЕСТЬ NULL
	|	И НЕ НоменклатураСпр.ПометкаУдаления
	|	И НЕ НоменклатураСпр.ЭтоГруппа";
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		Попытка
			
			ОбъектНоменклатуры = Выборка.Ссылка.ПолучитьОбъект();
			ОбъектНоменклатуры.Вес = Выборка.Вес;
			ОбъектНоменклатуры.Записать();
		Исключение
		КонецПопытки;	
	КонецЦикла;	
	
КонецПроцедуры

Кратко прокомментирую прилагаемый код, он совсем несложен. Двоичные данные сохраняются во временный файл, из которого в  свою очередь создаётся файловый поток чтения. Небольшая оговорка, переменную, содержащую двоичные данные, я "обнуляю". Эта привычка возникла ещё в 90-е, но я считаю её полезной. Нет необходимости занимать память уже ненужными данными, особенно - объёмными.

Перед чтением создаю набор необходимых объектов и переменных, помещая их в одну структуру "СтруктураИсполнения":
 

Функция СоздатьПустуюТаблицуПереноса() 
	
	ТаблицаПереноса = Новый ТаблицаЗначений;
	КоллекцияКолонок = ТаблицаПереноса.Колонки;
	КоллекцияКолонок.Добавить("Код", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(11, ДопустимаяДлина.Переменная)));
	КоллекцияКолонок.Добавить("Артикул", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50, ДопустимаяДлина.Переменная)));
	КоллекцияКолонок.Добавить("Вес", Новый ОписаниеТипов("Число" , Новый КвалификаторыЧисла(15, 3, ДопустимыйЗнак.Неотрицательный)));

	Возврат ТаблицаПереноса; 

КонецФункции

Функция СтруктураИсполненияПриИмпортеФайла()
	
	СтруктураИсполнения = Новый Структура;
	СтруктураИсполнения.Вставить("МояФабрика", СоздатьФабрикуПоСхемеИзМакета());
	СтруктураИсполнения.Вставить("СоздаваемыйТип", СтруктураИсполнения.МояФабрика.Тип("http://www.ToolsWorld/Export/ERPtoAccaunting", "Номенклатура"));
	СтруктураИсполнения.Вставить("ТаблицаПереноса", СоздатьПустуюТаблицуПереноса());
	СтруктураИсполнения.Вставить("ЧтениеФрагмента", Новый ЧтениеFastInfoset);
	СтруктураИсполнения.Вставить("ДобавлятьВТ", Ложь);

	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|ТаблицаПереноса.Код КАК Код,
	|ТаблицаПереноса.Артикул КАК Артикул,
	|ТаблицаПереноса.Вес КАК Вес
	|ПОМЕСТИТЬ ТаблицаПереносаВТ
	|ИЗ
	|	&ТаблицаПереноса КАК ТаблицаПереноса");
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	СтруктураИсполнения.Вставить("Запрос", Запрос);
	
	Возврат СтруктураИсполнения;
	
КонецФункции

Опишу значения структуры:

"МояФабрика" и так понятно - почему и зачем.

"СоздаваемыйТип" - это типXDTO, позволяющий создавать соответствующий объект, а в структуре он, чтобы не создавать его при вводе каждой строки.

"ТаблицаПереноса" - это таблица значений, служащая для промежуточного накопления определённого набора строк. Эта таблица никогда не будет большой!

"ЧтениеФрагмента" - понятно для чего, в этом объекте будет читаться "кусочек", полученный из основного потока чтения.

"ДобавлятьВТ". Здесь подробнее. Цель применяемого решения - избежать создания громоздких объектов в памяти. Для этого создается таблица переноса (таблица значений) и запрос с задействованным менеджером временных таблиц. По мере заполнения таблицы переноса заданным количеством строк производится выполнение запроса и перемещение накопленных данных чтения во временную таблицу. При этом в первой итерации чтения запрос использует директиву "ПОМЕСТИТЬ", а в последующих итерациях установится директива "ДОБАВИТЬ".

"Запрос" - выше уже описал назначение этого объекта. Далее - читаем основное содержимое.
Файл читается в потоке построчно, отнимая при таком чтении минимум технического ресурса. 

При нахождении нужного элемента, это определяется по его локальному имени, начинается либо запись фрагмента, либо окончание записи фрагмента. Фрагментом служит отдельный объект записи вида "ЗаписьFastInfoSet". Запись ведется в "ПотокВПамяти". Размер буфера потока несложно прикинуть, понимая примерный объём потенциального фрагмента. 

В момент прохождения (чтения) узла с требуемым именем ("Номенклатура") и типом узла "КонецЭлемента" этот узел записывается во "фрагмент". После чего поток записи преобразуется в поток чтения. Обязательно не забыть - переместить позицию в потоке на начало, т.к. после записи мы находимся в конечной точке потока. Сформированный поток чтения фрагмента передаётся в обработку Фабрикой. 
 

Процедура ТаблицаПереносаВоВременнуюТаблицуЗапроса(СтруктураИсполнения)
	
	Если СтруктураИсполнения.ДобавлятьВТ Тогда
	
		СхемаSQL = Новый СхемаЗапроса;
		СхемаSQL.УстановитьТекстЗапроса(СтруктураИсполнения.Запрос.Текст);
		ПакетСхемы = СхемаSQL.ПакетЗапросов.Получить(0);
		ПакетСхемы.ТаблицаДляПомещения = "";
		ПакетСхемы.ТаблицаДляДобавления = "ТаблицаПереносаВТ";
		СтруктураИсполнения.Запрос.Текст = СхемаSQL.ПолучитьТекстЗапроса();
	КонецЕсли;	
	
	СтруктураИсполнения.Запрос.УстановитьПараметр("ТаблицаПереноса", СтруктураИсполнения.ТаблицаПереноса);
	СтруктураИсполнения.Запрос.Выполнить();
	СтруктураИсполнения.ТаблицаПереноса.Очистить();
	СтруктураИсполнения.Вставить("ДобавлятьВТ", Истина);
	
КонецПроцедуры

Процедура ВнестиСтрокуВТаблицуПереноса(СтруктураИсполнения, ПотокФрагмента)
	
	СтруктураИсполнения.ЧтениеФрагмента.ОткрытьПоток(ПотокФрагмента);
	ОбъектСтроки = СтруктураИсполнения.МояФабрика.ПрочитатьXML(СтруктураИсполнения.ЧтениеФрагмента, СтруктураИсполнения.СоздаваемыйТип);
	СтруктураИсполнения.ЧтениеФрагмента.Закрыть();
	ПотокФрагмента.Закрыть();
	НоваяСтрока = СтруктураИсполнения.ТаблицаПереноса.Добавить();
	ЗаполнитьЗначенияСвойств(НоваяСтрока, ОбъектСтроки);
	
	Если СтруктураИсполнения.ТаблицаПереноса.Количество() >= 500 Тогда
		
		ТаблицаПереносаВоВременнуюТаблицуЗапроса(СтруктураИсполнения);
	КонецЕсли;	
	
КонецПроцедуры

В прилагаемом примере каждый читаемый фрагмент образует строку в таблице значений. При достижении количества строк (в данном случае 500) выполняется процедура переноса данных из таблицы значений во временную таблицу запроса, после чего таблица значений очищается. Перед выполнение запроса анализируется - создавать временную таблицу или дополнять уже существующую. Текст запроса соответственно изменяется с использованием "СхемаЗапроса".

Собственно, на этом заканчивается то, что позволяет избежать создания избыточно громоздких объектов. По итогу в нижних строках кода оказывается запрос, содержащий временную таблицу. Можно задавать новый текст запроса и уже распоряжаться данными из временной таблицы, что у меня и происходит.

В таком режиме работы я уже не переживаю за потенциальный размер читаемого содержимого XML. Единственное место, где на короткое время может возникнуть избыточно большое значение, это получение двоичных данных из хранилища. Если кто-то придумает - как этого избежать - поделитесь идеями!

Вступайте в нашу телеграмм-группу Инфостарт

См. также

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27180 руб.

12.06.2017    155576    918    305    

471

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

52967 руб.

25.02.2015    179495    338    280    

401

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.258.x) и БП 3.0 (3.0.187.x). Правила подходят для версии ПРОФ и КОРП.

38000 34200 руб.

15.12.2021    31026    224    58    

168

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.25.x).

38000 34200 руб.

23.07.2020    63128    299    81    

239

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

58422 руб.

03.12.2020    43224    124    76    

116

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Платные (руб)

Перенос данных из ЗУП 3 в ЗУП 3 | из ЗУП 3 в КА 2 | из ЗУП 3 в ERP | Оперативно обновляется при выходе новых релизов 1С | Готовые правила конвертации (КД 2) для перехода с "ЗУП 3" на "УП ред. 3" / "КА, ред. 2" / "ERP, ред. 2" |Переносится нормативно-справочная информация и документы с движениями

58422 руб.

11.01.2021    36296    31    55    

32

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

61356 руб.

29.10.2018    60265    70    123    

69

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

61356 руб.

15.04.2019    80437    215    166    

154
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 994 21.11.25 15:54 Сейчас в теме
Смотря что подразумевать под большим объемом. Эска НЕ поддерживает структуры данных > 4 Гб в памяти.
2. DmitryKlimushkin 89 21.11.25 16:15 Сейчас в теме
(1) Так далеко я даже не замахивался) Мне однажды пришлось в регламентном задании "разбирать" XML файлы по 50 - 70 мБайт. Эти файлы валились с серверов технологического оборудования (маркируемая продукция). Даже такие файлы вполне подтормаживали остальную работу сервера с 1С. Вот в тот момент и пришлось придумывать методику, при которой весь балласт лежит на дисках, а не в памяти. Тут уж как получилось. Но в моих задачах регулярно помогает, когда содержимое XML переваливает за десятки мБайт.
3. qwinter 684 23.11.25 14:38 Сейчас в теме
Зачем вообще тащить весь файл на сервер, если читаете потоком? Бессмысленная трата ресурсов, особенно если нужна лишь часть файла.
6. DmitryKlimushkin 89 23.11.25 16:23 Сейчас в теме
(3) Вот тут вообще не понял. А оставшись на клиенте я смогу сделать - что? Я как-то вопрос не понял, наверное?
7. qwinter 684 23.11.25 17:08 Сейчас в теме
(6)
Вот тут вообще не понял. А оставшись на клиенте я смогу сделать - что?
Получить из файла все нужные данные, передать их на сервер и там обработать.
8. DmitryKlimushkin 89 23.11.25 17:45 Сейчас в теме
(7) "Получить" - в виде чего? Т.е. метод "Поместить файл на сервер" придуман для каких-то других случаев? Продолжаю "не понимать". Можно тезисно накидать краткую методику?
4. rozer 314 23.11.25 15:16 Сейчас в теме
5. DmitryKlimushkin 89 23.11.25 16:17 Сейчас в теме
(4) Идея - та же. но реализация у меня сомнения вызывает. Нашёл начало узла и прочитал.... до узла - какого? До конца текущего узла? Или до окончания всего XML? Фабрика, прям, сама знает до каких пор читать с того "начала" с которого решили стартовать? Я полон сомнений. Если найдёшь описание метода Фабрики, где оговорено, что Фабрика читает XML обязательно до окончания того узла, с которого она началось чтение - кинь ссылку на написанное. Я не встречал такого. Может, это будет моим новым опытом. Пока я считал, что Фабрика - без тормозов. Помещаешь в неё ЧтениеXML и она его от корки до корки, без пауз и остановок. Поэтому я определяю, как начало узла, так и его окончание.
Зачем создавать фабрику в цикле? Хочется каждый раз "нулячую" фабрику юзать?)
Далее, чтение Фабрикой без указания типа, даёт только строковый значения. Их потом отдельным "колдовством" надо в нужные типы переливать?
Опять же, судя по коду, заполняется какая-то таблица значений (или табличная часть). Если первое, то таблица значений висит в памяти и занимает места не меньше чем то XDTO, на котором захотелось память сервера сэкономить. Не в обиду автору, но пока похоже на курсовую работу, чем на реально работающий код) Могу ошибаться!
9. rozer 314 23.11.25 17:46 Сейчас в теме
(5) да, читает только текущий тег. Можно указать тип в Прочитать XML().
DmitryKlimushkin; +1 Ответить
10. DmitryKlimushkin 89 23.11.25 17:52 Сейчас в теме
(9) Спасибо, обязательно попробую в этой части. Хорошо, если получится ещё проще.
Для отправки сообщения требуется регистрация/авторизация