Пророк в своем отечестве или Читаем XML с помощью XDTO

Публикация № 254994

Разработка - Математика и алгоритмы

XML XSD конструктор XSD работа с XML ФабрикаXDTO чтение XML

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

Здесь, знаешь ли, приходится бежать со всех ног, чтобы только остаться на том же месте! Если же хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! (Королева «Алиса в зазеркалье»)

Доброго тебе дня, мой Дорогой Читатель! Проходи, садись поудобнее и приготовься внимать мне. Сейчас я предскажу твое будущее (свет меркнет, громы-молнии, звучит тревожная музыка)! Слушай же мой Читатель, что тебя ждет. Тебе рано или поздно придется столкнуться с XML (яркая молния, оглушительный грохот грома, запах озона).
Если ты разработчик 1С или пишешь на PHP, или С++, неважно, но рано или поздно тебе придется столкнуться с XML. Почему? Потому что это универсально, удобно, повсеместно, модно, круто, кросс-платформенно. XML правильно понимает и Android и Windows и Linux и все. Его используют для обмена информацией (например: электронные отчеты в налоговую, между конфигурациями 1С, для синхронизации с интернет-магазином). Его используют для хранения информации.
Итак, без долгих прелюдий приступим сразу к телу делу. Здесь не будет долгих описаний и определений. Просто несколько примеров. Но если вы собираетесь плотно работать с XML, то настоятельно рекомендую не полениться и почитать про XML и схемы XML (открывайте в Google Chrome, Firefox не совсем корректно работает с этим сайтом). Времени потратите не так много, а жизнь себе облегчите неимоверно.

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

СЛУЧАЙ I

Давайте предположим такую задачу, пусть на сайте некоего учебного заведения регистрируются студенты (не важно для чего, может чтобы пройти тестирование, а может чтобы талоны для столовой получить) и захотело руководство, чтобы эти данные попали в 1С в справочник «Студенты» (конфигурация «Учебное заведение 5.5 :-)  ). Программист PHP сказал «Бу сделано!» и выдал такой XML файл:

 

Здесь корневым элементов является элемент «students». Вложенным элементом является «student», где указана основная информация про студента учебного заведения. Элементы «name», «last_name», «sex» имеют тип «Строка», «birth» — «Дата», «level» (курс обучения) — «Число», «this_leader» (это староста группы) — «Булево». Нужно эти данные прочитать и разместить в справочнике «Студенты».

Как прочитать? Можно с помощью объекта «ЧтениеXML», но тогда нужно будет построчно обрабатывать документ. И хорошо если уровней вложенности всего лишь 2-3. А если их 10, и строк 10 тысяч? Тогда можно обработать с помощью «ДокументDOM», который создаст нам некое древовидное представление документа XML. Но тогда нам нужно будет каждый элемент обрабатывать отдельно, нужно будет программно прописывать, какой элемент преобразовывать в какой тип. Это не наш метод. Мой дорогой Читатель конечно же ознакомился с ссылками вверху и имеет представление об XML и его схемах. Давайте же создадим пакет XTDO и прочитаем с его помощью наш XML файл. Для этого я создал новую конфигурацию со следующими объектами:


Создал пакет XDTO «Чтение»:

 

Определил пространство имен «http://localhost/xdto». Если вы читали про XML и его схемы (ссылка выше) вы должны иметь представление, что такое пространство имен. А если не читали, то это некая уникальная интернет-ссылка (а интернет-ссылки все должны быть уникальными), где я определяю свои типы данных. Т. е. в пространстве имен (URI) »http://localhost/xdto» я определил тип students, который состоит из свойства student, который в свою очередь является сложным объектом и имеет свои свойства. А наф… зачем URI? Да затем, вдруг какой-нибудь чудак тоже определит тип students, что тогда? Конфликт? Разборки? Нет, у него будет другое пространство имен, например »http://tchudakov.net/blablabla». По хорошему, по адресу »http://localhost/xdto» у меня должно быть документация, информация, намек на то, что за схему я описал. Какие типы данных у меня, какие свойства. Мануал, одним словом. Но у меня там ничего нет. И у многих тоже ничего нет. Но Вы, мой дорогой Читатель, не берите пример с меня и таких как я. Если проект серьезный, сделайте документацию и потомки будут вам благодарны.

В этом пакете я описываю схему XML, т. е. это редактор, инструмент для создания схем. Вы даже можете нажать правой кнопкой мыши на пакет и экспортировать схему (файл с расширением .xsd). Для свойств я также указал типы: name, last_name, sex имеют тип string (http://www.w3.org/2001/XMLSchema). Как видите, тип string тоже определен в некоем пространстве имен, а именно его определяли сообща, на конференции w3 создавали стандарт. Свойство birth имеет тип date (http://www.w3.org/2001/XMLSchema), level - integer (http://www.w3.org/2001/XMLSchema),  this_leader - boolean (http://www.w3.org/2001/XMLSchema). Как это сделано вы можете посмотреть развернув у себя выгрузку данной конфигурации (ссылка в конце статьи).

Эту же схему можно описать вот так:

А теперь найди 7 отличий. Шучу, отличие только одно, я создал тип type_student и для свойства student определил тип (см. рисунок выше, если слишком мелко, жмакните на него). Это называется явным определением типа. А до этого мы занимались неявным определением типа. Во как! А теперь давайте прочитаем XML и создадим элементы справочника. Для этого я создал обработку «ЧитаемXML», который также можете посмотреть в выгрузке, здесь же приведу только код:

&НаКлиенте Процедура ОдинСтудент(Команда)
	
	ОдинСтудентСервер(XML);
	
КонецПроцедуры 
&НаСервереБезКонтекста Процедура ОдинСтудентСервер(XML)

	// Получаем тип XDTO и читаем XML 	лТип = ФабрикаXDTO.Тип("http://localhost/xdto", "students");
	лЧтение = Новый ЧтениеXML;
	лЧтение.УстановитьСтроку(XML);
	лОбъект = ФабрикаXDTO.ПрочитатьXML(лЧтение, лТип);
	лДанные = лОбъект.student;
	
	// Проверяю, нет ли этого студента в базе 	лЗапрос = Новый Запрос("ВЫБРАТЬ | Студенты.Ссылка |ИЗ | Справочник.Студенты КАК Студенты |ГДЕ | Студенты.Имя ПОДОБНО ""%"" + &Имя + ""%"" | И Студенты.Фамилия ПОДОБНО ""%"" + &Фамилия + ""%"" | И Студенты.ДатаРождения = &ДатаРождения");
						  
	лЗапрос.УстановитьПараметр("Имя", лДанные.name);
	лЗапрос.УстановитьПараметр("Фамилия", лДанные.last_name);
	лЗапрос.УстановитьПараметр("ДатаРождения", лДанные.birth);
	
	лРезультат = лЗапрос.Выполнить();
	
	// Если нет, создаю новый элемент 	Если лРезультат.Пустой() Тогда 		
		лСпр = Справочники.Студенты.СоздатьЭлемент();
		
	// Иначе редактирую имеющийся 	Иначе 		
		лВыборка = лРезультат.Выбрать();
		Пока лВыборка.Следующий() Цикл 			
			лСпр = лВыборка.Ссылка.ПолучитьОбъект();
			Прервать;
			
		КонецЦикла;
		
	КонецЕсли;
	
	// Заполняю данными, заметьте, никакого преобразования не требуется 	лСпр.Имя = лДанные.name;
	лСпр.Фамилия = лДанные.last_name;
	лСпр.ДатаРождения = лДанные.birth;
	лСпр.Пол = лДанные.sex;
	лСпр.Курс = лДанные.level;
	лСпр.ЭтоСтароста = лДанные.this_leader;
	
	лСпр.Записать();
	
КонецПроцедуры // ПрочитатьИЗаписатьСервер()  

Вы можете видеть, что код очень прост, и никакого преобразования элементов прочитанного XML не требуется, это делает уже ФабрикаXDTO. Ну что же, запустим нашу обработку и проверим, появится ли новый элемент в справочнике «Студенты». Ошибка!

 

Дело здесь вот в чем, в XML мы не указали name spaces (пространство имен), давайте возьмем XML, который я привел выше и добавим:

xmlns=»http://localhost/xdto» xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» — вот что мы добавили и все заработало.  Скачайте выгрузку базы данных (ссылка ниже), распакуйте у себя и попробуйте прочитать XML. Попробуйте изменить данные в XML, поэкспериментируйте.

СЛУЧАЙ II

Предположим что в XML у нас не один студент, а несколько (скорее всего так и будет):

Обратите внимание на комментарий , очень удобный редактор XML, а главное бесплатный. Если попробуете его прочитать с помощью схемы, которую мы сделали, вы получите ошибку, и это правильно, в схеме мы не указывали, что элементов student может быть много. Давайте исправим эту ситуацию, я создал новый пакет «ЧтениеСтуденты» и новое пространство имен «http://localhost/xdto/students» и изменил свойство «student»:


Обратите внимание, свойство «Максимальное количество» я изменил на «-1″, это означает, что элементов student может быть неограниченное количество. Если мы установим это свойство равным «3″, то элементов student не может быть больше 3 и т.д.  Для обработки этого XML я создал новую процедуру, привожу скрин обработки:


Кнопка «Один студент» эта старая процедура, когда в XML была информация только по одному студенту, кнопка «Много студентов» для обработки информации по неограниченному числу студентов. Не забудьте изменить пространство имен в XML (второй красный кружок на рисунке). Запускаю обработку и все получается! Меняю данные (кроме имени, фамилии и даты рождения, при их изменении создается новый элемент справочника) и созданные элементы редактируются! Ну просто великолепно!


А здесь можете полюбоваться на код. Конечно, нельзя запрос в цикл помещать, по хорошему, нужно все данные получить одним запросом, но оптимизацией не буду заниматься, лень мне:

&НаКлиенте Процедура МногоСтудентов(Команда)
	
	МногоСтудентовСервер(XML);
	
КонецПроцедуры 
&НаСервереБезКонтекста Процедура МногоСтудентовСервер(XML)

	// Получаем тип XDTO и читаем XML 	лТип = ФабрикаXDTO.Тип("http://localhost/xdto/many_students", "students");
	лЧтение = Новый ЧтениеXML;
	лЧтение.УстановитьСтроку(XML);
	лОбъект = ФабрикаXDTO.ПрочитатьXML(лЧтение, лТип);
	
	Для Каждого лДанные Из лОбъект.student Цикл 	
		
		// Проверяю, нет ли этого студента в базе 		лЗапрос = Новый Запрос("ВЫБРАТЬ | Студенты.Ссылка |ИЗ | Справочник.Студенты КАК Студенты |ГДЕ | Студенты.Имя ПОДОБНО ""%"" + &Имя + ""%"" | И Студенты.Фамилия ПОДОБНО ""%"" + &Фамилия + ""%"" | И Студенты.ДатаРождения = &ДатаРождения");
							  
		лЗапрос.УстановитьПараметр("Имя", лДанные.name);
		лЗапрос.УстановитьПараметр("Фамилия", лДанные.last_name);
		лЗапрос.УстановитьПараметр("ДатаРождения", лДанные.birth);
		
		лРезультат = лЗапрос.Выполнить();
		
		// Если нет, создаю новый элемент 		Если лРезультат.Пустой() Тогда 			
			лСпр = Справочники.Студенты.СоздатьЭлемент();
			
		// Иначе редактирую имеющийся 		Иначе 			
			лВыборка = лРезультат.Выбрать();
			Пока лВыборка.Следующий() Цикл 				
				лСпр = лВыборка.Ссылка.ПолучитьОбъект();
				Прервать;
				
			КонецЦикла;
			
		КонецЕсли;
		
		// Заполняю данными, заметьте, никакого преобразования не требуется 		лСпр.Имя = лДанные.name;
		лСпр.Фамилия = лДанные.last_name;
		лСпр.ДатаРождения = лДанные.birth;
		лСпр.Пол = лДанные.sex;
		лСпр.Курс = лДанные.level;
		лСпр.ЭтоСтароста = лДанные.this_leader;
		
		лСпр.Записать(); 	
	КонецЦикла;

КонецПроцедуры // МногоСтудентовСервер() 

Если вы заметили, ну конечно вы заметили, никакого преобразования типов делать не пришлось.

СЛУЧАЙ III

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

 

Попробуем его прочитать нашей обработкой. Что получили? Фигу!


И правильно! Мы же в фабрике указали что элентов students может быть от одного до бесконечности. А здесь у нас ноль, поэтому и ругается. Давайте исправим этот момент:


Обратили внимание? Ну конечно обратили, я же, блин, красным овалом выделял (жмакайте на скрин, чтобы сделать больше). Минимальное значение я сделал равным нулю, а максимальное значение оставил -1, т. е. неограниченным. Теперь все чики пуки ( не знаю с какого языка это выражение). Можете сами проверить, нажмите на кнопку «Много студентов» в обработке.

СЛУЧАЙ IV

Все! Мы вроде предусмотрели все случаи! Можно идти пить… чай ;) . Но тут нам присылают еще один XML:

Вставляем XML в текстовое поле, жмем «Много студентов». Что получаем? Ошибку! А почему, посмотрите на XML. Появился новый элемент comment (комментарий), который не учтен в нашей фабрике. Что же делать? Можно его включить в нашу схему, но что если опять придет файл уже с другим элементом XML? Этот случай можно обработать следующим образом, открываем в фабрике свойства type_student и свойство «Открытый» устанавливаем «Истина»:

 

Ну вот и все. Теперь XML у вас прочитается без проблем. Теперь тэг student может содержать кроме заданных любые другие тэги и они буду прочитаны как строковый тип. Т.е.  я могу использовать переданный мне элемент comment. Он определился как строковый. Свойство открытый означает, что тип может содержать кроме прописанных любые другие элементы, которые он прочитает как строковый. Все, выдохся. Удачи, везения и чтобы наглости вам не надо было занимать! dt-шка ниже.

Скачать файлы

Наименование Файл Версия Размер
xdto.zip
.zip 24,19Kb
29.01.14
86
.zip 24,19Kb 86 Скачать

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. davdykin 22 29.01.14 20:36 Сейчас в теме
Спасибо за статью. Действительно удобный механизм, и пару моментов для себя узнал новых.
user887351; jif; Мах; VzhenyaV; veiuper; check2; vz1987; MikeI; Chif13; rosinfo1; Makushimo; slavap; cleaner_it; rayastar; shalimski; +15 Ответить
2. Angeros 30.01.14 07:18 Сейчас в теме
Если механизм чтения xml через xdto позволяет читать его без схемы, возможна ли автоматическая генерация xsd схемы, хотя-бы в той части где стандартный механизм справился с чтением данных.?
3. Angeros 30.01.14 07:26 Сейчас в теме
Как будет читаться вот такой хмл?

...
<students>
<student>
<Name>Alex</student>
<sex>male</sex>
<date>2000-01-01</date>
<weighting unitOfMeasure="kg">70</weighting>
<Age>23</Age>
</student>
...
<students>
...
Показать


особенно строка <weighting unitOfMeasure="kg">70</weighting> в xdto уменя с такой строкой были трудности.
Она читалась, но число 70 не читалось.
7. kasper076 49 30.01.14 10:17 Сейчас в теме
(3) Angeros, есть такая беда. Если в узле присутствует атрибут и значение, то значение не читается.
10. John_d 2167 30.01.14 11:03 Сейчас в теме
(3) Angeros,
в ней ошибка:
<weighting unitOfMeasure=\"kg\">70</weighting>

правильно
<weighting unitOfMeasure="\kg\">70</weighting>
11. Angeros 30.01.14 12:04 Сейчас в теме
(10) John_d, Редактор инфостарта нерасчитан на публикацию текста xml у меня в редакторе все правильно написано, отображается чехорда. По этой причине автор выложил примеры хмл в виде изображений.
4. mrmasson 53 30.01.14 08:50 Сейчас в теме
Спасибо за статью! Удобно для начинающих рассматривать xdto. Самое главное все последовательно - от простого к сложному!
5. StaticUnsafe 30.01.14 09:10 Сейчас в теме
Яростно плюсую. Спасибо за ликбез!
6. Поручик 4363 30.01.14 10:14 Сейчас в теме
Очередная неплохая статья по XDTO.
8. fishca 1168 30.01.14 10:23 Сейчас в теме
Статья годная!!! Спасибо!!!
9. John_d 2167 30.01.14 11:01 Сейчас в теме
Отличная статья, Спасибо!
12. Swetlana 10 30.01.14 15:19 Сейчас в теме
Хорошая статья, надо будет изучить.
13. SinglCOOLer 210 30.01.14 15:27 Сейчас в теме
сначала было не хотел читать, но начал читать и втянулся, все круто описано, очень познавательно, спасибо
14. vasko88 4 30.01.14 19:02 Сейчас в теме
Спасибо, действительно грамотно и просто описано как работать с пакетам xdto
15. Evil Beaver 6603 31.01.14 00:36 Сейчас в теме
Пардон, не смог дочитать из-за вычурного стиля повествования. Выпендреж. Готов поверить коллегам, что статья годная.
16. EarlyBird 6 31.01.14 05:02 Сейчас в теме
17. JusteRU 31.01.14 05:10 Сейчас в теме
Спасибо! Очень интересная статья про ещё неизведанную часть 1С. А программно нельзя эти схемы формировать можно?
19. Alex1Cnic 125 31.01.14 08:48 Сейчас в теме
(17) JusteRU,
Присоединяюсь :А программно нельзя эти схемы формировать можно?
20. headMade 142 31.01.14 10:14 Сейчас в теме
21. Evil Beaver 6603 31.01.14 11:40 Сейчас в теме
(20) headMade, (19) Alex1Cnic, ну тогда и я отрекламируюсь, читайте тут:
http://infostart.ru/public/167459/
18. srv80 9 31.01.14 06:17 Сейчас в теме
Прочитать XML действительно не проблема с помощью XDTO, но сформировать XML по XDTO, который можно передать в качестве SOAP запроса на веб-сервер ... вот тут борода, которую пришлось решать через DCOM объект и таким кривым образом, что даже публиковать смешно )
53. blackschool 18 03.06.16 17:25 Сейчас в теме
(18) srv80, такую задачу можно решить, собирая текст soap-запроса конкатенацией шапки, подвала и текста XML, полученного из XDTO. Криво, но достаточно устойчиво работает, поскольку шапка и подвал универсальны.
22. rozer 262 31.01.14 12:52 Сейчас в теме
Молодца... и не сухо а с юмором :)
23. kiruha 382 31.01.14 12:56 Сейчас в теме
Нифига не понял, зачем, чтобы прочитать простой XML файл нужно менять конфигурацию и вводить новые объекты.
Без программного создания интересно только в познавательных целях

32. Alex_1066 04.02.14 17:19 Сейчас в теме
(23) А можно и поделиться с товарищами, и рассказать про ещё один вариант чтения (без изменения конфигурации). Я думаю всем будет интересно.
24. Makushimo 154 31.01.14 13:05 Сейчас в теме
Просто, легко и доступно.
Стиль изложения поднял настроение -))
25. glek 112 31.01.14 17:10 Сейчас в теме
Хорошая статья, спасибо. Ставлю в закладки.
26. rosinfo1 31.01.14 17:59 Сейчас в теме
Спасибо за статью, пол года назад потратил огромную кучу времени, пока понял что такое XDTO, и как его к веб-сервису прикрутить. Т.к документация в желтой книжке написана для людей которые понимают, что это такое, а не для таких как я ))
27. KliMich 31.01.14 18:19 Сейчас в теме
Сбасибо! Надо обязательно попробовать .
28. so-quest 130 02.02.14 16:56 Сейчас в теме
вот еще бы автор показал как namespace вставлять автоматом в те xml что присылают (руками то да, можно... но если файлов штук 500? если namespace'ов тоже больше 1? )...

Не качал конечно конфигу - но мои пять копеек чисто по статье
1. Пол может принимать любое строковое значение. Не всегда корректно. Потравив в статье пару абзацев можно было показать такой механизм как ограничения (ввести тип который принимает 2 значения "мужской" и "женский")
2. Нет примера записи
3. Нет примера создания схемы на лету (не всегда можно в конфигурацию встроить объект)
4. Нет примера на использование базового типа.
5. О типе число сказано вскользь, а ведь их несколько - на каждом свое ограничение.
Lacoste4life; check2; gingerale; SirYozha; kasper076; via; kiruha; Evil Beaver; kostas; +9 Ответить
30. headMade 142 03.02.14 15:04 Сейчас в теме
(28) so-quest,
ну так может у вас есть желание дать ответ на ваши вопросы в виде коментария или в виде статьи ????
29. qwed557 30 03.02.14 05:26 Сейчас в теме
отличная статья, надо подробно все изучить, и жизнь наладиться ))), еще бы для 7.7 такие фишки были бы, или они есть?
Прикрепленные файлы:
31. so-quest 130 03.02.14 17:12 Сейчас в теме
по 2,3,4 - напишу как нибудь, там ничего сложного, просто тупо пересказать СП
по 1 - лениво делать скриншоты
по 5 - читать http://www.ozon.ru/context/detail/id/7410082/ Слишком большая тема, в 1 статье ну никак не осветить
33. Alex_1066 04.02.14 17:20 Сейчас в теме
Статья хоршая, для начала.... Продолжение не помешало бы с учетом оговорок, данных читателями статьи в комментариях... Спасибо.
34. so-quest 130 04.02.14 21:14 Сейчас в теме
Анонс :)
Следите за новыми публикациями :)
Сейчас пройдет модерацию и сразу -

Построение XSD схемы на лету или любите СП источник знаний

В статье показаны 2 простых варианта создания схемы «на лету».
Приведенный код не следует рассматривать как законченное решение, скорее как расширеннее для синтаксис-помощника.
Код приводиться «как есть», я не несу никакой ответственности если что-то у вас поломается или пойдет не так.

Вариант №1
Используется СоздатьФабрикуXDTO. В архиве файл Вариант-1.epf

Вариант 2
Используется конструктор для ФабрикаXDTO В архиве файл Вариант-2.epf

Есть еще вариант №3 – основан на построении схемы – но мне этот вариант никогда был не интересен, поэтому оставим его добровольцам.
35. МимохожийОднако 129 05.02.14 07:48 Сейчас в теме
36. so-quest 130 05.02.14 11:15 Сейчас в теме
ответ на вопрос - как создавать фабрику на лету. Теперь не нужно насиловать конфигурацию, встраивая пакеты.

http://infostart.ru/public/256028/
37. kiruha 382 05.02.14 11:34 Сейчас в теме
(36)
Скооперировались бы с автором ))
Чтобы в одной статье все
38. help1Ckr 05.02.14 11:40 Сейчас в теме
Спасибо огромное за статью! Как раз мучаюсь с xml. Для мну это темный лес(
39. Yashazz 3042 09.02.14 13:48 Сейчас в теме
Ну, баянненько и попсовенько, трёпа много и толка маловато, но для совсем начинающих сгодится. Особенно для тех, кому встроенную справку 1С читать лень.

Если хотите действительно серьёзный подход - читайте статьи от Evil Beaver, рекомендую.

Автор, можешь подробно рассказать о создании xsd "с нуля" на основе объектов платформы? Хочу, понимаешь, все типы и фасеты описать, да чтоб программно. И ещё нужна статья о разнице в понимании схем для 1С и нормальных xsd-схем, или "почему 1С не читает валидные схемы".
И, до кучи, расскажи о работе с XPath :)

А то, понимаешь, "пророка" тут изображает, азы пересказывая...
Infactum; +1 Ответить
40. Peka 12.02.14 15:52 Сейчас в теме
Как прочитать? Можно с помощью объекта «ЧтениеXML», но тогда нужно будет построчно обрабатывать документ. И хорошо если уровней вложенности всего лишь 2-3. А если их 10.


Сделал загрузку и выгрузку документа через ЧтениеXML и ЗаписьXML в результате появился XML файл:
<DocumentObject.ЗаказКлиента>
	<Ref>db7359f0-065d-11e3-bb9e-f0def1177243</Ref>
	<DeletionMark>false</DeletionMark>
	<Date>2013-08-16T17:23:55</Date>
	<Number>000000001</Number>
	<Posted>false</Posted>
	<Клиент>70038ad4-0613-11e3-8b3a-f0def1177243</Клиент>
	<Склад>d1464cbc-0612-11e3-8b3a-f0def1177243</Склад>
	<Товары>
		<Row>
			<Товар>6ca1f6db-0615-11e3-8b3a-f0def1177243</Товар>
			<Количество>2</Количество>
			<Цена>5000</Цена>
			<Сумма>10000</Сумма>
		</Row>
	</Товары>
</DocumentObject.ЗаказКлиента>
Показать

и как результат вопрос: А есть механизм, который позволит проставить соответствие тегов при загрузке XML файла ?
42. so-quest 130 13.02.14 11:44 Сейчас в теме
(40) http://infostart.ru/public/256836/
(41) "ресурсы кушает меньше" - это такая шутка? DOM вообще-то в памяти разворачивается. И с точки зрения потребления памяти ЧтениеXML - выгодней. Или у вас какой-то специфический DOM?
В заголовке статьи говориться про XDTO, поэтому к вашему "очень удобен" - пример когда DOM контролирует тип и отвечает на вопрос - соответствует xml схеме или нет - можете привести? Думаю с вашим опытом это не составит труда.
43. Yashazz 3042 13.02.14 14:58 Сейчас в теме
(42) Я не про ЧтениеXML. Я про СписокXDTO и прочая, взятые через сериализатор, каковые более жадны, чем построитель и его вторичные выборки.
А что касается проверки, то это вы про ЧтениеХМЛ.ОткрытьФайл, который проверяет согласно набору схем? Вообще хороший вопрос, навскидку не отвечу, надо ещё поискать. Но, думаю, есть ходы.
41. Yashazz 3042 12.02.14 16:47 Сейчас в теме
Кстати, маленькая подсказка тем, кто не желает мучиться с обходами по ЧтениеXML - есть такая хорошая штука "ПостроительDOM". Работает быстро, ресурсы кушает меньше, чем любые коллекции XDTO, и вообще очень удобен.
47. Evil Beaver 6603 17.02.14 10:26 Сейчас в теме
(41) Yashazz, какие это ресурсы DOM кушает меньше?
44. so-quest 130 13.02.14 16:46 Сейчас в теме
Это плата за типизацию и верификацию. Если не нужны такие навороты - не используй схемы. там уже всякие xpath или xslt
45. so-quest 130 13.02.14 16:50 Сейчас в теме
там уже всякие xpath или xslt начинают рулить.
46. Zero_nv 126 17.02.14 08:15 Сейчас в теме
Обновите в статье картинки плиз.
48. CheBurator 3408 18.02.14 23:27 Сейчас в теме
ну да.. понятно, что вопросамы о потребляемых ресурсах - это не наш путь...
49. malikov_pro 20.02.14 19:05 Сейчас в теме
автору спс, мои 5 коп по теме

Имеем файл XML в 200 МБайт с не регламентированной структурой, платформа 8.3 (в БП 3.0 гружу),
при загрузке чз XDTO +1,5 ГБ ОЗУ, работает стабильно, при DOM за +2ГБ, 1 раз с ошибкой вылетел.
При этом в XDTO не самый удобный интерфейс при работе с 0-1 (может значение быть а может и не быть).

Решил задачу загрузкой отдельных элементов в структуру + ТЗ и её обработку (памяти на порядок меньше расходуется).

&НаСервере
Функция ЗначенияXMLВСтруктуру(ЧитатьXML, ИмяРодителя, НеЧитать=Ложь) 
// НеЧитать - это если уже в элемент структуры провалился
	Структура = Новый Структура;
	Ключ = "";
	Значение = "";
	Пока ЕстьЧтоЧитать(НеЧитать) Цикл
		///
		Если ЧитатьXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			Ключ = ЧитатьXML.Имя;
			ЧитатьXML.Прочитать();
			Если ЧитатьXML.ТипУзла = ТипУзлаXML.Текст Тогда
				Структура.Вставить(Ключ,ЧитатьXML.Значение);
			ИначеЕсли ЧитатьXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
				
				СтруктураВременная = ЗначенияXMLВСтруктуру(ЧитатьXML, Ключ, Истина);
				Если Структура.Свойство(Ключ,Значение) Тогда
					Если ТипЗнч(Значение) = Тип("Структура") Тогда
						ТЗ = ТаблицаЗначенийИзСтруктуры(Значение);
						ТЗ = ДобавитьСтруктуруКакСтрокуТЗ(ТЗ, СтруктураВременная);
					ИначеЕсли ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда
						ТЗ = ДобавитьСтруктуруКакСтрокуТЗ(Значение, СтруктураВременная);					
					КонецЕсли;
					Структура.Вставить(Ключ, ТЗ);
				Иначе
					Структура.Вставить(Ключ, СтруктураВременная);
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли (ЧитатьXML.Имя = ИмяРодителя) и (ЧитатьXML.ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда
			Возврат Структура;
		КонецЕсли;
		////
		НеЧитать = Ложь;
	КонецЦикла;
Возврат Структура;
КонецФункции

&НаСервере
Функция ТаблицаЗначенийИзСтруктуры(Структура)
	ТЗ = Новый ТаблицаЗначений;
	Для каждого Строка Из Структура Цикл
		ТЗ.Колонки.Добавить(Строка.Ключ);
	КонецЦикла;
	
	ТЗ = ДобавитьСтруктуруКакСтрокуТЗ(ТЗ, Структура);
	
	Возврат ТЗ;
	
КонецФункции

&НаСервере
Функция ДобавитьСтруктуруКакСтрокуТЗ(ТЗ, Структура)
	
	СтрТЗ = ТЗ.Добавить();
	Для каждого Строка Из Структура Цикл
		Попытка
			СтрТЗ[Строка.Ключ] = Строка.Значение;	
		Исключение
			ТЗ.Колонки.Добавить(Строка.Ключ);
			СтрТЗ[Строка.Ключ] = Строка.Значение;
		КонецПопытки;
		
	КонецЦикла;
	
	Возврат ТЗ;
КонецФункции

&НаСервере
Функция ЕстьЧтоЧитать(Флаг)
	
	Если Флаг Тогда
		Возврат(Истина);
	КонецЕсли; 
	
	Если ЧитатьXML.Прочитать() Тогда
		Возврат(Истина);
	Иначе
		//Предупреждение("Файл прочитан полностью!");
	    Возврат(Ложь);
	КонецЕсли;
КонецФункции


Показать


проверку на значение 0-1 организовал
Если Структура.Свойство("type",Значение) И Значение = "у" Тогда
52. d0dger 81 28.02.14 12:52 Сейчас в теме
(49) угу, тоже делал подобное в дерево структур
51. so-quest 130 20.02.14 21:39 Сейчас в теме
для проверки на 0-1 проще добавить в схему предопределеное значение. или развести на 2 разных типа.
54. Lacoste4life 11.08.19 20:27 Сейчас в теме
Огромное спасибо автору данной статьи! Единственная статья, по которой у меня получилось с нуля создать пакет и считать XML файл! Браво!
Оставьте свое сообщение

См. также

Рекомендательный сервис на основе коллаборативной фильтрации на 1С. Расширение формы подбора для УТ 11.4

Инструменты и обработки Программист Расширение (cfe) v8 ERP2 УТ11 КА2 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия УУ Абонемент ($m) Оптовая торговля Розничная торговля Практика программирования Математика и алгоритмы

В данной разработке реализован механизм рекомендаций товаров по принципу схожести товаров в корзине на основе алгоритма Item-to-Item от Amazon. Разобран алгоритм с демо базой и сделано расширение для УТ11.4 которое добавляет в форму подбора таблицу рекомендаций. Протестировано на 8.3.13.1865 на Управление торговлей, редакция 11 (11.4.8.63)

3 стартмани

25.09.2019    4616    10    informa1555    24       

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Конвейер проверки качества кода

Инструменты и обработки Программист Архив с данными v8 1cv8.cf Windows Абонемент ($m) Инструментарий разработчика Практика программирования Математика и алгоритмы

Jenkinsfile для выполнения проверки качества кода. Собирает информацию с АПК, EDT и BSL-LS. Сопоставляет ошибки с гит-репозиторием, выгруженным ГитКонвертором. Отправляет в Сонар.

3 стартмани

04.09.2019    11839    18    Stepa86    44       

Еще раз о рабочих днях. Быстрый способ расчета в запросах

Статья Программист Архив с данными v8 Абонемент ($m) Практика программирования Математика и алгоритмы Разработка

В статье рассмотрен механизм учета производственных графиков и рабочих дней. Предложен простой и быстрый алгоритм решения типичных задач: добавление рабочих дней к дате и нахождение разницы между датами в рабочих днях. Все вычисления производятся исключительно запросом, т.е. решение пригодно для СКД и динамических списков.

1 стартмани

20.06.2019    3665    Alxby    6       

INFOSTART MEETUP Kazan. 13 марта 2020 г. Промо

Инфостарт продолжает путешествие по России. Следующая остановка - Казань. Тема мероприятия - управление и технологии автоматизации учета на платформе "1С: Предприятие". Ждем всех: докладчиков и участников! Стоимость участия - 5 500 рублей. Цена действительна до 30.01.2020

5 500

Функциональное программирование в 1С

Статья Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Практика программирования Математика и алгоритмы Разработка

Статья о функциональном программировании в 1С. Добавляем новые возможности. Пример передачи функций в качестве аргумента.

1 стартмани

28.03.2019    6696    alexey.kutya    26       

Новый раздел на Инфостарте - Electronic Software Distribution Промо

Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.

  • Низкие цены, без скрытых платежей и наценок
  • Оперативная отгрузка
  • Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
  • Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)

Иерархия библиотек. Автоматическое обновление или как отказаться от переопределяемых модулей

Статья Программист Архив с данными v8 Абонемент ($m) Практика программирования Математика и алгоритмы Разработка

В статье рассмотрен один из вариантов библиотечного подхода к разработке, позволяющий организовать иерархический вызов библиотечных процедур и упростить автоматическую сборку готового продукта из нескольких библиотек. Предлагаемый подход может служить одним из элементов CI/CD при разработке ПО на платформе 1С.

1 стартмани

04.03.2019    3835    Alxby    4       

Жизненный цикл управляемой формы. Шпаргалка разработчика

Статья Программист Архив с данными v8::УФ 1cv8.cf Абонемент ($m) Практика программирования Математика и алгоритмы

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

1 стартмани

29.06.2018    25132    54    stas_ganiev    26       

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Принципы ООП в 1С на примере реализации pattern Decorator

Статья Программист Архив с данными v8 1cv8.cf Абонемент ($m) Математика и алгоритмы

В данной статье будет рассмотрен пример реализации GoF паттерна проектирования decorator в среде разработки 1С. Основная цель данного шаблона, это возможность динамического расширения функциональности базового класса. Сразу оговорюсь, т.к. в 1С нет ООП, это будет не чистый пример реализации данного шаблона, однако свою задачу данный пример будет решать.

1 стартмани

21.06.2018    9258    4    lazarenko    6       

Строим "фасады" в 1С

Статья Программист Конфигурация (md, cf) v8 Россия Абонемент ($m) Практика программирования Математика и алгоритмы

Как реализовать функционал, чтобы не было “мучительно больно” при расширении требований.

1 стартмани

04.05.2018    15585    3    ktb    41       

1C:Предприятие для программистов: Запросы и отчеты. Второй поток. Онлайн-интенсив с 17 марта по 16 апреля 2020 г. Промо

Данный онлайн-курс предусматривает углубленное изучение языка запросов и возможностей системы компоновки данных, которые понадобятся при разработке отчетов, работающих на платформе “1С:Предприятие” в рамках различных прикладных решений. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей различных прикладных решений, которые используют в своей работе отчеты разного назначения.

6500 рублей

Нечеткое сравнение строк. Метод Джаро-Винклера на 1С

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8::УФ 1cv8.cf Абонемент ($m) Математика и алгоритмы

Схожесть строк. Метод Джаро-Винклера. В обработке реализован алгоритм нечеткого сравнения строк.

3 стартмани

20.04.2018    16255    71    Serg1701    19       

"Взлом" теста "1С:Профессионал" методом машинного обучения

Статья Программист Внешний отчет (ert,erf) v8 1cv8.cf Абонемент ($m) Практика программирования Математика и алгоритмы

Нейронные сети – не единственная модель, реализующая принципы машинного обучения. Есть еще байесовская модель, которая математически строже и определеннее, поскольку построена на надежном фундаменте теории вероятностей. Применению байесовского вывода к решению интересной теоретической задачи и посвящена данная статья. Слово "взлом" в заголовке использовано для привлечения внимания. Речь идет исключительно о математическом методе, показанном на примере знакомой всем задачи. 

12.03.2018    16860    95    ildarovich    19       

Онлайн-курс "Подготовка к экзамену 1С:Эксперт и 1С:Профессионал по технологическим вопросам" с 7 по 24 апреля 2020 г. Промо

На курсе вы получите практические навыки решения задач производительности 1С, в том числе характерных для высоконагруженных информационных систем (более 1000 пользователей). Подготовка к экзамену – только одна из составляющих курса. 70% слушателей приходят за знаниями, которые позволят расти и зарабатывать, делать сложные задачи на крупных проектах.

16450 рублей

Случайность, совпадение, закономерность. Генератор случайных чисел

Статья Программист Внешняя обработка (ert,epf) v8 1cv8.cf Windows Абонемент ($m) Практика программирования Математика и алгоритмы Игры

Объект ГенераторСлучайныхЧисел удобно выдает случайные числа в заданном интервале значений. Исследование особенностей, рассуждения на тему случайных чисел, практика применения. Увлекательно в игровой форме можно исследовать работу генератора случайных чисел.

1 стартмани

20.01.2018    18491    2    Ликреонский    58       

Github и 1С. Пошаговая инструкция на конкретном примере

Статья Программист Архив с данными v8 Абонемент ($m) Математика и алгоритмы

Статья для тех, у кого есть неудержимое желание программировать и хочется доработать какую-то конфигурацию (или проект на 1С), выложенный на Github, но останавливают незнакомые слова Git, Github, Fork, Commit, Pull request, Merge, Issue.

1 стартмани

26.10.2017    38719    5    BlizD    51       

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов

Статья Программист Архив с данными v8 1cv8.cf Россия Абонемент ($m) Практика программирования Математика и алгоритмы Универсальные функции Производительность и оптимизация (HighLoad)

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    42371    168    DarkAn    86       

Планы обмена. Скрестить ужа с ежом ... миссия выполнима =)

Статья Программист Архив с данными v8 Windows Абонемент ($m) Практика программирования Математика и алгоритмы

Небольшое исследование возможности улучшить работу планов обмена 1С средствами SQL Server: view and triggers. Результаты имеют больше теоретическое, чем практическое значение. Однако тем, кто ищет нестандартные решения, статья может понравиться =)

1 стартмани

10.01.2017    11625    3    zhichkin    4       

