Прочитать файл XML в таблицу значений

1. TariK 06.02.24 09:33 Сейчас в теме
Всем привет!
Вот кусок кода, где пытаюсь прочитать файл XML в таблицу значений.
Адрес - e1cib/tempstorage/f9e89ba7-4b8e-4371-aa22-5e02e3113a36?seanceId=ZTczNGJjMTAtZDRkZC00N2I3LWI3N2ItZiI3MjFjMDBmYjUwhj6­2-cGKaEKAIk10O0XdvgAAAAA
ДвоичныеДанные - двоичные данные как двоичные
СтрокаXML - сюда записался текст XML-файла который надо, все попало символ в символ.
Все это через отладчик смотрю.
А от дальше...
СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных) - выдает ошибку:
СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных) {<Неизвестный модуль>(1)}: Ошибка при вызове метода контекста (ПрочитатьXML) или было раньше в значении NULL

&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере(Адрес)
	// Вставить содержимое обработчика.
	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
	
	//темпФайл = ПолучитьИмяВременногоФайла();
	//
	//ДвоичныеДанные.Записать(темпФайл); 
	
	
	Если ДвоичныеДанные = Неопределено Тогда
		ТекстОшибки = "Не удалось прочитать файл с контейнером.";
	Иначе
		Попытка
			ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
			ЧтениеДанных.КодировкаТекста = КодировкаТекста.UTF8;
			ЧтениеТекста = Новый ЧтениеТекста(ЧтениеДанных.ИсходныйПоток(), КодировкаТекста.UTF8); 
			СтрокаXML = ЧтениеТекста.Прочитать();
			ЧтениеXMLДанных = Новый ЧтениеXML; 
			ЧтениеXMLДанных.УстановитьСтроку(СтрокаXML); 
			ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);   
			ЧтениеТекста.Закрыть();
			ЧтениеДанных.Закрыть();
		Исключение
			ТекстОшибки = "Не удалось получить строку XML из файла.";
		КонецПопытки;
	КонецЕсли;
КонецПроцедуры

Показать



Что не так делаю?

Задача простая, из одной базы 1С прочитать Таблицу значений и записать в XML , а в другую базу 1С наоборот (прочитать XML и записать в Таблицу значений).
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
11. independ 1521 06.02.24 12:57 Сейчас в теме
(1) БСП
//запись в XML таблицы значений
ОбщегоНазначения.ЗначениеВСтрокуXML(ТЗ);
//чтение из XML
ТЗ=ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML);
starik-2005; +1 Ответить
22. SlavaKron 06.02.24 18:44 Сейчас в теме
(1) На клиенте, вместо двоичных данных, сразу получайте строку XML из файла через ЧтениеТекста и передавайте ее прямо на сервер.
&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере(Знач СтрокаXML)
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(СтрокаXML);	
	ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
	ЧтениеXML.Закрыть();
КонецПроцедуры
Но ошибка, скорее всего, вызвана некорректной сериализацией ранее, поэтому используйте функции, подсказанные в (11).
2. soft_wind 06.02.24 10:00 Сейчас в теме
(1)
пытаюсь прочитать файл XML в таблицу значений.

а зачем вы используете формат ХМЛ?
для сохранения в файл и затем чтения в ТЗ очень подходит формат МХЛ

и там всего пяток команд
3. TariK 06.02.24 10:03 Сейчас в теме
(2) не так часто обмены с нуля пишу. Нужно такое расширение, что большой объем информации на нем можно было разместить, а сам файл весил не много.
12. Said-We 06.02.24 13:03 Сейчас в теме
(3)
Нужно такое расширение, что большой объем информации на нем можно было разместить, а сам файл весил не много.
JSON меньше будет, за счет меньшего объема служебных символов. :-)
А текстовый с разделителем ещё меньше.
И всё это ещё можно запаковать. :-)

ХМЛ выбран по какой-то другой причине, а не из-за того что он меньше или больше.
14. TariK 06.02.24 13:54 Сейчас в теме
(12)
да, главная причина - это то, что при выгрузке в текстовом надо прописывать колонки руками в ТаблицаЗначений, а у меня плавающее количество колонок, т.к. запрос вытаскивающий ТЗ, меняется в зависимости от переменной. Одним словом, ТЗ может быть с 10юя колонками, в через час с 20ю, а потом 11 и т.д.
ну и пощупать новый формат... опыт
4. soft_wind 06.02.24 10:04 Сейчас в теме
Сорян, перепутал!
вообще текстовый формат используйте
лкТекст = ЗначениеВСтрокуВнутр(ВашаТЗ)
вот эту строку в файл и пишите!
так же просто ее и прочитать и обратно в ТЗ превратить
5. TariK 06.02.24 10:07 Сейчас в теме
(4) было текст, решил переделать в xml
6. soft_wind 06.02.24 10:08 Сейчас в теме
(5) ааа....
а что это дает? (ну кроме ошибок)
7. TariK 06.02.24 10:15 Сейчас в теме
(6) пощупать новый формат... опыт
8. user5300 1019 06.02.24 10:30 Сейчас в теме
ДанныеДокумента = новый Струтктура("Товары",		Новый Массив); 
			
			Для каждого стр из Док.Товары Цикл   
				СтруктураТаблицы = новый Структура;
				СтруктураТаблицы.Вставить("Номенклатура",XMLСтрока(стр.Номенклатура));
				СтруктураТаблицы.Вставить("Количество",стр.Количество);
				СтруктураТаблицы.Вставить("Цена",стр.Цена);  
				СтруктураТаблицы.Вставить("Сумма",стр.Сумма);
				
				ДанныеДокумента.Товары.Добавить(СтруктураТаблицы); 
			КонецЦикла;
			
		
		Запись = Новый ЗаписьXML;
		Запись.УстановитьСтроку(); 
		
		МассивДокументовВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ДанныеДокумента );
		ФабрикаXDTO.ЗаписатьXML(Запись, МассивДокументовВОбъектеXDTO);

		ДанныеXML = Запись.Закрыть();

