Загнать XML-файл в справочник одной командой

1. Дмитрий Захаров (DWZ2) 01.01.17 13:04 Сейчас в теме
С Новым годом!

Имеется некий XML-файл следующей структуры:

<?xml version="1.0" encoding="UTF-8"?>
<DownloadList  Version="6"
   NextID="13762">
 <DownloadFile>
         <ID>1</ID>
         <URL>...</URL>
         <FileName>...</FileName>
         <State>2</State>
         <Size>...</Size>
         <SaveDir>...\</SaveDir>
         <DownloadedSize>...</DownloadedSize>
         <LastModified>...</LastModified>
         <ResumeMode>...</ResumeMode>
         <Date>...</Date>
         <DownloadTime>...</DownloadTime>
         <NodeID>...</NodeID>
         <ContentType>...</ContentType>
 </DownloadFile>
 <DownloadFile>
         <ID>1</ID>
         <URL>...</URL>
         <FileName>...</FileName>
         <State>2</State>
         <Size>...</Size>
         <SaveDir>...\</SaveDir>
         <DownloadedSize>...</DownloadedSize>
         <LastModified>...</LastModified>
         <ResumeMode>...</ResumeMode>
         <Date>...</Date>
         <DownloadTime>...</DownloadTime>
         <NodeID>...</NodeID>
         <ContentType>...</ContentType>
 </DownloadFile> 
. . .
</DownloadList>
...Показать Скрыть


Требуется как можно проще перекинуть его в справочник с одноимёнными полями, то есть на каждый контейнер
 <DownloadFile>  </DownloadFile> 
добавляется своя запись
<URL>...</URL>
идёт в поле URL,
 <FileName>...</FileName>
идёт в поле FileName и т.д.

Можно ли как-то импортировать его одной командой без обхода XML и добавления по одной записи? Через XDTO или что-нибудь в этом духе?

А можно ли импортировать не все поля, а только некоторые?

А записи с определённым(и) значениями State?

А если использовать поле URL как ключ, то есть, если встретится контейнер
 <DownloadFile> ... </DownloadFile> 
со значением контейнера
 <URL> ... </URL> 
, которое ужЕ есть в справочнике, то вместо добавления записи в справочник перезаписывались бы реквизиты записи с данным значением поля URL?
Вознаграждение за ответ
Показать полностью
Ответы
2. Виктор Григоренко (JohnGalt) 2 04.01.17 16:32 Сейчас в теме
Одной командой точно не получится. Можно для формирования/сопоставления по реквизитам создать регистр соответствий (реквизитов и контейнеров) и заполнять на основании введенных в регистр данных.
3. Дмитрий Захаров (DWZ2) 11.01.17 11:41 Сейчас в теме
(2)

А разве это избавит от ручного цикла по XML?

В идеале хотелось бы подключить XML как источник данных, выполнить запрос на создание таблицы - и вуаля!
4. antz Петров (antz) 11.01.17 12:06 Сейчас в теме
(1)
Через XDTO или что-нибудь в этом духе?


Через XDTO - да, элементарно.
5. Дмитрий Захаров (DWZ2) 11.01.17 12:29 Сейчас в теме
(4)

Как?

Сорри за назойливость ;)
6. antz Петров (antz) 11.01.17 12:30 Сейчас в теме
(5) Щас примерчик набросаю)
7. Виктор Григоренко (JohnGalt) 2 11.01.17 12:58 Сейчас в теме
(3) Это ограничит количество итераций и, соответственно, увеличит производительность. А преобразование текста в таблицу (при любом подходе) тоже отнимает ресурсы. Единственный вариант, который я еще учитываю - формирование или преобразование XML в строку, с которой можно получить таблицу значений или массив с помощью метода ЗначениеИзСтрокиВнутр. Но это тоже сомнительный подход.
8. antz Петров (antz) 11.01.17 13:04 Сейчас в теме
9. antz Петров (antz) 11.01.17 13:16 Сейчас в теме
Главное тут - правильно создать схему. Кто-то пользуется какими-то редакторами, я создаю через пакеты XDTO. Схема для этой обработки выглядела как на скрине. Потом - экспорт XML схемы в файл, добавляем в обработку макет, тип - двоичные данные, загружаем схему из файла. Редактировать тоже просто - выгружаем схему из макета в файл, потом ПКМ на корне ветки конфигурации "XDTO-пакеты" - Импорт XML-схемы.
Прикрепленные файлы:
10. Дмитрий Захаров (DWZ2) 11.01.17 14:36 Сейчас в теме
(9)
я создаю через пакеты XDTO. Схема для этой обработки выглядела как на скрине


То есть нужно добавить типы объектов "DownloadFile" и "DownloadList" и в "DownloadFile" добавить его внутренние контейнеры в виде свойств? А если некоторые из них не нужны, например, "DownloadTime", то можно ли их не добавлять?

загружаем схему из файла. Редактировать тоже просто - выгружаем схему в файл, потом ПКМ на корне ветки конфигурации "XDTO-пакеты" - Импорт XML-схемы.


То есть связь обработки с XDTO-пакетом происходит через загрузку-выгрузку макета черз промежуточный файл? А можно ли из обработки достучаться до XDTO-пакета сразу?

В обработке в форме в таблице значений колонки тоже нужно добавлять руками или они откуда-то автоматически подцепляются? А если поставить тип не "Строка", а "Число" или "Дата" преобразуется ли автоматически?

Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет("Схема")


Я правильно понимаю, что внешняя обработка - объект своей собственной формы?

Данные = ПолучитьСхему();
Данные.Записать(ИмяФайлаСхемы);


Что тут подразумевается под "Данные"? В моей справке у формы такого свойства нет, только у её элементов.

Результат = Фабрика.ПрочитатьXML(Чтение);


"Результат" - это просто переменная?

Для каждого Элемент Из Результат.DownloadFile Цикл
	ЗаполнитьЗначенияСвойств(ТаблицаЗагрузки.Добавить(), Элемент)
КонецЦикла;
...Показать Скрыть


Цикл только один, потому что Результат.DownloadFile это коллекция контейнеров "DownloadFile"?

Пример работает, а что здесь нужно изменить, чтобы вместо таблицы значений данные загнать в справочник или регистр сведений?
11. antz Петров (antz) 11.01.17 14:56 Сейчас в теме
(10)

А если некоторые из них не нужны, например, "DownloadTime", то можно ли их не добавлять?


Конечно, можно, структура схемы - целиком на ваше усмотрение.


А можно ли из обработки достучаться до XDTO-пакета сразу?


Можно, через пространство имен (в примере это "http://www.sample-package.org").


В обработке в форме в таблице значений колонки тоже нужно добавлять руками или они откуда-то автоматически подцепляются? А если поставить тип не "Строка", а "Число" или "Дата" преобразуется ли автоматически?


Я создал колонки руками, по примеру. В принципе, если имена узлов совпадают с именами реквизитов справочника, то ЗаполнитьЗначенияСвойств заполняет все значения.
С типами надо уже смотреть конкретные примеры. В каком формате приходят данные. В принципе, в схеме можно указать тип свойства, а на входе делать преобразование через XMLЗначение.

Я правильно понимаю, что внешняя обработка - объект своей собственной формы?


Да, это реквизит формы.

Данные - это имя переменной, в которую возвращается макет (с типом двоичные данные). Записать() - это метод типа ДвоичныеДанные.

Результат - это просто переменная, да.

Результат.DownloadFile - да, это коллекция с типом СписокXDTO.

Изменить нужно - вместо добавления строки добавлять элемент справочника и заполнять реквизиты, обращаясь к реквизитам элемента коллекции (в примере - переменная Элемент) через точку.
12. Sergey Andreev (starik-2005) 978 11.01.17 15:28 Сейчас в теме
Можно очень сложно и почти "одной командой" сделать - преобразовать через XSLT в формат, пригодный для скармливания сериализатору XDTO, на выходе которого получить массив объектов и в цикле пробежаться и записать их. Но саму схему преобразований написать сложнее будет, чем код для циклического обхода контейнеров списка.
kasper076; +1 Ответить
13. antz Петров (antz) 11.01.17 15:38 Сейчас в теме
Вот пример с "достукиванием" до XDTO-пакета (изменил в пакете пространство имен на "http://www.my-scheme.org").
Прикрепленные файлы:
1Cv8.cf
14. Александр Крынецкий (echo77) 736 12.01.17 17:31 Сейчас в теме
Оставьте свое сообщение