В современном мире веб-технологий для получения какой-либо информации повсеместно используются различные web и http сервисы, обменивающиеся данными, записанными в определенных, заранее согласованных форматах по определенным правилам. Одним из самых популярных таких форматов является XML. Естественно, приходится с ним работать и из 1С...
Что чаще всего приходится делать с XML в 1С?
1. Получить XML (Из уже существующего файла, через веб-сервис, http-сервис и т.д.);
2. Каким-то образом вытянуть нужные нам данные из полученных данных.
Хотелось бы остановиться на втором пункте. Какие методы используете для этого вы? Я встречал, в основном, несколько вариантов: XDTO и ЧтениеXML. XDTO классная штука, которая позволяет быстро из xml-ки получить заранее определенные объекты по заданным нами правилами. Удобно. Но нужно описывать и создавать XDTO-пакеты, изменять конфигурацию....Второй вариант, через объект ЧтениеXML. Он наиболее прост и популярен. Создали его, показали ему файлик, и с помощью метода "Прочитать()" обходим в цикле. Все работает, но, это все таки цикл, а файл может быть большим. Да и что бы в этом цикле получить только нужную информацию приходится делать кучу условий...
Так что же делать? А может, можно обойтись без циклов, условий, познаний в XDTO? Можно.
Итак, расскажу, какой способ использую я. Практически всегда мы можем получить данные о схеме получаемых XML-данных. Ну или хотя бы примерно мы должны знать, где там и что лежит. Поэтому, с помощью объекта "ПреобразованиеXSL" мы можем преобразовать данные к нужной схеме. И вот тут мы можем схитрить.
Я думаю, практически все слышали о паре методов "ЗначениеВСтрокуВнутр" и "ЗначениеИзСтрокиВнутр". Как связано с нашим вопросом? А вот как. Типовые объекты, будь то, например, структура или таблица значений, с помощью этих методов можно преобразовать в строку и обратно. Причем, для объектов одного типа правила получения этой строки одни и те же. А что нам мешает, с помощью XSL из XML получить данные в таком же формате, а потом с помощью метода "ЗначениеИзСтрокиВнутр" получить уже готовый, заполненный, объект 1С? Ничего. Причем, делать мы будем преобразование ТЕКСТА, а значит, отработает оно очень быстро.
Приведу пример (обработка с примеров для УФ 8.3 во вложении). Возьмем для примера такую xml.
Здесь содежатся данные о заказе, адресе покупателя и выбранных товарах. На выходе нам нужно получить таблицу, вида:
Номер заказа | Адрес | Номенклатура | Количество | Сумма |
Для этого, для платформ 8.3, воспользуемся следующей строкой преобразования:
В результате преобразования получаем:
{"#",acf6192e-81ca-46ef-93a6-5a6968b78663,
{9,
{5,
{0,"НомерЗаказа",
{"Pattern"},"Строка",0},
{1,"Адрес",
{"Pattern"},"Строка",0},
{2,"Номенклатура",
{"Pattern"},"Строка",0},
{3,"Количество",
{"Pattern",
{"N",10,2,0}
},"",0},
{4,"Сумма",
{"Pattern",
{"N",15,4,0}
},"",0}
},
{2,5,0,0,1,1,2,2,3,3,4,4,
{1,2,{2,0,5,{"S","99503"},{"S","Tai Yee"},{"S","Lawnmower"},{"N",1},{"N",148.95},0},
{2,1,5,{"S","99503"},{"S","Tai Yee"},{"S","Baby Monitor"},{"N",2},{"N",39.98},0}},
4,1},{0,0}}}
В коде все преобразование выглядит так:
ПреобразованиеXSL = Новый ПреобразованиеXSL;
ПреобразованиеXSL.ЗагрузитьИзСтроки(Объект.СтрокаПреобразования);
Объект.СтрокаИтоговая = ПреобразованиеXSL.ПреобразоватьИзСтроки(Объект.СтрокаXML);
После этого к получившейся строке применяем метод "ЗначенийИзСтрокиВнутр" и получаем:
Все преобразование происходит практически мгновенно. Во вложении прикрепил обработку для тестирования описанного механизма с возможностью использования примера из статьи.
P.S. Не уверен, что никто ранее такого ни делал, но я ранее об этом методе не слышал.
P.S.S. То, как должна выглядеть сериализованная таблица значений, вычислял эксперементально, если у кого-то есть ссылка на какую-то информацию, буду благодарен. И да, для 8.2 и 8.3 есть небольшие отличия. Если будет нужна строка преобразования для 8.2, пишите в комментах.
UPD. Добавлена обработка для обычных форм с примером для 8.2.