/// и загрузка,
ЧтениеXML = новый ЧтениеXML;
		ЧтениеXML.УстановитьСтроку(ДанныеXML );
		
		ДанныеДокумента = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);

					Для каждого стр из СтруктураДокумента.Товары Цикл
						М = ДокОбъект.Товары.Добавить();
						м.Номенклатура 	= XMLЗначение(тип("СправочникСсылка.Номенклатура"),стр.Номенклатура); 
						м.Количество 	= стр.Количество;
						м.Цена 			= стр.Цена;
						м.Сумма 		= стр.Сумма;
					КонецЦикла;


Показать
9. TariK 06.02.24 12:31 Сейчас в теме
(8)
ДанныеДокумента = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);

Тут СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных) {<Неизвестный модуль>(1)}: Ошибка при вызове метода контекста (ПрочитатьXML)
10. user5300 1019 06.02.24 12:44 Сейчас в теме
(9)
ДанныеXML
- смотря что тут содержится...
13. TariK 06.02.24 13:52 Сейчас в теме
(10) текст XML, который был загружен из другой базы

<ValueTable xmlns="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<column>
		<Name>Период</Name>
		<ValueType>
			<Type>xs:dateTime</Type>
			<Type>Null</Type>
			<DateQualifiers>
				<DateFractions>DateTime</DateFractions>
			</DateQualifiers>
		</ValueType>
		<Title>Период</Title>
		<Width>19</Width>
	</column>
	<column>
		<Name>Организация</Name>
.................................................
Показать
15. user5300 1019 06.02.24 14:02 Сейчас в теме
(13) попробуйте передать таблицу значимей как в моем примере выше
16. TariK 06.02.24 14:06 Сейчас в теме
(15) не получится таким способом.
главная причина - это то, что при выгрузке ТЗ нельзя прописывать колонки руками, у меня плавающее количество колонок, т.к. запрос вытаскивающий ТЗ, меняется в зависимости от переменной. Одним словом, ТЗ может быть с 10юя разными колонками, в через час с 20ю, а потом 11 и т.д.
17. TariK 06.02.24 16:18 Сейчас в теме
Общий вопрос.

Задача:

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

2) в другую базу 1С наоборот прочитать файл и записать в Таблицу значений. Так как количество колонок может быть разное (соответственно разное наименование колонок), поэтому прописывать руками структуры колонок или другое с указанием всех колонок нет смысла.

Вопрос, какой метод для этих целей подойдет? Главное условие - сделать две обработки, не вмешиваясь в конфигурацию.
18. soft_wind 06.02.24 16:37 Сейчас в теме
(17) И вот мы плавненько подошли к ОБЫЧНОЙ конвертации данных (КД2.1)
с ее помощью создайте правила конвертации,
и используйте ее внешнюю обработку Универсальный обмен данными!

там все уже правильно и годами отлаженный механизм, и файлы как раз в формате ХМЛ создаются

(но если вы любитель изобретать велосипед с квадратными колесами, то кто же, вам, в этом может помешать?)
19. TariK 06.02.24 17:25 Сейчас в теме
(18) с КД2.1 только курсы проходил, на практике правила поправлял пару раз.
Почему спрашиваю ща теорию, чтоб опять не пойти по не правильному пути. На практике наковыряю что угодно, просто не так быстро))
Последний вопрос по данной теме, чисто теоретически:
1) В первой базе (где собираю ТЗ), там только запросом можно все собрать.
Вот это ТЗ можно в КД 2.1 отправить?
2) Во второй базе все попадает в один независимый регистр сведений .

Такой вариант реализовать можно на КД2.1?
20. soft_wind 06.02.24 17:54 Сейчас в теме
(19) Встречный вопрос! так как базы разные а все ли элементы есть в этих базах
а то при чтении во второй базе вашей ТЗ, в колонках, там где ссылки получите кучу записей/значений
<ОбъектНеНайден....>
21. TariK 06.02.24 18:33 Сейчас в теме
(20) не должно такого быть, потому что через файл txt работает выгрузка-загрузка. Смысл переделки, что в первой базе ЗУПа, справочник Подразделения может увеличиваться в глубину, и любые изменения прописать в другой самописной базе, в идеале нам надо сделать выгрузку и забыть об этом.
23. soft_wind 07.02.24 10:12 Сейчас в теме
(21) выгрузка и загрузка ТЗ ни через текст ни через ХМЛ не создаст новых элементов справочников!
копайте КД2.1
(она может и данные в регистры грузить при обмене, использую в виде источник произвольные запросы)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот