Преобразовать xml файл в строку 1с
1С 8.3 БСП ЗначениеВСтрокуXML. Преобразует (сериализует) любое значение в XML-строку. Преобразованы в могут быть только те объекты, для которых в синтаксис-помощнике указано, что они сериализуются.
// тест
Результат = ОбщегоНазначения . ЗначениеВСтрокуXML ( "тест" )
// // xmlns="http://v8.1c.ru/8.1/data/enterprise/current-config"
// xmlns:xs="http://www.w3.org/2001/XMLSchema"
// xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
// xsi:type="CatalogRef.Номенклатура">
// f93e113e-c83a-11e2-8026-0015e9b8c48d
//
Результат = ОбщегоНазначения . ЗначениеВСтрокуXML ( Номенклатура )
// Метод в основном используется для сохранения/загрузки настроек
&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
СтрокаXML = ПолучитьИзВременногоХранилища ( Параметры . АдресВоВременномХранилище );
Ведомость = ОбщегоНазначения . ЗначениеИзСтрокиXML ( СтрокаXML ); // ТЗ из XML строки
Обработка = РеквизитФормыВЗначение ( "Объект" );
Обработка . Зарплата . Загрузить ( Ведомость . Зарплата . Выгрузить ());
&НаСервере
Процедура ЗаписатьНаСервере ()
СтрокаXML = ПолучитьИзВременногоХранилища ( АдресВоВременномХранилище );
Ведомость = ОбщегоНазначения . ЗначениеИзСтрокиXML ( СтрокаXML ); // ТЗ из XML строки
Обработка = РеквизитФормыВЗначение ( "Объект" );
Ведомость . Зарплата . Загрузить ( Обработка . Зарплата . Выгрузить ());
СтрокаXML = ОбщегоНазначения . ЗначениеВСтрокуXML ( Ведомость ); // ТЗ в XML строку
ПоместитьВоВременноеХранилище ( СтрокаXML , АдресВоВременномХранилище );
Если по ходу отладочной сессии возникает необходимость вытащить из программного кода не просто текст запроса, а экземпляр – то есть запрос с уже установленными параметрами, готовый к выполнению в консоли – это можно сделать при помощи БСП. Нам потребуется конструкция:
Если остановить выполнение процедурного кода на соответствующей строке, поместить указанную конструкцию в табло, на выходе мы получим XML-дамп нашего объекта Запрос.
Да, конечно, потребуется вручную скопировать этот дамп в буфер, переключиться на дополнительный клиентский сеанс, открыть там консоль запросов (поставляется в комплекте БСП) и выполнить загрузку запроса из XML-дампа. Но это сложно только в описании, а в реальности выполняется на раз-два и даже с завязанными глазами.
Единственное, на что стоит обратить внимание – если копировать XML-дамп прямо из табло (фокус на ячейке, ctrl+c), к искомой строке платформа может добавить непрошенный спецсимвол перевода строки, поэтому лучше сперва открыть значение в отдельном окне (фокус на ячейке, F2), а уже потом копировать.
Излишне упоминать, что указанный метод БСП можно использовать не только для ручной отладки, но и, например, для автоматической записи «телеметрии», то есть некоего прикладного аналога ТЖ. Так что упоминать об этом мы и не станем. ;-)
Передать через функции взятые из БСП серьезные объекты (в моем случае это был тип данных РезультатЗапроса) без выгрузки или других танцев с бубном в рамках портирования консоли на мобильные платформы оказалось абсолютно невозможным, так как данные типы тип не сериализуются XDTO. Однако для этого можно применить следующее правило, которое может работать в пределах одной базы:
- Если тип сериализуется - ничего не делаем. Сразу преобразуем.
- Если нельзя сериализовать- упаковываем в хранилище значений. Следует отметить, что хранилище значений упаковывается также, чтобы с ним не было проблем.
// Преобразованы в могут быть любые объекты (дополнено через ХранилищеЗначения.
// См. также ЗначениеИзСтрокиXML.
//
// Параметры:
// Значение - Произвольный - значение, которое необходимо сериализовать в XML-строку.
//
// Возвращаемое значение:
// Строка - XML-строка.
//
Функция ЗначениеВСтрокуXML ( Значение ) Экспорт
ЗаписьXML = Новый ЗаписьXML ;
ЗаписьXML . УстановитьСтроку ();
Если Значение = Тип ( "ХранилищеЗначения" ) Тогда
//Сохраняем жизнь исходному типу - через оборачивание.
ХранилищеЗначения = новый ХранилищеЗначения ( Значение );
СериализаторXDTO . ЗаписатьXML ( ЗаписьXML , ХранилищеЗначения );
Иначе
//Выполняем Сериализацию:
Попытка
СериализаторXDTO . ЗаписатьXML ( ЗаписьXML , Значение );
Исключение
ХранилищеЗначения = новый ХранилищеЗначения ( Значение );
СериализаторXDTO . ЗаписатьXML ( ЗаписьXML , ХранилищеЗначения );
КонецПопытки;
КонецЕсли;
Возврат ЗаписьXML . Закрыть ();
КонецФункции
// Выполняет преобразование (десериализацию) XML-строки в значение.
// См. также ЗначениеВСтрокуXML.
//
// Параметры:
// СтрокаXML - Строка - XML-строка, с сериализованным объектом..
//
// Возвращаемое значение:
// Произвольный - значение, полученное из переданной XML-строки.
//
Функция ЗначениеИзСтрокиXML ( СтрокаXML ) Экспорт
ЧтениеXML = Новый ЧтениеXML ;
ЧтениеXML . УстановитьСтроку ( СтрокаXML );
ХранилищеЗначение = СериализаторXDTO . ПрочитатьXML ( ЧтениеXML );
//Восстанавливаем значение из Хранилища:
Если ХранилищеЗначение = Тип ( "ХранилищеЗначения" ) Тогда
Возврат ХранилищеЗначение . Получить ();
Иначе
Возврат ХранилищеЗначение ;
КонецЕсли;
Если есть необходимость ввести универсальную функцию, которая совместима на компьютерных платформах со старым внутренним форматом 1С (мне понадобилось для работы с Консолью Запросов на Windows), тогда полученные универсальные функции:
Функция УниверсальнаяЗначениеВСтрокуВнутр ( Значение )
Попытка
Возврат Вычислить ( "ЗначениеВСтрокуВнутр(Значение)" );
Исключение
//Для мобильных приложений выполняем по правилам XMl-Функций, которые были переделаны:
Возврат ЗначениеВСтрокуXML ( Значение );
КонецПопытки;
Функция УниверсальнаяЗначениеИзСтрокиВнутр ( Значение )
Попытка
Возврат Вычислить ( "ЗначениеИзСтрокиВнутр(Значение)" );
Исключение
//Для мобильных приложений выполняем по правилам XMl-Функций, которые были переделаны:
Возврат ЗначениеИзСтрокиXML ( Значение );
КонецПопытки;
В 1С XML используется в основном для обмена информацией с WEB, электронными библиотеками, различными внешними системами для экспорта/импорта данных. XML это текстовые файлы с разметками, которые позволяют хранить данные в уникальном структурированном виде. Могут редактироваться в любом текстовом редакторе.
-< Ресторан Кухня fs10lh1-5">Азиатская " Счет fs10lh1-5">3500 " Категория fs10lh1-5">Высшая " Название fs10lh1-5">Китайская грамота ">
-< Ресторан Кухня fs10lh1-5">Европейская " Счет fs10lh1-5">5000 " Категория fs10lh1-5">Люкс " Название fs10lh1-5">Итальянский Экспресс ">
✔ Чтение файла в формате XML по порядку (способ №1)
//Подходит для файлов более 100Mb
&НаСервере
Процедура ПрочитатьФайлXMLПоПорядкуСпособ1 ( ПутьКФайлу )
XML = Новый ЧтениеXML ;
XML . ОткрытьФайл ( ПутьКФайлу );
Пока XML . Прочитать () Цикл
Если XML . ТипУзла = ТипУзлаXML . НачалоЭлемента И XML . Имя = "Ресторан" Тогда
Название = XML . ЗначениеАтрибута ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( "Название ресторана:" + Название );
КонецЕсли;
Категория = XML . ЗначениеАтрибута ( "Категория" );
Если Категория <> Неопределено Тогда
Сообщить ( ". наценочная категория ресторана: " + Категория );
КонецЕсли;
Счет = XML . ЗначениеАтрибута ( "Счет" );
Если Счет <> Неопределено Тогда
Сообщить ( ". средний счет ресторана: " + Счет );
КонецЕсли;
Кухня = XML . ЗначениеАтрибута ( "Кухня" );
Если Кухня <> Неопределено Тогда
Сообщить ( ". кухня ресторана: " + Кухня );
КонецЕсли;
Пока XML . Прочитать () Цикл //
Если XML . ТипУзла = ТипУзлаXML . НачалоЭлемента И XML . Имя = "Меню" Тогда
Сообщить ( "Меню:" );
Пока XML . Прочитать () Цикл //
Если XML . ТипУзла = ТипУзлаXML . НачалоЭлемента И XML . Имя = "Блюдо" Тогда
Название = XML . ЗначениеАтрибута ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( ". название блюда:" + Название );
КонецЕсли;
ИначеЕсли XML . ТипУзла = ТипУзлаXML . КонецЭлемента И XML . Имя = "Меню" Тогда
Прервать;
КонецЕсли;
КонецЦикла; //
ИначеЕсли XML . ТипУзла = ТипУзлаXML . НачалоЭлемента И XML . Имя = "Описание" Тогда
XML . Прочитать ();
Если XML . ТипУзла = ТипУзлаXML . Текст Тогда
Сообщить ( "Описание:" + XML . Значение );
КонецЕсли;
ИначеЕсли XML . ТипУзла = ТипУзлаXML . КонецЭлемента И XML . Имя = "Ресторан" Тогда
//Подходит для файлов более 100Mb
&НаСервере
Процедура ПрочитатьФайлXMLПоПорядкуСпособ2 ( ПутьКФайлу )
XML = Новый ЧтениеXML ;
XML . ОткрытьФайл ( ПутьКФайлу );
СписокИмен = Новый СписокЗначений ;
Пока XML . Прочитать () Цикл
Если XML . ТипУзла = ТипУзлаXML . НачалоЭлемента Тогда
СписокИмен . Добавить ( XML . Имя );
ПутьXML = СобратьПуть ( СписокИмен );
Если ПутьXML = "/Рестораны/Ресторан" Тогда
Название = XML . ЗначениеАтрибута ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( "Название ресторана: " + Название ); //"Китайская грамота"
КонецЕсли;
Категория = XML . ЗначениеАтрибута ( "Категория" );
Если Категория <> Неопределено Тогда
Сообщить ( ". наценочная категория ресторана: " + Категория ); // Высшая
КонецЕсли;
Счет = XML . ЗначениеАтрибута ( "Счет" );
Если Счет <> Неопределено Тогда
Сообщить ( ". средний счет ресторана: " + Счет ); // 3500
КонецЕсли;
Кухня = XML . ЗначениеАтрибута ( "Кухня" );
Если Кухня <> Неопределено Тогда
Сообщить ( ". кухня ресторана: " + Кухня ); // Азиатская
КонецЕсли;
ИначеЕсли ПутьXML = "/Рестораны/Ресторан/Меню" Тогда
ИначеЕсли ПутьXML = "/Рестораны/Ресторан/Меню/Блюдо" Тогда
Название = XML . ЗначениеАтрибута ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( ". название блюда: " + Название );
КонецЕсли;
ИначеЕсли ПутьXML = "/Рестораны/Ресторан/Описание" Тогда
XML . Прочитать ();
Если XML . ТипУзла = ТипУзлаXML . Текст Тогда
Сообщить ( "Описание: " + XML . Значение );
КонецЕсли;
ИначеЕсли XML . ТипУзла = ТипУзлаXML . КонецЭлемента Тогда
СписокИмен . Удалить ( СписокИмен . Количество () - 1 );
&НаСервере
Функция СобратьПуть ( СписокИмен )
Для Каждого Имя Из СписокИмен Цикл
НашПуть = НашПуть + "/" + Имя ;
КонецЦикла;
//Подходит для файлов менее 100Mb, для больших Не подходит
&НаСервере
Процедура ПрочитатьФайлXMLЧерезDOMСпособ3 ( ПутьКФайлу )
//Поочередная обработка всех узлов документа, представленных в XML:
//1.Объявление механизмов, с помощью которых происходит чтение XML файла; Цикл для обхода узлов;
//2.Считывание данных и атрибутов в узле;
//3.Вывод информации. Если есть необходимость, на этом этапе может происходить запись в переменные или сразу в нужные таблицы;
//4.Завершение работы механизма
ЧтениеXML = Новый ЧтениеXML ;
ЧтениеXML . ОткрытьФайл ( ПутьКФайлу );
Построитель_DOM = Новый ПостроительDOM ;
ДокументXML = Построитель_DOM . Прочитать ( ЧтениеXML );
Для Каждого ТекУзел Из ДокументXML . ЭлементДокумента . ДочерниеУзлы Цикл
Если ТекУзел . ИмяУзла = "Ресторан" Тогда
Название = Ресторан . Атрибуты . ПолучитьИменованныйЭлемент ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( "Название ресторана:" + Название . Значение ); //"Китайская грамота"
КонецЕсли;
Категория = Ресторан . Атрибуты . ПолучитьИменованныйЭлемент ( "Категория" );
Если Категория <> Неопределено Тогда
Сообщить ( ". наценочная категория ресторана: " + Категория . Значение ); // Высшая
КонецЕсли;
СрСчет = Ресторан . Атрибуты . ПолучитьИменованныйЭлемент ( "Счет" );
Если СрСчет <> Неопределено Тогда
Сообщить ( ". средний счет ресторана: " + СрСчет . Значение ); // 3500
КонецЕсли;
Кухня = Ресторан . Атрибуты . ПолучитьИменованныйЭлемент ( "Кухня" );
Если Кухня <> Неопределено Тогда
Сообщить ( ". кухня ресторана: " + Кухня . Значение ); // Азиатская
КонецЕсли;
Для Каждого ТекУзел1 Из Ресторан . ДочерниеУзлы Цикл
Если ТекУзел1 . ИмяУзла = "Меню" Тогда
Меню = ТекУзел1 ;
Сообщить ( "Меню:" );
Для Каждого ТекУзел2 Из Меню . ДочерниеУзлы Цикл
Если ТекУзел2 . ИмяУзла = "блюдо" Тогда
Блюдо = ТекУзел2 ;
Название = Блюдо . Атрибуты . ПолучитьИменованныйЭлемент ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( ". название блюда:" + Название . Значение );
КонецЕсли;
ИначеЕсли ТекУзел1 . ИмяУзла = "Описание" Тогда
Сообщить ( "Описание :" + ТекУзел1 . ТекстовоеСодержимое );
&НаКлиенте
Процедура ЗаписатьДанныеВФорматеXML ( ПутьКФайлу )
Рестораны = СоздатьДанныеДляЗаписиВXML ();
ПараметрыЗаписи = Новый ПараметрыЗаписиXML ( "UTF-8" , "1.0" , Ложь); //необязательно их прописовать
XML = Новый ЗаписьXML ;
XML . ОткрытьФайл ( ПутьКФайлу , ПараметрыЗаписи );
XML . ЗаписатьОбъявлениеXML ();
XML . ЗаписатьНачалоЭлемента ( "Рестораны" );
Для Каждого Ресторан Из Рестораны Цикл
XML . ЗаписатьНачалоЭлемента ( "Ресторан" );
XML . ЗаписатьАтрибут ( "Название" , Ресторан . Значение . Название );
XML . ЗаписатьАтрибут ( "Категория" , Ресторан . Значение . Категория );
XML . ЗаписатьАтрибут ( "Счет" , Ресторан . Значение . Счет );
XML . ЗаписатьАтрибут ( "Кухня" , Ресторан . Значение . Кухня );
XML . ЗаписатьНачалоЭлемента ( "Меню" );
Для Каждого БлюдоИзМеню Из Ресторан . Значение . Меню Цикл
XML . ЗаписатьНачалоЭлемента ( "Блюдо" );
XML . ЗаписатьАтрибут ( "Название" , БлюдоИзМеню . Значение . Название );
XML . ЗаписатьКонецЭлемента (); // Блюдо
XML . ЗаписатьКонецЭлемента (); // Меню
XML . ЗаписатьНачалоЭлемента ( "Описание" );
XML . ЗаписатьТекст ( Ресторан . Значение . Описание );
XML . ЗаписатьКонецЭлемента (); // Описание
XML . ЗаписатьКонецЭлемента (); // Ресторан
XML . ЗаписатьКонецЭлемента (); // Рестораны
&НаКлиенте
Функция СоздатьДанныеДляЗаписиВXML ()
Рестораны = Новый СписокЗначений ;
Китайский_ресторан = Новый Структура ( "Название, Категория, Счет, Кухня, Меню, Описание" );
Китайский_ресторан . Название = "Китайская грамота" ;
Китайский_ресторан . Категория = "Высшая" ; //наценочная категория
Китайский_ресторан . Счет = "3500" ; //средний счет
Китайский_ресторан . Кухня = "Азиатская" ;
Китайский_ресторан . Меню = Новый СписокЗначений ;
Китайский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Суши из форели" ));
Китайский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Лапша фирменная" ));
Китайский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Суп из малюсков" ));
Китайский_ресторан . Описание = "Ресторан азиатской кухни Высшей наценочной категории" ;
Рестораны . Добавить ( Китайский_ресторан );
Европейский_ресторан = Новый Структура ( "Название, Категория, Счет, Кухня, Меню, Описание" );
Европейский_ресторан . Название = "Итальянский Экспресс" ;
Европейский_ресторан . Категория = "Люкс" ; //наценочная категория
Европейский_ресторан . Счет = "5000" ; //средний счет
Европейский_ресторан . Кухня = "Европейская" ;
Европейский_ресторан . Меню = Новый СписокЗначений ;
Европейский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Мясная нарезка из мраморной говядины" ));
Европейский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Салат де-люкс Комплимент" ));
Европейский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Пицца от шеф повара" ));
Европейский_ресторан . Описание = "Ресторан европейской кухни категории Люкс" ;
Рестораны . Добавить ( Европейский_ресторан );
Однаждый Джоель Мозес (англ. Joel Moses ) сказал «APL как красивый бриллиант — безупречный, симметричный. Но вы ничего не можете к нему добавить. Если вы попытаетесь приклеить к нему другой алмаз — вы не получите бóльший алмаз. Лисп же — это ком грязи. Добавь еще и он останется комом грязи — он все еще будет выглядеть как Лисп.» Для меня, кроме лиспа, таким комом грязи стал XML. На протяжении долгого времени на эти значки и > натягивают все больше и больше семантики. Появляются страшные слова — DTD, xsd, xslt, RDF …. Сегодня уже вовсю идет подготовка к Xforms, и кто знает что еще прикрутят к этому формату завтра? Кассанрой работать всегда тяжело, но одно знаю точно — XML останется XML — заголовок и корневой элемент, открывающие и закрывающие тэги, текстовое представление — останется всегда. А раз так — то вечным будет вопрос — как прочитать XML и работать с ним?
Многие пишут свои универсальные функции которые разбирают XML в дерево, в таблицу значений, в массив или как в этой заметке — в структуру. У всех этих способов есть свои плюсы и минусы.
Плюсы подхода изложенного в этой заметке — типизация полученного результата.
Минусы — время работы, объем потребляемой памяти. Поэтому для чтения больших файлов (более 5 kb) слабо подходит.
Для примера используется такое определение XSD
и вот такой xml для теста
Код для преобразования —
При помощи этого кода легко и быстро можно превратить входящий xml в структуру и затем уже работать с ней в своем приложении.
Вот так будет выглядеть корневой элемент
На этом скриншоте — элементы массива (кстати, если XML — простой (нет пересекающихся имен типов) можно легко отказаться от описания типа)
Так выглядит загруженный элемент one (обратите внимание что тэг age — уже приведен к числу, согласно схемы)
В обработке прикрепленной к заметке — тот же самый код (плюс несколько несложных сервисных функций)
Related Posts
6 Comments
Пхе. В своё время я написал функцию-универсалку, которая любой XDTO-объект раздербанивает в коллекции 1С (например, в дерево, в строках которого массивы, или структуры, или ещё что, короче, полностью соответствуя структуре исходного объекта). Короче, усложнённый вариант вашей версии. Разумеется, исходя из его URI и фабрики. Но и то публиковать не стал, ибо техническая вспомогательная хрень.
А вы, автор, совсем простые вещи эдак разжёвываете… Зачем? Всё равно, что перебор элементов массива объяснять статьёй на 5 страниц.
Кстати, конечно же, можно определять факт «списочности» иначе. Например, навскидку, так:
Если СвойствоXDTO.НижняяГраница=0 и СвойствоXDTO.ВерхняяГраница=-1 Тогда // списочный
ну или учитывать, что кол-во в списке может быть ограничено, и тогда уж исходя из него ))
Небольшая библиотека функций по преобразованию данных из 1С в строку JSON и обратно.
Удобна для обмена данными между двумя базами 1С.
Позволяет преобразовывать в строку и обратно любые типы данных, для которых доступна XML-сериализация + объекты 1С (справочники, документы, ПВХ, ПВР).
Ссылки и объекты при передаче преобразуются из адресного пространства одной базы в адресное пространство другой базы по UID.
За основу брались функции преобразования из JSON и UnJSON в 1С
Добавлена поддержка любых XML-сериализуемых типов (ссылочных типов 1С, дат, перечислений, двоичных данных, хранилище значений и др) + объектов 1С (справочников, документов, ПВХ, ПВР). При передачи объектов полное соответствие структур баз отправителя и получателя не обязательно. Совпадающие реквизиты заполняются, не совпадающие игнорируются. Если объект в базе приемнике найден, то он перезаполняется, иначе создается новый.
Преобразование простым обходом коллекций и обратное преобразование разбором строки. Возможно, для 8.3.6 можно будет переписать разбор через встроенные функции по работе с JSON для более быстрой работы.
Работа аналогична исходной обработке. Есть 2 функции: преобразование из строки в JSON и обратное из JSON в строку.
1. В первой базе выполняем команду "СтрокаJSON = JSON(Значение)";
2. Строковое значение " СтрокаJSON " передаем в другую базу любым способом (через файл, веб-сервис, .COM);
3. Во второй базе выполняем обратное преобразование "Значение = UnJSON(СтрокаJSON)";
Для использования достаточно перенести функции из модуля обработки в общий модуль и дополнительно указать соответствие между типами ссылок в двух базах.
У обработки есть форма с несколькими примерами для проверки преобразования.
В приложении 2 варианта обработки. Первая преобразует только XML-сериализуемых типы, вторая также объекты 1С (справочники, документы, ПВХ, ПВР).
UPD. Пример использования:
1. Выгрузка/загрузка данных в формате JSON для отличающихся конфигураций (Такси+ОФ) - универсальная обработка по переносу данных между любыми конфигурациями.
Небольшая библиотека функций по преобразованию данных из 1С в строку JSON и обратно.
Удобна для обмена данными между двумя базами 1С.
Позволяет преобразовывать в строку и обратно любые типы данных, для которых доступна XML-сериализация + объекты 1С (справочники, документы, ПВХ, ПВР).
Ссылки и объекты при передаче преобразуются из адресного пространства одной базы в адресное пространство другой базы по UID.
За основу брались функции преобразования из JSON и UnJSON в 1С
Добавлена поддержка любых XML-сериализуемых типов (ссылочных типов 1С, дат, перечислений, двоичных данных, хранилище значений и др) + объектов 1С (справочников, документов, ПВХ, ПВР). При передачи объектов полное соответствие структур баз отправителя и получателя не обязательно. Совпадающие реквизиты заполняются, не совпадающие игнорируются. Если объект в базе приемнике найден, то он перезаполняется, иначе создается новый.
Преобразование простым обходом коллекций и обратное преобразование разбором строки. Возможно, для 8.3.6 можно будет переписать разбор через встроенные функции по работе с JSON для более быстрой работы.
Работа аналогична исходной обработке. Есть 2 функции: преобразование из строки в JSON и обратное из JSON в строку.
1. В первой базе выполняем команду "СтрокаJSON = JSON(Значение)";
2. Строковое значение " СтрокаJSON " передаем в другую базу любым способом (через файл, веб-сервис, .COM);
3. Во второй базе выполняем обратное преобразование "Значение = UnJSON(СтрокаJSON)";
Для использования достаточно перенести функции из модуля обработки в общий модуль и дополнительно указать соответствие между типами ссылок в двух базах.
У обработки есть форма с несколькими примерами для проверки преобразования.
В приложении 2 варианта обработки. Первая преобразует только XML-сериализуемых типы, вторая также объекты 1С (справочники, документы, ПВХ, ПВР).
UPD. Пример использования:
1. Выгрузка/загрузка данных в формате JSON для отличающихся конфигураций (Такси+ОФ) - универсальная обработка по переносу данных между любыми конфигурациями.
Читайте также: