1. DWZ2 01.01.17 13:04 Сейчас в теме

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

С Новым годом!

Имеется некий 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?
Вознаграждение за ответ
Показать полностью
Ответы
Избранное Подписка Сортировка: Древо
4. antz 11.01.17 12:06 Сейчас в теме
(1)
Через XDTO или что-нибудь в этом духе?


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

Как?

Сорри за назойливость ;)
6. antz 11.01.17 12:30 Сейчас в теме
(5) Щас примерчик набросаю)
2. JohnGalt 14 04.01.17 16:32 Сейчас в теме
Одной командой точно не получится. Можно для формирования/сопоставления по реквизитам создать регистр соответствий (реквизитов и контейнеров) и заполнять на основании введенных в регистр данных.
3. DWZ2 11.01.17 11:41 Сейчас в теме
(2)

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

В идеале хотелось бы подключить XML как источник данных, выполнить запрос на создание таблицы - и вуаля!
7. JohnGalt 14 11.01.17 12:58 Сейчас в теме
(3) Это ограничит количество итераций и, соответственно, увеличит производительность. А преобразование текста в таблицу (при любом подходе) тоже отнимает ресурсы. Единственный вариант, который я еще учитываю - формирование или преобразование XML в строку, с которой можно получить таблицу значений или массив с помощью метода ЗначениеИзСтрокиВнутр. Но это тоже сомнительный подход.
8. antz 11.01.17 13:04 Сейчас в теме
9. 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 11.01.17 14:56 Сейчас в теме
(10)

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


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


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


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


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


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

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


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

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

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

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

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

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 110 000 руб. до 120 000 руб.
Полный день

Аналитик 1С
Санкт-Петербург
зарплата от 80 000 руб.
Полный день

Программист 1С
Самара
зарплата от 50 000 руб.
Полный день

Программист 1С
Нижний Новгород
зарплата до 120 000 руб.
Полный день

Программист 1С
Волгоград
зарплата от 45 000 руб. до 90 000 руб.
Полный день