Имя: Пароль:
1C
 
Добавление в XML новых строк
0 Niel_84
 
31.05.26
11:02
Добрый день. Помогите, пожалуйста, разобраться...

    
	Данные = ПолучитьИзВременногоХранилища(Хранилище);
	Расширение = ".xml";
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
	
	Данные.Записать(ИмяВременногоФайла);
	
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);
	
	ПостроительDOM = Новый ПостроительDOM;
	ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
	ЧтениеXML.Закрыть();
	
	СписокЭлементовDOMФайл = ДокументDOM.ПолучитьЭлементыПоИмени("Файл");
	Для Каждого ЭлементDOM Из СписокЭлементовDOMФайл Цикл
		Если ЭлементDOM.ЕстьАтрибут("ИдФайл") Тогда
			ЭлементDOM.УстановитьАтрибут("ИдФайл",СтрЗаменить((ЭлементDOM.Атрибуты.ПолучитьИменованныйЭлемент("ИдФайл").Значение),"_0_0_0_0_0_00", "_0_1_0_0_0_00"));
		КонецЕсли;
	КонецЦикла;

	СписокЭлементовDOMДопСведТов = ДокументDOM.ПолучитьЭлементыПоИмени("ДопСведТов");
	Для Каждого ЭлементDOM Из СписокЭлементовDOMДопСведТов Цикл
		Если ЭлементDOM.ЕстьАтрибут("КодТов") Тогда
			
			Атрибут = ЭлементDOM.Атрибуты.ПолучитьИменованныйЭлемент("КодТов").Значение;
			
			GTIN = НайтиGTIN(Атрибут);
			ЭлементGTIN = ДокументDOM.СоздатьЭлемент("ИнфПолФХЖ2");
			Элемент.УстановитьАтрибут("GTIN", ЭлементGTIN);
			
			//как добавить в существующий файл строку
			//<ИнфПолФХЖ2 Идентиф="GTIN" Значен="00000000000000" />
			//после <ИнфПолФХЖ2 Идентиф="ID товара" Значен="000000000" />
			//то есть должно быть так:
			//<ИнфПолФХЖ2 Идентиф="ID товара" Значен="000000000" /
			//<ИнфПолФХЖ2 Идентиф="GTIN" Значен="00000000000000" />			
			
			KIZ = НайтиKIZ(Атрибут);

			Для Каждого Строка Из KIZ Цикл
				СписокЭлементовDOMДопСведТов.Добавить(Элемент);
				Элемент.УстановитьАтрибут("КИЗ",Строка);

				//как в существующим файле изменить строку:
				//<ДопСведТов КодТов="00-0000" />
				//на ниже следующее(конструкция <ДопСведТов КодТов="00-0000" /> 
				//имеет закрывающий тег /, его нужно убрать и поставить в конце </ДопСведТов>):
					//<ДопСведТов КодТов="00-0000">
	 				//	<НомСредИдентТов>
	   				//		<КИЗ>0000000000000000000000000000000</КИЗ>
					//		<КИЗ>0000000000000000000000000000000</КИЗ>
					//		<КИЗ>0000000000000000000000000000000</КИЗ>
					//		<КИЗ>0000000000000000000000000000000</КИЗ>
					  //	</НомСредИдентТов>
					//</ДопСведТов>
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла, "windows-1251");	
	ЗаписьDOM = Новый ЗаписьDOM;
	ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
	
	ЗаписьXML.Закрыть();

Заранее всем спасибо.
1 Chameleon1980
 
31.05.26
11:28
ну блин.
что у тебя есть сейчас?
ПостроительDOM
вернее ДокументDOM потом
смотри его методы
добавляй и записывай обратно
наверное так да
голову никто не хочет включать?
где код украл?
2 Niel_84
 
31.05.26
11:59
(1) это мой код

например в этом месте
СписокЭлементовDOMФайл = ДокументDOM.ПолучитьЭлементыПоИмени("Файл");
    Для Каждого ЭлементDOM Из СписокЭлементовDOMФайл Цикл
        Если ЭлементDOM.ЕстьАтрибут("ИдФайл") Тогда
            ЭлементDOM.УстановитьАтрибут("ИдФайл",СтрЗаменить((ЭлементDOM.Атрибуты.ПолучитьИменованныйЭлемент("ИдФайл").Значение),"_0_0_0_0_0_00", "_0_1_0_0_0_00"));
        КонецЕсли;
    КонецЦикла;
получается
вторая строка была:
Файл xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

стала
<Файл xmlns:xsd="http://www.w3.org/2001/XMLSchema"

Подскажите, пожалуйста, что не так почему изменилась с xmlns:xsi на xmlns:xsd и обрезало адрес.
3 Niel_84
 
31.05.26
12:32
(2)     СписокЭлементовDOMДопСведТов = ДокументDOM.ПолучитьЭлементыПоИмени("ДопСведТов");
    Для Каждого ЭлементDOM Из СписокЭлементовDOMДопСведТов Цикл
        Если ЭлементDOM.ЕстьАтрибут("КодТов") Тогда
            
            Атрибут = ЭлементDOM.Атрибуты.ПолучитьИменованныйЭлемент("КодТов").Значение;    
            
            KIZ = НайтиKIZ(Атрибут);
            
            Для Каждого Строка Из KIZ Цикл
                
                ЭлементDOM.УстановитьАтрибут("КИЗ",Строка);
                
                //в данном случае было:
                //<ДопСведТов КодТов="00-0000" />

                //стало:
                //<ДопСведТов КодТов="00-0000" КИЗ="0000000000000000000000000000000"/>
                
                //а надо:
                //<ДопСведТов КодТов="00-0000">
                //    <НомСредИдентТов>
                //        <КИЗ>0000000000000000000000000000000</КИЗ>
                //        <КИЗ>0000000000000000000000000000000</КИЗ>
                //        <КИЗ>0000000000000000000000000000000</КИЗ>
                //        <КИЗ>0000000000000000000000000000000</КИЗ>
                //    </НомСредИдентТов>
                //</ДопСведТов>
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
4 Волшебник
 
31.05.26
18:48
Очень много нулей...
5 Волшебник
 
31.05.26
18:49
очень много комментариев...
6 Волшебник
 
31.05.26
18:49
Скажите, что Вы хотите от мисты?
7 Garykom
 
гуру
31.05.26
18:56
СериализаторXDTO вероятно хочет
8 Волшебник
 
31.05.26
19:10
(7) 👍
9 mikecool
 
01.06.26
09:17
прочитать в структуру, обработать, записать структуру
10 Garykom
 
гуру
01.06.26
10:07
(9) Может все же в СписокXDTO?
11 Жан Пердежон
 
01.06.26
16:24
Помогите разобраться...
<Простыня кода>
Заранее всем спасибо

Эх, раньше за такую тему ТСу бы дружно в панамку накидали. Стареет миста.
12 mikecool
 
01.06.26
16:32
(10) так и его можно в структуру, да во что угодно ))
13 Asmody
 
02.06.26
00:04
(11) так можем и накидать:

(0) Яд, стена




сходи разберись для начала чем в XML атрибут отличается от элемента, что такое DOM и что делает ДокументDOM.

В самом примитивном случае можно вспомнить, что XML - это просто текст.
14 Garykom
 
гуру
02.06.26
10:08
(13) >В самом примитивном случае можно вспомнить, что XML - это просто текст.
Возможно это самый простейший и быстрейший способ
Банально СтрЗаменить для любой (нужной) "строки" на "строка + свои доп.строки"
15 АгентБезопасной Нацио
 
02.06.26
10:17
(14) угу. Что-то решил прикола ради попробовать через XDTO - с типизацией не читает - "структура объекта не соотвествует типу". Без типизации не пишет - тоже типы не совпадают. Ну и сообщения об ошибках, как водится, "ооочень информативные"
16 Garykom
 
гуру
02.06.26
10:21
(15) Ну правильно это ЧтениеXML + ЗаписьXML делать
С добавлением нужных внутри ЗаписьXML
https://infostart.ru/1c/tools/311011/

ЗЫ
А через ФабрикаXDTO.ПрочитатьXML() не хочет?
Без типизаций, пакетов и схем, я такое использовал и вполне работало для валидных XML
Но да только для загрузки, писать затем снова в XML не требовалось
17 АгентБезопасной Нацио
 
02.06.26
10:51
(16) >>А через ФабрикаXDTO.ПрочитатьXML() не хочет?
Хочет, но не может :-)
Если просто ФабрикаXDTO.ПрочитатьXML(ЧтениеXML), то читает прекрасно, но тип свойств - anyType, поэтому при добавлении того же НомСредИдентТов, которого создаешь из стандартного пакета -"типы не совпадают". А если пытаюсь прочитать  ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФайлТип) - "структура объекта не соответствует типу"
Для загрузки можно без указания типа. Для модификации уже не канает. Ну и все типы в стандартном пакете ON_NSCHFDOPPR_1_997_01_05_03_01 почему-то не поименованы.

>>правильно это ЧтениеXML + ЗаписьXML делать
сомнительно. По хорошему, нужно использовать Фабрику и стандартный пакет, чтоб валидировать. Но не работает.
18 vis
 
02.06.26
11:27
XML - это просто текстовый файл.
Можешь обрабатывать его так, как хочешь простыми средствами.
19 Stepashkin
 
02.06.26
11:30
(18) Можно. А зачем?
20 АгентБезопасной Нацио
 
02.06.26
13:51
В дополнение к (17):
А можно ли как-то понять, что именно не нравится при преобразовании xml в xdto?
Понятно, что не нравится свойство Документ. Но что в нем не так? (загружаемый файл проверку формата у диадока - проходит. Вообще, взят из диадока)
Читаю так:
ЧтениеXML.ОткрытьФайл(Файл);
    Пакет = ФабрикаXDTO.Пакеты.Получить("ON_NSCHFDOPPR_1_997_01_05_03_01");  
СвойствоФайлТип = Пакет.КорневыеСвойства.Получить("Файл").Тип;
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,СвойствоФайлТип);    

Ошибка на скрине.
Ошибка? Это не ошибка, это системная функция.