Перетворення XML на об’єкти 1С

У світі веб-технологій для отримання будь-якої інформації повсюдно використовуються різні 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, скористаємося наступним рядком перетворення:

перетворення

В результаті перетворення отримуємо:

У коді все перетворення виглядає так:

Після цього до рядка, що вийшов, застосовуємо метод "Значень зі рядків всередину" і отримуємо:

Усі перетворення відбувається практично миттєво. У вкладенні прикріпив обробку для тестування описаного механізму з можливістю використання прикладу статті.

P.S. Не впевнений, що ніхто раніше такого не робив, але раніше про цей метод не чув.

UPD. Додано обробку для звичайних форм з прикладом для 8.2.