Работаем с XML используя ЧтениеXML и ЗаписьXML Примеры кода для Записи данных в XML файл и его последующего Чтения:
Код 1C v 8.3 &НаКлиенте
Функция ВывестиЭлем(ХМЛ,Знач Смещ);
Рез=1;
Попытка
Пока ХМЛ.Прочитать() Цикл
ТипУзла=ХМЛ.ТипУзла;
Если (ТипУзла=ТипУзлаXML.НачалоЭлемента) Тогда
Смещ=Смещ+" ";
Сообщить(Смещ+"Элемент "+ХМЛ.Имя+":",СтатусСообщения.Важное);
Пока (ХМЛ.ПрочитатьАтрибут()) Цикл
Сообщить(Смещ+"Атрибут: "+ХМЛ.Имя+", значение: <"+ХМЛ.Значение+">");
КонецЦикла;
ИначеЕсли (ТипУзла=ТипУзлаXML.КонецЭлемента) Тогда
Смещ=Лев(Смещ,СтрДлина(Смещ)-4);
ИначеЕсли (ТипУзла=ТипУзлаXML.Текст) Тогда
Сообщить(Смещ+"Текст элемента: <"+ХМЛ.Значение+">");
ИначеЕсли (ТипУзла=ТипУзлаXML.СекцияCDATA) Тогда
Сообщить(Смещ+"CDATA: <"+ХМЛ.Значение+">");
ИначеЕсли (ТипУзла=ТипУзлаXML.Комментарий) Тогда
Сообщить(Смещ+"Комментарий: <"+ХМЛ.Значение+">",СтатусСообщения.Информация);
Иначе
Сообщить(Смещ+"Элемент "+ХМЛ.Имя+":");
Сообщить(Смещ+"Тип: "+ХМЛ.Значение);
КонецЕсли;
КонецЦикла;
Исключение
Сообщить(ОписаниеОшибки());
Рез=0;
КонецПопытки;
Возврат Рез;
КонецФункции
&НаКлиенте
Процедура ВыгрузитьХМЛ(ИмяФайла) Экспорт
ХМЛ=Новый ЗаписьXML;
ХМЛ.ОткрытьФайл(ИмяФайла,Новый ПараметрыЗаписиXML("windows-1251",,Ложь,Ложь));
ХМЛ.ЗаписатьОбъявлениеXML();
ХМЛ.ЗаписатьНачалоЭлемента("Файл");
ХМЛ.ЗаписатьАтрибут("Атрибут_Файл_1","Здесь содержимое Атрибут_Файл_1");
ХМЛ.ЗаписатьТекст("Здесь содержимое Файл");
ХМЛ.ЗаписатьКомментарий("Далее следует содержимое файла");
ХМЛ.ЗаписатьНачалоЭлемента("СодержимоеФайла");
ХМЛ.ЗаписатьАтрибут("Атрибут_СодержимоеФайла_1","Здесь содержимое Атрибут_СодержимоеФайла_1");
ХМЛ.ЗаписатьТекст("Здесь содержимое СодержимоеФайла");
ХМЛ.ЗаписатьСекциюCDATA("Это секция CDATA");
ХМЛ.ЗаписатьКонецЭлемента();
ХМЛ.ЗаписатьКонецЭлемента();
ХМЛ.Закрыть();
ХМЛ=Неопределено;
ХМЛ=Новый ЧтениеXML;
ХМЛ.ОткрытьФайл(ИмяФайла,Новый ПараметрыЧтенияXML(,,,ТипПроверкиXML.НетПроверки));
ВывестиЭлем(ХМЛ,"");
ХМЛ.Закрыть();
ХМЛ=Неопределено;
КонецПроцедуры
Категория:
JSON, XML, TXT, CSV, DBF Выгрузка картинок из базы 1С в XML В нынешнее время для электронного каталога или интернет-магазина необходимо выгружать не только информацию о цене и характеристиках товара, но и сопутствующие изображения. Хранящиеся в базе или связанные с номенклатурой изображения порой приходилось выгружать отдельно, подвергая предварительной обработке имена файлов, подгоняя их под правила связи товара с изображениями в приемнике. Тем не менее, в 1С существует возможность поместить двоичные данные изображений в виде строки в XML, либо другой файл выгрузки, чтобы уже на месте разобрать информацию о товаре.
Рассмотрим на примере следующей конфигурации.
Перечень объектов:
- справочники "Номенклатура", подчиненный ему справочник "Файлы";
- документ "Установка цен";
- обработка "Выгрузка прайса";
- перечисления "Типы файлов", "Типы номенклатуры";
- регистр "Цены номенклатуры".
Для начала, добавим форму элемента для справочника "Файлы"
Код 1C v 8.2 УП &НаСервере
Процедура ОбновитьКартинкуФорма(ХранилищеКартинки)
Если Объект.ТипФайла = Перечисления.ТипыФайлов.Картинка Тогда
Картинка = ПоместитьВоВременноеХранилище(ХранилищеКартинки.Получить(), УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры // ОбновитьКартинку()
&НаСервере
Процедура ПоместитьНаСервер(Данные = Неопределено)
ХранилищеКартинки = ?(Данные = Неопределено, Неопределено, Новый ХранилищеЗначения(Данные));
ОбновитьКартинкуФорма(ХранилищеКартинки);
КонецПроцедуры // ПоместитьНаСервер()
&НаКлиенте
Процедура ДобавитьФайл(Команда)
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
ДиалогОткрытияФайла.Фильтр = "Все *.*|*.*|.jpg|*.jpg|.png|*.png";
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл";
Если ДиалогОткрытияФайла.Выбрать() Тогда
мФайл = ДиалогОткрытияФайла.ПолноеИмяФайла;
ПоместитьНаСервер(Новый ДвоичныеДанные(мФайл));
Иначе
Текст = "Файл не выбран!";
Предупреждение(Текст);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
ОбновитьКартинкуФорма(ТекущийОбъект.ХранилищеФайла);
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТекущийОбъект.ХранилищеФайла = ?(ПустаяСтрока(Картинка), Неопределено, Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Картинка)));
КонецПроцедуры
Настроим форму документа "Установка цен".
Код 1C v 8.2 УП &НаСервере
Процедура ЗаполнитьТЧ()
Результат = ВыгрузкаПрайса.ПолучитьТаблицуЦен(Объект.Дата);
Объект.Товары.Загрузить(Результат);
КонецПроцедуры // ЗаполнитьТЧ()
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьТЧ();
КонецПроцедуры
Добавляем обработку выгрузки в XML.
Код 1C v 8.2 УП &НаКлиенте
Процедура Выгрузить(Команда)
Если ПустаяСтрока(ФайлВыгрузки) Тогда
Возврат;
КонецЕсли;
мСтрока = ВыгрузкаПрайса.ПолучитьДанныеXML();
мФайл = Новый ТекстовыйДокумент;
мФайл.УстановитьТекст(мСтрока);
мФайл.Записать(ФайлВыгрузки);
КонецПроцедуры
&НаКлиенте
Процедура ФайлВыгрузкиОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.Сохранение;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = ФайлВыгрузки;
Фильтр = "(*.xml)|*.xml";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.Заголовок = "Выберите файл";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ФайлВыгрузки = ДиалогОткрытияФайла.ПолноеИмяФайла;
Иначе
Текст = "ru = ""Файл(ы) не выбран!""; en = ""File(s) not selected!""";
Предупреждение(НСтр(Текст));
КонецЕсли;
КонецПроцедуры
При заполнении табличной части "Товары" документа "Установка цен" и в обработке выгрузки мы обращаемся к общему модулю "Выгрузка прайса":
Код 1C v 8.2 УП Функция ПолучитьТаблицуЦен(ДатаЗапроса = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| ЕСТЬNULL(Цены.Цена, 0) КАК Цена,
| ПРЕДСТАВЛЕНИЕ(Номенклатура.Ссылка) КАК НоменклатураСтрока
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Товар,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
| ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыСрезПоследних) КАК Цены
| ПО Номенклатура.Ссылка = Цены.Товар
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(ДатаЗапроса), ДатаЗапроса, ТекущаяДата()));
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции // ПолучитьТаблицуЦен()
Функция ПолучитьИзображения(НоменклатураСсылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Файлы.Ссылка
|ИЗ
| Справочник.Файлы КАК Файлы
|ГДЕ
| Файлы.Владелец = &Владелец
| И Файлы.ТипФайла = ЗНАЧЕНИЕ(Перечисление.ТипыФайлов.Картинка)
| И НЕ Файлы.ПометкаУдаления";
Запрос.УстановитьПараметр("Владелец", НоменклатураСсылка);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Функция ПолучитьДанныеXML() Экспорт
ТЧ_Цены = ПолучитьТаблицуЦен();
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("price_list");
Для Каждого СтрокаЦен Из ТЧ_Цены Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("tovar");
ЗаписьXML.ЗаписатьАтрибут("name", СтрокаЦен.НоменклатураСтрока);
ЗаписьXML.ЗаписатьАтрибут("price", Формат(СтрокаЦен.Цена, "ЧРД=.; ЧГ=0"));
ТЧ = ПолучитьИзображения(СтрокаЦен.Номенклатура);
Если НЕ ТЧ.Количество() = 0 Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("picture_list");
Для Каждого СтрТЧ Из ТЧ Цикл
мДанные = СтрТЧ.Ссылка.ХранилищеФайла.Получить();
Если НЕ ЗначениеЗаполнено(мДанные) Тогда
Продолжить;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента("picture");
ЗаписьXML.ЗаписатьАтрибут("binary", Base64Строка(мДанные));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
СтрокаXML = ЗаписьXML.Закрыть();
Возврат СтрокаXML;
КонецФункции // ПолучитьФайлXML()
Кодирование изображений выполняется с помощью функции Base64Строка , в качестве аргумента передаются двоичные данные из справочника "Файлы". Предполагается, что приемник XML может выполнить обратное преобразование. В 1С это можно сделать с помощью функции Base64Значение.
результат выгрузки прайса в XML:
Код Batch File (DOS, CMD, BAT) <?xml version="1.0"?>
<price_list>
<tovar name="Товар 1" price="5">
<picture_list>
<picture binary="iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAB3RJTUUH3QINBSMt
F2PHEwAAABd0RVh0U29mdHdhcmUAR0xEUE5HIHZlciAzLjRxhaThAAAACHRwTkdH
TEQzAAAAAEqAKR8AAAAEZ0FNQQAAsY8L/GEFAAAABmJLR0QA/wD/AP+gvaeTAAAA
pklEQVR4nGP4jw3kajICEVYpBmRFcMafGkMgQhZB1wBRBDEYohquBy6F0AAXejM5
DoiQbUAWgehB2ACRg0jDEbIgRCUTAyponLY4XF8cjoBcNAUMaB44EiEBRJhsuJOY
8rSY+oMNgDohJBCsvPiyZd0xIAIyICJwBUDF6E4iDEh1EnoowdXBVaOFElnBCvE3
cggCufAwgIQ1xMdQP5CcNMhJfMQnbwDR3npihwr9YwAAAABJRU5ErkJggg=="/>
</picture_list>
</tovar>
<tovar name="Товар 2" price="10"/>
<tovar name="Товар 3" price="15"/>
<tovar name="Товар 4" price="18">
<picture_list>
<picture binary="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
rVebJ+JFAAAAAElFTkSuQmCC"/>
</picture_list>
</tovar>
<tovar name="Услуга 1" price="32"/>
<tovar name="Услуга 2" price="15"/>
</price_list>
Источник
Категория:
JSON, XML, TXT, CSV, DBF Как выгрузить Таблицу Значений в XML Код 1C v 8.х Функция ВыгрузитьТЗ_в_XML(пТЗ,пФайлИмя)
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(пФайлИмя);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Root");
Для А=0 По пТЗ.Количество()-1 Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("item");
Для Каждого Колонка Из пТЗ.Колонки Цикл
ИмяАтрибута=Колонка.Имя;
ЗначениеАтрибута=пТЗ[А][Колонка.Имя];
ЗаписьXML.ЗаписатьАтрибут(ИмяАтрибута,Строка(ЗначениеАтрибута));
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
КонецФункции
Категория:
Работа с Таблицей Значений Сохранение реквизитов и табличных частей объектов в XML Сохранение производится процедурой СохранитьРеквизитыИТабличныеЧасти. В качестве параметров она принимает сохраняемый объект и имя файла. Ссылочные реквизиты сохраняются в виде GUID.
Код 1C v 8.х Процедура СохранитьРеквизитыИТабличныеЧасти (Объект, ИмяФайлаXML=Неопределено) Экспорт
ФайлXML = Новый ЗаписьXML;
ФайлXML.ОткрытьФайл(ИмяФайлаXML);
ФайлXML.ЗаписатьОбъявлениеXML();
ФайлXML.ЗаписатьНачалоЭлемента("Root");
ФайлXML.ЗаписатьАтрибут("Объект",Объект.Метаданные().Имя);
//Сохраняем реквизиты
Для Каждого Реквизит Из Объект.Метаданные().Реквизиты Цикл
ФайлXML.ЗаписатьНачалоЭлемента("Реквизит");
ФайлXML.ЗаписатьАтрибут("Имя", Реквизит.Имя);
ТипЗначения = ТипЗнч(Объект[Реквизит.Имя]);
Если Не ТипЗначения = Тип("Неопределено") Тогда
ФайлXML.ЗаписатьАтрибут("ИмяТипа", XMLТип(ТипЗначения).ИмяТипа);
ФайлXML.ЗаписатьАтрибут("URI", XMLТип(ТипЗначения).URIПространстваИмен);
КонецЕсли;
ФайлXML.ЗаписатьТекст(XMLСтрока(Объект[Реквизит.Имя]));
ФайлXML.ЗаписатьКонецЭлемента();
КонецЦикла;
//Сохраняем табличные части
Для Каждого ТЧ из Объект.Метаданные().ТабличныеЧасти Цикл
ФайлXML.ЗаписатьНачалоЭлемента("ТабличнаяЧасть");
ФайлXML.ЗаписатьАтрибут("Имя", ТЧ.Имя);
Для Каждого СтрокаТЧ из Объект[ТЧ.Имя] Цикл
ФайлXML.ЗаписатьНачалоЭлемента("ЭлементКоллекции");
Для Каждого РеквизитТЧ Из ТЧ.Реквизиты Цикл
ФайлXML.ЗаписатьНачалоЭлемента("Реквизит");
ФайлXML.ЗаписатьАтрибут("Имя", РеквизитТЧ.Имя);
ТипЗначения = ТипЗнч(СтрокаТЧ[РеквизитТЧ.Имя]);
Если Не ТипЗначения = Тип("Неопределено") Тогда
ФайлXML.ЗаписатьАтрибут("ИмяТипа", XMLТип(ТипЗначения).ИмяТипа);
ФайлXML.ЗаписатьАтрибут("URI", XMLТип(ТипЗначения).URIПространстваИмен);
КонецЕсли;
ФайлXML.ЗаписатьТекст(XMLСтрока(СтрокаТЧ[РеквизитТЧ.Имя]));
ФайлXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ФайлXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ФайлXML.ЗаписатьКонецЭлемента();
КонецЦикла;
Если Не ФайлXML=Null Тогда
ФайлXML.ЗаписатьКонецЭлемента();
ФайлXML.Закрыть();
КонецЕсли;
КонецПроцедуры
За чтение объекта отвечают процедуры ЗагрузитьРеквизитыИТабличныеЧасти и ЗагрузитьОбъектРекурсивно. Чтобы прочитать объект вызывается первая, ей передаются объект, который необходимо заполнить, и имя файла. Вторая является вспомогательной.
Код 1C v 8.х Процедура ЗагрузитьРеквизитыИТабличныеЧасти(Объект, ИмяФайлаXML=Неопределено) Экспорт
Если Не ИмяФайлаXML = Неопределено Тогда
ФайлXML = Новый ЧтениеXML;
ФайлXML.ОткрытьФайл(ИмяФайлаXML);
Пока ФайлXML.Прочитать() Цикл
Если ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, ФайлXML.Имя);
КонецЕсли
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, знач ИмяУзла)
ИмяТипа = "";
ПространствоИмен = "";
Пока ФайлXML.ПрочитатьАтрибут() Цикл
Если ФайлXML.Имя = "ИмяТипа" Тогда
ИмяТипа = ФайлXML.Значение;
ИначеЕсли ФайлXML.Имя = "URI" Тогда
ПространствоИмен = ФайлXML.Значение;
КонецЕсли;
КонецЦикла;
Пока ФайлXML.Прочитать() Цикл
Если ФайлXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ФайлXML.Имя = ИмяУзла Тогда
Возврат;
ИначеЕсли ФайлXML.ТипУзла = ТипУзлаXML.Текст Тогда
ТипОбъекта = ИзXMLТипа(ИмяТипа, ПространствоИмен);
Если НЕ ТипОбъекта = Неопределено тогда
Объект = XMLЗначение(ТипОбъекта, ФайлXML.Значение);
КонецЕсли;
ИначеЕсли ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяТекУзла = ФайлXML.Имя;
Если ФайлXML.Имя = "ЭлементКоллекции" Тогда
ЗагрузитьОбъектРекурсивно(ФайлXML, Объект.Добавить(), ИмяТекУзла);
Иначе
Если ФайлXML.ПрочитатьАтрибут() Тогда
ЗагрузитьОбъектРекурсивно(ФайлXML, Объект[ФайлXML.Значение], ИмяТекУзла);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В приложенном файле -
Скачивать файлы может только зарегистрированный пользователь! - демонстрационная обработка, позволяющая сохранить ссылочный объект БД в файл и заполнить объект из файла. Заполняемый объект должен быть того же типа, что и сохраненный, а также он должен быть предварительно создан, сохранен в ИБ и выбран в поле "Ссылка".
Категория:
Документы Создание XML файла выгрузки Работников организации с Группировкой по Подразделению Нужен XML файл выгрузки данных вида(выделю как код 8-рки, т.к. выделение xlm кода нет):
Код 1C v 8.х <?xml version="1.0" encoding="UTF-8"?>
<orgstructure>
<department dep_id="7ebb913c-e9c6-11dc-a4f2-0017311416a1" dep_name="генеральный директор" dep_code="П100">
<orgposition user_id="ba68bb79-c377-11dc-a4ca-0017311416a1" user_position_id="ba68bb78-c377-11dc-a4ca-0017311416a1" user_position="генеральный директор" user_is_active="1"/>
</department>
<department dep_id="8132fe4a-0789-11dd-887b-001d60f0496c" dep_name="Бухгалтерия" dep_code="П200">
<orgposition user_id="21448456-15b0-11dd-80a1-00145e3710ab" user_position_id="3c948267-df80-11dc-a4e8-0017311416a1" user_position="специалист" user_is_active="0"/>
<orgposition user_id="d299614a-df9d-11dc-a4e8-0017311416a1" user_position_id="53082fda-edf4-11dd-af3e-00145e3710ab" user_position="заместитель главного бухгалтера" user_is_active="1"/>
<orgposition user_id="8132fe6c-0789-11dd-887b-001d60f0496c" user_position_id="d299614d-df9d-11dc-a4e8-0017311416a1" user_position="секретарь" user_is_active="1"/>
<orgposition user_id="2e81c20e-f190-11dc-a4fb-0017311416a1" user_position_id="2e81c20d-f190-11dc-a4fb-0017311416a1" user_position="бухгалтер" user_is_active="0"/>
<orgposition user_id="ba68bb7e-c377-11dc-a4ca-0017311416a1" user_position_id="53082fd9-edf4-11dd-af3e-00145e3710ab" user_position="главный бухгалтер" user_is_active="1"/>
<orgposition user_id="9893f85a-0403-11df-a872-00215aa545b4" user_position_id="53073825-e5e6-11dc-a4ef-0017311416a1" user_position="делопроизводитель" user_is_active="1"/>
</department>
<department dep_id="6bb91f72-e077-11dd-bf56-00145e3710ab" dep_name="Отдел Продаж" dep_code="П300">
<department dep_id="6bb91f73-e077-11dd-bf56-00145e3710ab" dep_name="Клиентский сервис" dep_code="П310">
<orgposition user_id="02ad5122-e231-11dd-bf56-00145e3710ab" user_position_id="6bb91f6c-e077-11dd-bf56-00145e3710ab" user_position="Специалист" user_is_active="1"/>
</department>
<department dep_id="6bb91f74-e077-11dd-bf56-00145e3710ab" dep_name="Менеджеры" dep_code="П320">
<orgposition user_id="02584921-с235-11dd-bf56-00145e3710ab" user_position_id="7bb98f6c-e577-11dd-bf56-00145e3710ab" user_position="Менеджер" user_is_active="1"/>
</department>
</department>
</orgstructure>
Вот код:
Код 1C v 8.х Процедура ОбойтиУровеньДерева(Строки, Запись)
Для каждого Строка из Строки Цикл
Если ПустаяСтрока(Строка(Строка.Сотрудник)) Тогда
Запись.ЗаписатьНачалоЭлемента("department");
Запись.ЗаписатьАтрибут("dep_id", Строка(Строка.ПодразделениеОрганизации.УникальныйИдентификатор()));
Запись.ЗаписатьАтрибут("dep_name", Строка(Строка.ПодразделениеОрганизации));
Запись.ЗаписатьАтрибут("dep_code", СокрЛП(Строка(Строка.ПодразделениеОрганизации.Код)));
ОбойтиУровеньДерева(Строка.Строки, Запись);
Запись.ЗаписатьКонецЭлемента();
Иначе
Запись.ЗаписатьНачалоЭлемента("orgposition");
Запись.ЗаписатьАтрибут("user_id", Строка(Строка.Сотрудник.УникальныйИдентификатор()));
Запись.ЗаписатьАтрибут("user_position_id", Строка(Строка.Должность.УникальныйИдентификатор()));
Запись.ЗаписатьАтрибут("user_position", Строка(Строка.Должность));
Запись.ЗаписатьАтрибут("user_is_active", ?(Строка.ПричинаИзмененияСостояния = Перечисления.ПричиныИзмененияСостояния.Увольнение,"0","1"));
ОбойтиУровеньДерева(Строка.Строки, Запись);
Запись.ЗаписатьКонецЭлемента();
КонецЕсли
КонецЦикла;
КонецПроцедуры
Процедура КнопкаВыгрузитьНажатие(Кнопка)
ПутьКФайлу = "D:\Vigruzka_"+Формат(ТекущаяДата(),"ДФ=YYYYMMdd")+".xml";
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ПутьКФайлу, "UTF-8");
Запись.ЗаписатьОбъявлениеXML(); //<?xml version="1.0" encoding="UTF-8"?>
Запись.ЗаписатьНачалоЭлемента("orgstructure");
Запрос = Новый Запрос;
Запрос.Текст="
|ВЫБРАТЬ
| РаботникиОрганизацийСрезПоследних.Сотрудник,
| РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
| РаботникиОрганизацийСрезПоследних.Должность,
| РаботникиОрганизацийСрезПоследних.Период,
| РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Порядок КАК ПодразделениеОрганизацииПорядок,
| РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния
|ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(&dateper, ) КАК РаботникиОрганизацийСрезПоследних
|
|УПОРЯДОЧИТЬ ПО
| ПодразделениеОрганизацииПорядок
|ИТОГИ ПО
| ПодразделениеОрганизации ИЕРАРХИЯ
|АВТОУПОРЯДОЧИВАНИЕ
|";
Запрос.УстановитьПараметр("dateper", ТекущаяДата());
Результат = Запрос.Выполнить();
Дерево = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ОбойтиУровеньДерева(Дерево.Строки, Запись);
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
КонецПроцедуры
Категория:
JSON, XML, TXT, CSV, DBF Как из одной базы перенести документ в другую базу через XML файл? Нужно документ РеализацияТоваровУслуг (ссылка на который выбирается в диалоге создаваемой обработки) перенести в другую базу данных. Структура конфигураций идентична. Справочники (и другие сопутствующие объекты) синхронизированы по значениям внутренних идентификаторов.
Для выгрузки потребуется выполнить следующий фрагмент кода:
Код 1C v 8.х // Выгрузить в файл xml.
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл("c:\doc.xml");
ЗаписьXML.ЗаписатьНачалоЭлемента("Root");
// Получить объект по ссылке.
ВыгружаемыйОбъект = Документ.ПолучитьОбъект();
// С помощью средств сериализации записать объект в файл.
ЗаписатьXML(ЗаписьXML,ВыгружаемыйОбъект);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
При выгрузке создаем элемент Root исходя из соображений, что в XML-документе должен быть только один корневой узел, а в общем случае (но не в нашем) выгружаться может не один объект.
Для загрузки выгруженного значения используем следующий фрагмент кода:
Код 1C v 8.х ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ОткрытьФайл("c:\doc.xml");
// Текущим становится элемент Root.
ЧтениеXML.Прочитать();
// Текущим становится элемент с документом.
ЧтениеXML.Прочитать();
// Проверить, сможет ли с данным значением "справиться" система сериализации в данной базе.
Если ВозможностьЧтенияXML(ЧтениеXML) Тогда
// Получить ДокументОбъект.РеализацияТоваровУслуг.
ЗагружаемыйОбъект = ПрочитатьXML(ЧтениеXML);
ЗагружаемыйОбъект.Записать();
КонецЕсли;
ЧтениеXML.Закрыть();
Категория:
JSON, XML, TXT, CSV, DBF Как организовать обмен данными между произвольными конфигурациями? Код 1C v 8.х Процедура Выгрузка(Элемент)
Путь = "c:\"; //реальный путь к каталогу, в котором создаются файлы
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл(Путь + "выгрузка.xml");
Узел = ПланыОбмена.Поставка.НайтиПоКоду("Маг1");
ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗапСообщения.НачатьЗапись(ЗаписьXML, Узел);
Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения);
Пока Выборка.Следующий() Цикл
Данные = Выборка.Получить();
Если ТипЗнч(Данные) = Тип("ДокументОбъект.РеализацияТоваров") Тогда
ВыгрузкаРеализации(ЗаписьXML, Данные);
Иначе // все остальные объекты
ЗаписатьXML(ЗаписьXML, Данные);
КонецЕсли;
КонецЦикла;
ЗапСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
КонецПроцедуры
Процедура ВыгрузкаРеализации(ЗаписьXML, Документ)
ЗаписьXML.ЗаписатьНачалоЭлемента("DocumentObject.ПередачаТовара");
ЗаписатьXML(ЗаписьXML, Документ.Ссылка.УникальныйИдентификатор(), "Ref", НазначениеТипаXML.Явное);
ЗаписатьXML(ЗаписьXML, Документ.ПометкаУдаления, "DeletionMark", НазначениеТипаXML.Явное);
ЗаписатьXML(ЗаписьXML, Документ.ВалютаДокумента, "ВалютаДокумента", НазначениеТипаXML.Явное);
// Остальные свойства документа.
// Табличная часть.
ЗаписьXML.ЗаписатьНачалоЭлемента("Товары");
Для Каждого ТекСтрока Из Документ.Товары Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Row");
ЗаписатьXML(ЗаписьXML, ТекСтрока.Номенклатура, "Номенклатура", НазначениеТипаXML.Явное);
ЗаписатьXML(ЗаписьXML, ТекСтрока.Количество, "Количество", НазначениеТипаXML.Явное);
// Остальные реквизиты табличной части.
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецПроцедуры
Процедура Загрузка(Элемент)
Путь = "c:\"; //реальный путь к каталогу, в котором создаются файлы
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ОткрытьФайл(Путь + "выгрузка.xml");
ЧтСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтСообщения.НачатьЧтение(ЧтениеXML);
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтСообщения.Отправитель, ЧтСообщения.НомерСообщения);
Пока ВозможностьЧтенияДанных(ЧтениеXML) Цикл
Данные = ПрочитатьДанные(ЧтениеXML);
Если РазрешениеКоллизий(Данные) Тогда
Данные.ОбменДанными.Отправитель = ЧтСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЕсли;
КонецЦикла;
ЧтСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();
КонецПроцедуры
Функция ВозможностьЧтенияДанных(ЧтениеXML)
ТипXML = ПолучитьXMLТип(ЧтениеXML);
Если ТипXML = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Если ТипXML.ИмяТипа = "DocumentObject.ПередачаТовара" И ТипXML.URIПространстваИмен = "" Тогда
Возврат Истина;
КонецЕсли;
Возврат ВозможностьЧтенияXML(ЧтениеXML);
КонецФункции
Функция ПрочитатьДанные(ЧтениеXML)
ТипXML = ПолучитьXMLТип(ЧтениеXML);
Если ТипXML.ИмяТипа = "DocumentObject.ПередачаТовара" И ТипXML.URIПространстваИмен = "" Тогда
Возврат ЧтениеРеализации(ЧтениеXML);
КонецЕсли;
Возврат ПрочитатьXML(ЧтениеXML);
КонецФункции
Функция ЧтениеРеализации(ЧтениеXML)
ЧтениеXML.Прочитать();
// Работа со ссылкой документа.
ПолученнаяСсылка = ПрочитатьXML(ЧтениеXML);
Док = Документы.ПоступлениеТоваров.ПолучитьСсылку(Новый УникальныйИдентификатор(ПолученнаяСсылка));
Документ = Док.ПолучитьОбъект();
Если Документ = Неопределено Тогда
Документ = Документы.ПоступлениеТоваров.СоздатьДокумент();
Документ.УстановитьСсылкуНового(Док);
Документ.Дата = ТекущаяДата;
Документ.УстановитьНовыйНомер();
КонецЕсли;
Документ.ПометкаУдаления = ПрочитатьXML(ЧтениеXML);
Документ.ВалютаДокумента = ПрочитатьXML(ЧтениеXML);
// Табличная часть "Товары.
// Построчное чтение.
ЧтениеXML.Прочитать();
Документ.Товары.Очистить();
Пока ЧтениеXML.Имя = "Row" Цикл
// Позиционируемся на узле с номенклатурой.
ЧтениеXML.Прочитать();
НоваяСтрока = Документ.Товары.Добавить();
НоваяСтрока.Номенклатура = ПрочитатьXML(ЧтениеXML);
НоваяСтрока.Количество = ПрочитатьXML(ЧтениеXML);
// Читаем конец узла Row.
ЧтениеXML.Прочитать();
КонецЦикла;
// Читаем конец табличной части.
ЧтениеXML.Прочитать();
// Читаем конец документа.
ЧтениеXML.Прочитать();
Возврат(Документ);
КонецФункции
Функция РазрешениеКоллизий(Данные)
Если ТипЗнч(Данные) = Тип("ДокументОбъект.ПоступлениеТоваров") Тогда
Если Не Данные.ЭтоНовый() Тогда
СсылкаНаУзел = ПланыОбмена.Поставка.НайтиПоКоду("Опт");
Если ПланыОбмена.ИзменениеЗарегистрировано(СсылкаНаУзел, Данные) Тогда
Возврат(Ложь);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат(Истина);
КонецФункции
Категория:
Конвертация данных, Обмен, Перенос Выгрузка / Загрузка данных посредством XML файлов? В основе работы с XML-файлами лежит технология доступа SAX, которая осуществляет считывание по одному тегу. Для этого существует два типа данных –
ЗаписьXML и
ЧтениеXML .
Запись данных справочника в XML-файл:
Код 1C v 8.х Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ПутьКФайлу);
Запись.ЗаписатьОбъявлениеXML();
// формируем корневой элемент
Запись.ЗаписатьНачалоЭлемента("Клиенты");
Выборка = Справочники.Клиенты.Выбрать();
Пока Выборка.Следующий() Цикл
// для каждого клиента формируем свой элемент
Запись.ЗаписатьНачалоЭлемента("Клиент");
// запишем код клиента в атрибут тега
Запись.ЗаписатьАтрибут("Код", Строка(Выборка.Код));
// Наименование клиента запишем в текст элемента
Запись.ЗаписатьТекст(Выборка.Наименование);
// закрываем элемент клиента
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
// закрываем корневой элемент xml-документа
Запись.ЗаписатьКонецЭлемента();
// закрыть файл
Запись.Закрыть();
Чтение данных из XML-файла в справочник:
Код 1C v 8.х Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу);
Спр="";
// чтение осуществляется по одному тегу
Пока Чтение.Прочитать() Цикл
// анализируем тип элемента и его имя
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если Чтение.Имя="Клиент" Тогда
// создаем новый элемент справочника
Спр = Справочники.Клиенты.СоздатьЭлемент();
// читаем атрибуты
Пока Чтение.ПрочитатьАтрибут() Цикл
Если Чтение.Имя="Код" Тогда
Спр.Код = Число(Чтение.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
// заполняем наименование созданного ранее элемента
Спр.Наименование = Чтение.Значение;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
// требуется записать информацию про клиента
Спр.Записать();
КонецЕсли;
КонецЦикла;
Создадим обработку в типовой конфигурации для экспорта плана счетов. Структура xml-файла должна быть такой. Корневой элемент xml-документа соответствует плану счетов в целом. В нем располагаются подчиненные элементы с именем Счет, содержащие информацию о счетах. В качестве содержимого элементов указывается наименование счета. Остальные данные записываются в качестве атрибутов (код, признаки валютного, количественного учета и пр.). В качестве подчиненных элементов для элемента Счет задаются элементы, обозначающие его субсчета с теми же атрибутами. Приведем код процедуры экспорта плана счетов.
Код 1C v 7.x Процедура Выполнить()
Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"v7plus.dll")<>1 Тогда
Предупреждение("Компонента не обнаружена");
Возврат;
КонецЕсли;
Анализатор=СоздатьОбъект("AddIn.XMLParser");
Корень=Анализатор.СоздатьДокумент();
План=Корень.СоздатьПодчиненныйЭлемент("ПланСчетов");
Счет=СоздатьОбъект("Счет.Основной");
Родитель=СоздатьОбъект("Счет.Основной");
Счет.ВыбратьСчета();
Пока Счет.ПолучитьСчет()=1 Цикл
// если это счет, а не субсчет
Если Счет.Уровень()=1 Тогда
Родитель.НайтиПоКоду(Счет.Код);
СчетXML=План.СоздатьПодчиненныйЭлемент("Счет");
СчетXML.УстановитьАтрибут("Код", Счет.Код);
СчетXML.УстановитьАтрибут("Валютный", Счет.Валютный);
СчетXML.УстановитьАтрибут("Количественный", Счет.Количественный);
СчетXML.УстановитьАтрибут("Забалансовый", Счет.Забалансовый);
Если Счет.Активный=1 Тогда
СчетXML.УстановитьАтрибут("вид","активный");
ИначеЕсли Счет.Активный=2 Тогда
СчетXML.УстановитьАтрибут("вид","пассивный");
Иначе
СчетXML.УстановитьАтрибут("вид","активно-пассивный");
КонецЕсли;
СчетXML.Значение=Счет.Наименование;
Иначе
Если Счет.ПринадлежитГруппе(Родитель)=1 Тогда
СубсчетXML=СчетXML.СоздатьПодчиненныйЭлемент("Субсчет");
СубсчетXML.УстановитьАтрибут("Код", Счет.Код);
// аналогично устанавливаем все атрибуты на элемент СубсчетXML
СубсчетXML.Значение=Счет.Наименование;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Корень.Записать(КаталогПрограммы()+"plan.xml");
КонецПроцедуры
В результате будет получен файл, вот его фрагмент:
Код
<?xml version="1.0" encoding="windows-12Sl" ?> - <ПланСчетов>
<Счет Код="00" Валютный="0" Количественный="0" Забалансовый="0" вид="активно-пассивный">Вспомогательный</Счет>
- <Счет Код="01" Валютный="0" Количественный="0" Забалансовый="0" вид="активный">
Основные средства
<Субсчет Код="01.1" Валютный="0" Количественный="0" Забалансовый="0"
вид="активный">ОС в организации</Субсчет> <Субсчет Код="01.2" Валютный="0" Количественный="0" Забалансовый="0"
вид="активный">Выбытие ОС</Субсчет> </Счет>
- <Счет Код="02" Валютный="0" Количественный="0" Забалансовый="0" вид="пассивный">
Амортизация ОС
А теперь приведем код для импорта плана счетов из xml-файла в новую конфигурацию. Код модуля соответствующей обработки должен содержать процедуру Выполнить(), которая имеет такой вид.
Код 1C v 7.x Процедура Выполнить()
Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"v7plus.dll")<>1 Тогда
Предупреждение("Внешняя компонента не найдена");
Возврат;
КонецЕсли;
Анализатор=СоздатьОбъект("AddIn.XMLParser");
Файл=Анализатор.СоздатьДокумент();
Файл.Загрузить(КаталогПрограммы()+"plan.xml");
План=Файл.ВыбратьУзел("ПланСчетов");
кол=План.КоличествоПодчиненных();
Счет=СоздатьОбъект("Счет.Основной");
Для инд=1 по кол Цикл
СчетXML=План.ПолучитьПодчиненныйПоНомеру(инд);
КолСубсчетов=СчетXML.КоличествоПодчиненных();
// подчиненным элементом является и содержимое элемента
Если КолСубсчетов>1 Тогда
Счет.Новый(1);
Иначе
Счет.Новый(0);
КонецЕсли;
Счет.Код=СчетXML.ПолучитьАтрибут("Код");
Счет.Наименование=СчетXML.Значение;
Счет.Валютный=СчетXML.ПолучитьАтрибут("Валютный");
Счет.Количественный=СчетXML.ПолучитьАтрибут("Количественный");
Счет.Забалансовый=СчетXML.ПолучитьАтрибут("Забалансовый");
Если СчетXML.ПолучитьАтрибут("вид")="активный" Тогда
Счет.Активный=1;
ИначеЕсли СчетXML.ПолучитьАтрибут("вид")="пассивный" Тогда
Счет.Активный=2;
Иначе
Счет.Активный=3;
КонецЕсли;
Счет.Записать();
Если КолСубсчетов>1 Тогда
Счет1=СоздатьОбъект("Счет.Основной");
Для инд1=2 По кол_субсчетов Цикл
Субсчет=СчетXML.ПолучитьПодчиненныйПоНомеру(инд1);
Счет1.Новый(0);
Счет1.Код=Субсчет.ПолучитьАтрибут("Код");
// аналогично устанавливаются все атрибуты создаваемого субсчета
Счет1.Записать();
КонецЦикла;
КонецЕсли;
КонецЦикла;
Категория:
JSON, XML, TXT, CSV, DBF Пример выгрузки списка документов в XML файл Код 1C v 8.х Процедура ДействияФормыВыгрузить(Кнопка)
Запись=Новый ЗаписьXML;
Запись.ОткрытьФайл("c:\document.xml");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Корневой");
Запись.ЗаписатьАтрибут("Доумент", "ПринятиеКУчтетуОС");
Запись.ЗаписатьКомментарий("Краткая информация о принятых к учету ОС");
//Выборка=Документы.ПринятиеКУчетуОС.Выбрать(); //это выгрузка всех документов в базе
// а нам нужно за определенный период:
Выборка=Документы.ПринятиеКУчетуОС.Выбрать(НачДата,КонДата);
Пока Выборка.Следующий()Цикл
Запись.ЗаписатьНачалоЭлемента("Элемент");
Запись.ЗаписатьАтрибут("Номер", Строка(Выборка.Номер));
Запись.ЗаписатьАтрибут("Дата", Строка(Выборка.Дата));
Запись.ЗаписатьАтрибут("Организация", Строка(Выборка.Организация));
Запись.ЗаписатьАтрибут("Склад", Строка(Выборка.Склад));
Запись.ЗаписатьАтрибут("ПодразделениеОрганизации", Строка(Выборка.ПодразделениеОрганизации));
Запись.ЗаписатьАтрибут("МОЛ", Строка(Выборка.МОЛБУ));
Запись.ЗаписатьАтрибут("Оборудование", Строка(Выборка.Номенклатура));
Запись.ЗаписатьАтрибут("ОбъектСтроительства", Строка(Выборка.ОбъектСтроительства));
Запись.ЗаписатьАтрибут("ПервоначальнаяСтоимость", Строка(Выборка.ПервоначальнаяСтоимостьНУ));
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
КонецПроцедуры
Категория:
JSON, XML, TXT, CSV, DBF Как сформировать XML-документ в строку? Требуется, чтобы запись XML-документа производилась не в файл, а в строку
Код 1C v 8.х Запись = Новый ЗаписьXML();
Запись.УстановитьСтроку();
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Корневой");
Запись.ЗаписатьАтрибут("Справочник", "Номенклатура");
Запись.ЗаписатьКомментарий("Краткая информация о номенклатуре");
Выборка = Справочники.Номенклатура.ВыбратьИерархически();
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
Запись.ЗаписатьНачалоЭлемента("Элемент");
Запись.ЗаписатьАтрибут("Код", Строка(Выборка.Код));
Запись.ЗаписатьАтрибут("Артикул", Строка(Выборка.Артикул));
Запись.ЗаписатьТекст(Выборка.Наименование);
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
Стр = Запись.Закрыть();
Сообщить(Стр);
Для вывода XML-документа в строку после создания объекта ЗаписьXML необходимо использовать метод УстановитьСтроку(). Только в этом случае метод Закрыть() вернет строку, которая будет содержать сформированный XML-документ.
еще примеры:
Код 1C v 8.х //Выгрузка объекта в XML строку
Функция ОбъектВXML(ДокументОбъект) Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписатьXML(ЗаписьXML, ДокументОбъект);
Возврат ЗаписьXML.Закрыть();
КонецФункции
//Загрузка объекта из XML строки
Функция ОбъектИзXML(Стр) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Стр);
Возврат ПрочитатьXML(ЧтениеXML);
КонецФункции
Категория:
JSON, XML, TXT, CSV, DBF Как можно сформировать XML-документ произвольной структуры? Используется модель последовательного доступа (работа осуществляется только с одним текущим узлом):
Код 1C v 8.х Запись = Новый ЗаписьXML;
//Путь к формируемому XML-документу указан в переменной ПутьКФайлу
Запись.ОткрытьФайл(ПутьКФайлу);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Корневой");
Запись.ЗаписатьАтрибут("Справочник", "Номенклатура");
Запись.ЗаписатьКомментарий("Краткая информация о номенклатуре");
Выборка = Справочники.Номенклатура.ВыбратьИерархически();
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
Запись.ЗаписатьНачалоЭлемента("Элемент");
Запись.ЗаписатьАтрибут("Код", Строка(Выборка.Код));
Запись.ЗаписатьАтрибут("Артикул", Строка(Выборка.Артикул));
Запись.ЗаписатьТекст(Выборка.Наименование);
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
В результате будет получен файл вида
Код <НачалоЭлемента
ИмяАтрибута = Значение ИмяАтрибута = Значение......>
Текст
<КонецЭлемента>
Создание XML-документа с помощью объекта ЗаписьXML производится путем помещения в строгой последовательности (иначе будет нарушена структура) «частей» узлов.
Категория:
JSON, XML, TXT, CSV, DBF Как организовать обмен данными между одинаковыми, идеинтичными конфигурациями? Нужно документ РеализацияТоваровУслуг (ссылка на который выбирается в диалоге создаваемой обработки) перенести в другую базу данных. Структура конфигураций идентична. Справочники (и другие сопутствующие объекты) синхронизированы по значениям внутренних идентификаторов.
Для выгрузки потребуется выполнить следующий фрагмент кода:
Код 1C v 8.х // Выгрузить в файл xml.
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл("c:\doc.xml");
ЗаписьXML.ЗаписатьНачалоЭлемента("Root");
// Получить объект по ссылке.
ВыгружаемыйОбъект = Документ.ПолучитьОбъект();
// С помощью средств сериализации записать объект в файл.
ЗаписатьXML(ЗаписьXML,ВыгружаемыйОбъект);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
При выгрузке создаем элемент Root исходя из соображений, что в XML-документе должен быть только один корневой узел, а в общем случае (но не в нашем) выгружаться может не один объект.
Для загрузки выгруженного значения используем следующий фрагмент кода:
Код 1C v 8.х ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ОткрытьФайл("c:\doc.xml");
// Текущим становится элемент Root.
ЧтениеXML.Прочитать();
// Текущим становится элемент с документом.
ЧтениеXML.Прочитать();
// Проверить, сможет ли с данным значением "справиться" система сериализации в данной базе.
Если ВозможностьЧтенияXML(ЧтениеXML) Тогда
// Получить ДокументОбъект.РеализацияТоваровУслуг.
ЗагружаемыйОбъект = ПрочитатьXML(ЧтениеXML);
ЗагружаемыйОбъект.Записать();
КонецЕсли;
ЧтениеXML.Закрыть();
Категория:
Конвертация данных, Обмен, Перенос