Базовый курс по обмену данными в системе 1С:Предприятие. Онлайн-интенсив с 12 по 28 мая 2020 г. Промо

Данный онлайн-курс предусматривает изучение механизмов платформы “1С:Предприятие”, обеспечивающих обмен данными между различными прикладными 1С-решениями и взаимодействие с другими информационными системами. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”.

5500 рублей

1С+Классы. Версия-0

Инструменты и обработки Программист Архив с данными v8 1cv8.cf Windows Абонемент ($m) Разработка внешних компонент Математика и алгоритмы

Разработано ООП-расширение языка 1С, включающее (но не ограничивающееся): Классы как абстрактные типы данных с элементами «переменная», «свойство», «функция», «процедура»; Интерфейсы как абстрактные классы без элементов состояния («переменная») и без привязки к реализации методов (свойств, процедур, функций) при определении; Имплементация (реализация) интерфейсов классами; - одиночное открытое наследование; Области видимости «внутренняя» (private), «экспорт» (public), «защищенная» (protected); Статические элементы классов (общие для всех экземпляров класса); Замещение (переопределение реализации) методов при наследовании – «виртуальные методы, свойства»; Сокрытие (затенение) обычных (не замещаемых) элементов при наследовании; Перегрузка процедур и функций по количеству и типам данных аргументов; Конструкторы класса; Деструктор класса; Слабые ссылки; Делегаты.

1 стартмани

28.10.2016    17881    14    IntelInside    68       

Управление ИТ-проектами. Модуль 2: продвинутый онлайн-курс по классическим методам управления проектами. Вебинары проходят с 12 марта по 11 июня 2020 года. Промо

Продвинутый онлайн-курс по классическому управлению ИТ-проектами позволит слушателям освоить инструменты из PMBoK® и 1С:Технологии корпоративного внедрения и научиться их применять для проектов любого масштаба. Курс включает в себя 12 вебинаров и 12 видеолекции, разбор кейсов и рекомендации экспертов по проектам слушателей. Ведущая курса - Мария Темчина.

от 13000 рублей

Генетический алгоритм для решения простой задачки

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Математика и алгоритмы

Генетический алгоритм в решении задачи: Необходимо расставить правильно (по другому) скобки, чтобы получилось 850 (1 + 2) (3 + 4) (5 + 6) (7 + 8) (9 + 10) (11 + 12) (13 + 14) + 15

1 стартмани

26.09.2016    8438    5    eugeniezheludkov    4       

Объектные блокировки

Инструменты и обработки Программист Конфигурация (md, cf) v8 Россия Абонемент ($m) Практика программирования Математика и алгоритмы

При работе с объектными данными (справочники, документы, планы счетов и т.д.) система «1С:Предприятие» обеспечивает два вида объектных блокировок: пессимистическую и оптимистическую. Они позволяют выполнять целостные изменения объектов при одновременной работе нескольких пользователей.

1 стартмани

17.08.2016    25423    10    Ranis1286    5       

​​​​​​​CorelDRAW Graphics Suite 2019 Промо

CorelDRAW – пакет профессиональных инструментов для редактирования фотографий, разработки дизайна, создания макетов страниц и векторных иллюстраций

Использование методов глобального контекста в системе компоновки данных или недокументированные возможности СКД

Инструменты и обработки Программист Внешний отчет (ert,erf) v8::УФ v8::СКД 1cv8.cf Windows Абонемент ($m) Практика программирования Математика и алгоритмы

Прочитал на форуме, что СтрРазделить() и ТекущаяДата() работают в языке выражений системы компоновки данных. Почитал справку, там ничего не нашёл, поэтому не поверил. Посмотрел на практике – и правда работает… В данной статье попытался привести весь перечень методов, работающих в СКД, но не описанных в документации.

1 стартмани

05.08.2016    32925    27    klinval    39       

Еще один способ расчета остатков на каждый день в запросе

Инструменты и обработки Программист Внешний отчет (ert,erf) v8 Абонемент ($m) Математика и алгоритмы Практика программирования

Предлагается новый способ расчета остатков на каждый день (час, минуту, секунду) в запросе. Способ не требует предварительного формирования таблицы дат и также подходит для расчета курсов валют, цен номенклатуры и других периодических сведений на каждую дату периода. На больших объемах данных предлагаемый способ может превосходить по быстродействию ранее известные методы из-за линейной (в лучшем случае) зависимости трудоемкости от длины периода.

1 стартмани

24.04.2016    30353    47    ildarovich    21       

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

Пример рекурсивной выгрузки иерархической структуры в XDTO

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Математика и алгоритмы Внешние источники данных WEB

Решил реализовать иерархию в пакете XDTO и выгрузить ее рекурсивно. Задача оказалась нетривиальной, хотя и весьма простой. Изысканиями решил поделиться с народом, чтобы не пропадало народное добро.

1 стартмани

26.02.2016    31016    14    starik-2005    3       

Нелинейная многомерная оптимизация - это просто. Часть 3. Имитация отжига

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Инструментарий разработчика Математика и алгоритмы Универсальные функции

Метод имитации отжига для поиска оптимального решения. И, как обычно, универсальная функция поиска этого самого решения.

1 стартмани

13.10.2015    16337    23    dusha0020    5       

Голосование за доклады на INFOSTART MEETUP Kazan - до 25 февраля. Промо

Выбирайте и голосуйте за самые интересные доклады! Лучшие из лучших попадут в окончательную программу казанского митапа. Оставить свой голос можно до 25 февраля 2020 года.

Пример сериализации объектов в 1С 8.3 и их восстановления из сериализованных данных

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf Россия Windows Абонемент ($m) Математика и алгоритмы Обмен через XML Перенос данных из 1C8 в 1C8

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

1 стартмани

05.07.2015    24638    78    katkov_a    29