Загнать XML-файл в справочник одной командой
С Новым годом!
Имеется некий XML-файл следующей структуры:
Требуется как можно проще перекинуть его в справочник с одноимёнными полями, то есть на каждый контейнер добавляется своя запись идёт в поле URL, идёт в поле FileName и т.д.
Можно ли как-то импортировать его одной командой без обхода XML и добавления по одной записи? Через XDTO или что-нибудь в этом духе?
А можно ли импортировать не все поля, а только некоторые?
А записи с определённым(и) значениями State?
А если использовать поле URL как ключ, то есть, если встретится контейнер со значением контейнера , которое ужЕ есть в справочнике, то вместо добавления записи в справочник перезаписывались бы реквизиты записи с данным значением поля URL?
Имеется некий 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>
<FileName>...</FileName>
Можно ли как-то импортировать его одной командой без обхода XML и добавления по одной записи? Через XDTO или что-нибудь в этом духе?
А можно ли импортировать не все поля, а только некоторые?
А записи с определённым(и) значениями State?
А если использовать поле URL как ключ, то есть, если встретится контейнер
<DownloadFile> ... </DownloadFile>
<URL> ... </URL>
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) Это ограничит количество итераций и, соответственно, увеличит производительность. А преобразование текста в таблицу (при любом подходе) тоже отнимает ресурсы. Единственный вариант, который я еще учитываю - формирование или преобразование XML в строку, с которой можно получить таблицу значений или массив с помощью метода ЗначениеИзСтрокиВнутр. Но это тоже сомнительный подход.
Главное тут - правильно создать схему. Кто-то пользуется какими-то редакторами, я создаю через пакеты XDTO. Схема для этой обработки выглядела как на скрине. Потом - экспорт XML схемы в файл, добавляем в обработку макет, тип - двоичные данные, загружаем схему из файла. Редактировать тоже просто - выгружаем схему из макета в файл, потом ПКМ на корне ветки конфигурации "XDTO-пакеты" - Импорт XML-схемы.
Прикрепленные файлы:

(9)
То есть нужно добавить типы объектов "DownloadFile" и "DownloadList" и в "DownloadFile" добавить его внутренние контейнеры в виде свойств? А если некоторые из них не нужны, например, "DownloadTime", то можно ли их не добавлять?
То есть связь обработки с XDTO-пакетом происходит через загрузку-выгрузку макета черз промежуточный файл? А можно ли из обработки достучаться до XDTO-пакета сразу?
В обработке в форме в таблице значений колонки тоже нужно добавлять руками или они откуда-то автоматически подцепляются? А если поставить тип не "Строка", а "Число" или "Дата" преобразуется ли автоматически?
Я правильно понимаю, что внешняя обработка - объект своей собственной формы?
Что тут подразумевается под "Данные"? В моей справке у формы такого свойства нет, только у её элементов.
"Результат" - это просто переменная?
Цикл только один, потому что Результат.DownloadFile это коллекция контейнеров "DownloadFile"?
Пример работает, а что здесь нужно изменить, чтобы вместо таблицы значений данные загнать в справочник или регистр сведений?
я создаю через пакеты XDTO. Схема для этой обработки выглядела как на скрине
То есть нужно добавить типы объектов "DownloadFile" и "DownloadList" и в "DownloadFile" добавить его внутренние контейнеры в виде свойств? А если некоторые из них не нужны, например, "DownloadTime", то можно ли их не добавлять?
загружаем схему из файла. Редактировать тоже просто - выгружаем схему в файл, потом ПКМ на корне ветки конфигурации "XDTO-пакеты" - Импорт XML-схемы.
То есть связь обработки с XDTO-пакетом происходит через загрузку-выгрузку макета черз промежуточный файл? А можно ли из обработки достучаться до XDTO-пакета сразу?
В обработке в форме в таблице значений колонки тоже нужно добавлять руками или они откуда-то автоматически подцепляются? А если поставить тип не "Строка", а "Число" или "Дата" преобразуется ли автоматически?
Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет("Схема")
Я правильно понимаю, что внешняя обработка - объект своей собственной формы?
Данные = ПолучитьСхему();
Данные.Записать(ИмяФайлаСхемы);
Что тут подразумевается под "Данные"? В моей справке у формы такого свойства нет, только у её элементов.
Результат = Фабрика.ПрочитатьXML(Чтение);
"Результат" - это просто переменная?
Для каждого Элемент Из Результат.DownloadFile Цикл
ЗаполнитьЗначенияСвойств(ТаблицаЗагрузки.Добавить(), Элемент)
КонецЦикла;
Цикл только один, потому что Результат.DownloadFile это коллекция контейнеров "DownloadFile"?
Пример работает, а что здесь нужно изменить, чтобы вместо таблицы значений данные загнать в справочник или регистр сведений?
(10)
Конечно, можно, структура схемы - целиком на ваше усмотрение.
Можно, через пространство имен (в примере это "http://www.sample-package.org").
Я создал колонки руками, по примеру. В принципе, если имена узлов совпадают с именами реквизитов справочника, то ЗаполнитьЗначенияСвойств заполняет все значения.
С типами надо уже смотреть конкретные примеры. В каком формате приходят данные. В принципе, в схеме можно указать тип свойства, а на входе делать преобразование через XMLЗначение.
Да, это реквизит формы.
Данные - это имя переменной, в которую возвращается макет (с типом двоичные данные). Записать() - это метод типа ДвоичныеДанные.
Результат - это просто переменная, да.
Результат.DownloadFile - да, это коллекция с типом СписокXDTO.
Изменить нужно - вместо добавления строки добавлять элемент справочника и заполнять реквизиты, обращаясь к реквизитам элемента коллекции (в примере - переменная Элемент) через точку.
А если некоторые из них не нужны, например, "DownloadTime", то можно ли их не добавлять?
Конечно, можно, структура схемы - целиком на ваше усмотрение.
А можно ли из обработки достучаться до XDTO-пакета сразу?
Можно, через пространство имен (в примере это "http://www.sample-package.org").
В обработке в форме в таблице значений колонки тоже нужно добавлять руками или они откуда-то автоматически подцепляются? А если поставить тип не "Строка", а "Число" или "Дата" преобразуется ли автоматически?
Я создал колонки руками, по примеру. В принципе, если имена узлов совпадают с именами реквизитов справочника, то ЗаполнитьЗначенияСвойств заполняет все значения.
С типами надо уже смотреть конкретные примеры. В каком формате приходят данные. В принципе, в схеме можно указать тип свойства, а на входе делать преобразование через XMLЗначение.
Я правильно понимаю, что внешняя обработка - объект своей собственной формы?
Да, это реквизит формы.
Данные - это имя переменной, в которую возвращается макет (с типом двоичные данные). Записать() - это метод типа ДвоичныеДанные.
Результат - это просто переменная, да.
Результат.DownloadFile - да, это коллекция с типом СписокXDTO.
Изменить нужно - вместо добавления строки добавлять элемент справочника и заполнять реквизиты, обращаясь к реквизитам элемента коллекции (в примере - переменная Элемент) через точку.
Можно очень сложно и почти "одной командой" сделать - преобразовать через XSLT в формат, пригодный для скармливания сериализатору XDTO, на выходе которого получить массив объектов и в цикле пробежаться и записать их. Но саму схему преобразований написать сложнее будет, чем код для циклического обхода контейнеров списка.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот