Чтение данных с сайта в формате XML и загрузка в 1С При разработке веб проекта нам потребовалось получать с одного сайта данные в формате XML и загружать их в 1С.
Сайт выдает XML вида (Ссылка на этот xml в коде, внизу):
Код 1C v 8.3 This XML file does not appear to have any style information associated with it. The document tree is shown below.
<updates version="1.0" generator="SEOBudget" url="http://seobudget.ru/updates/">
<update id="cy" name="Обновление тИЦ Яндекса">
<date id="1823" index="1419324939" timestamp="1419324939">23.12.2014 11:55:39 MSK</date>
<date id="1792" index="1415776885" timestamp="1415776885">12.11.2014 10:21:25 MSK</date>
<date id="1760" index="1412923802" timestamp="1412924102">10.10.2014 10:55:02 MSK</date>
</update>
<update id="serp" name="Обновление поисковой выдачи Яндекса">
<date id="1872" index="1424898000" timestamp="1425604249">06.03.2015 04:10:49 MSK</date>
<date id="1871" index="1423602000" timestamp="1425586715">05.03.2015 23:18:35 MSK</date>
<date id="1868" index="1423602000" timestamp="1425402241">03.03.2015 20:04:01 MSK</date>
</update>
<update id="yaca" name="Обновление Яндекс.Каталога">
<date id="1875" index="1425931200" timestamp="1425973201">10.03.2015 10:40:01 MSK</date>
<date id="1874" index="1425758400" timestamp="1425886502">09.03.2015 10:35:02 MSK</date>
<date id="1873" index="1425585600" timestamp="1425628803">06.03.2015 11:00:03 MSK</date>
</update>
<update id="pr" name="Обновление Google PR">
<date id="1512" index="1386353345" timestamp="1386353345">06.12.2013 22:09:05 MSK</date>
<date id="1265" index="1360130400" timestamp="1360130400">06.02.2013 10:00:00 MSK</date>
<date id="1196" index="1352376123" timestamp="1352376123">08.11.2012 16:02:03 MSK</date>
</update>
<update id="user" name="Обновление ПФ в Яндексе">
<date id="1799" index="1415950021" timestamp="1416986821">26.11.2014 10:27:01 MSK</date>
<date id="1763" index="1409237032" timestamp="1413211432">13.10.2014 18:43:52 MSK</date>
<date id="1665" index="1400617705" timestamp="1401222505">28.05.2014 00:28:25 MSK</date>
</update>
</updates><br>
В результате была написана обработка загрузки данных с сайта в 1С, ее код:
Код 1C v 8.3 &НаСервере
Функция ЧтениеXMLВДерево(Путь)
//Создаем дерево
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Имя");
Дерево.Колонки.Добавить("Значение");
//Откроем XML
XMLФайл = Новый ЧтениеXML;
XMLФайл.ОткрытьФайл(Путь);
//Прочитаем XML и создадим дерево
ПрочитатьXMLПоТегам(XMLФайл, Дерево.Строки);
XMLФайл.Закрыть();
ТекДанные = Неопределено;
//Обработаем дерево данных
Для каждого СтрокаП из Дерево.Строки Цикл
Для каждого СтрокаВ из СтрокаП.Строки Цикл
// Сообщить(СтрокаВ.Имя);
Для каждого СтрокаТ из СтрокаВ.Строки Цикл
//Сообщить(СтрокаТ.Имя);
Если СтрокаТ.Значение = "cy" тогда
ТекДанные = Перечисления.Показатель.TiC;
ИначеЕсли СтрокаТ.Значение = "serp" тогда
ТекДанные = Перечисления.Показатель.SYa;
ИначеЕсли СтрокаТ.Значение = "yaca" тогда
ТекДанные = Перечисления.Показатель.CatYa;
ИначеЕсли СтрокаТ.Значение = "pr" тогда
ТекДанные = Перечисления.Показатель.RP;
ИначеЕсли СтрокаТ.Значение = "user" тогда
ТекДанные = Перечисления.Показатель.PFYa;
КонецЕсли;
Для каждого СтрокаД из СтрокаТ.Строки Цикл
Если СтрокаД.Имя="timestamp" Тогда
// Получим из timestamp дату события
ДатаИзменения = МестноеВремя('19700101'+СтрокаД.значение);
//Запишем в регистр
НовЗапись = РегистрыСведений.ТиЦиRP.СоздатьМенеджерЗаписи();
НовЗапись.Показатель = ТекДанные;
НовЗапись.Период = ДатаИзменения;
НовЗапись.Записать();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецФункции
&НаСервереБезКонтекста
Процедура ПрочитатьXMLПоТегам(XMLФайл, ТекущийНаборСтрок)
Пока XMLФайл.Прочитать() Цикл
Если XMLФайл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
НоваяСтрока = ТекущийНаборСтрок.Добавить();
НоваяСтрока.Имя = XMLФайл.Имя;
НоваяСтрока.Значение = "";
Пока XMLФайл.ПрочитатьАтрибут() Цикл
НоваяСтрокаАтрибут = НоваяСтрока.Строки.Добавить();
НоваяСтрокаАтрибут.Имя = XMLФайл.Имя;
НоваяСтрокаАтрибут.Значение = СокрЛП(XMLФайл.Значение);
КонецЦикла;
ПрочитатьXMLПоТегам(XMLФайл, НоваяСтрока.Строки);
ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Возврат;
ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.Текст Тогда
ТекущийНаборСтрок.Родитель.Значение = СокрЛП(XMLФайл.Значение);
Иначе
Сообщить("Тип узла: " + XMLФайл.ТипУзла + " НЕ ОБРАБОТАН", СтатусСообщения.Важное);
Конецесли;
КонецЦикла;
КонецПроцедуры
// Кнопка Обработки
&НаКлиенте
Процедура СборXML(Команда)
ЧтениеXMLВДерево("http://seobudget.ru/downloads/updates.xml");
КонецПроцедуры
Результат загруженный в регистр сведений:
Категория:
Работа с Интернет, Почтой (Mail), FTP Работаем с 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.НетПроверки));
ВывестиЭлем(ХМЛ,"");
ХМЛ.Закрыть();
ХМЛ=Неопределено;
КонецПроцедуры
Категория:
XML, DBF, TXT, CSV Отправка sms из 1C через МТС Коммуникатор Есть сервис МТС Коммуникатор - удобный обмен SMS-сообщениями с Вашими сотрудниками, клиентами и партнерами. Так вот через него мы настроили
отправку СМС клиентам компании из 1С :
Код 1C v 8.2 УП Если ПустаяСтрока(ТелефонКлиента) Тогда
Сообщить("Не определен телефон экспедитора загрузки");
Предупреждение("СМС не может быть отправлено");
Иначе
Адресат = ТелефонКлиента;
Адресат = СтрЗаменить(СтрЗаменить(Адресат, "(", ""), ")", "");
Адресат = СтрЗаменить(СтрЗаменить(СтрЗаменить(Адресат, ".", ""), "-", ""), " ", "");
Адресат = СтрЗаменить(Адресат, "+", "");
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2, "Windows-1251");
WinHttp.Open("POST", "http://mtscommunicator.ru/m2m/m2m_api.asmx/SendMessage", 0);
WinHttp.SetRequestHeader("Accept-Language", "ru");
WinHttp.SetRequestHeader("Accept-Charset","Windows-1251");
WinHttp.setRequestHeader("Content-Language", "ru");
WinHttp.setRequestHeader("Content-Charset", "Windows-1251");
WinHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
ПараметрыPOST = "msid=" + Адресат + "&message=" + ПодготовитьСообщение(ТекстСМС) + "&naming=USER&login=NUMERLOGIN&password=PASSWORD";
Ошибка = Ложь;
ИДСообщения = "";
Попытка
WinHttp.Send(ПараметрыPOST);
ИмяФайлаЗапроса = ПолучитьИмяВременногоФайла();
Текст = Новый ЗаписьТекста(ИмяФайлаЗапроса, КодировкаТекста.UTF8);
Текст.ЗаписатьСтроку(WinHttp.ResponseText());
Текст.Закрыть();
Ошибка = (WinHttp.Status <> 200);
Исключение
Ошибка = Истина;
КонецПопытки;
Если НЕ Ошибка Тогда
Попытка
XMLОтвет = Новый ЧтениеXML;
XMLОтвет.ОткрытьФайл(ИмяФайлаЗапроса);
Пока XMLОтвет.Прочитать() Цикл
Если XMLОтвет.ТипУзла = ТипУзлаXML.НачалоЭлемента И (XMLОтвет.Имя = "long") Тогда
XMLОтвет.Прочитать();
ИДСообщения = XMLОтвет.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
Исключение
Ошибка = Истина;
КонецПопытки;
КонецЕсли;
Если Ошибка Тогда
Сообщить("Не удалось отправить СМС. Проверьте настройки подключения");
Предупреждение("СМС не было отправлено");
Иначе
ПоказатьОповещениеПользователя("Отправка СМС",, "СМС-сообщение отправлено ", БиблиотекаКартинок.СМС);
КонецЕсли;
КонецЕсли;
//Преобразование текста сообщения
Функция ПодготовитьСообщение(Сообщение)
ВрСообщение = "";
Для ТекСимвол = 1 По СтрДлина(Сообщение) Цикл
Если КодСимвола(Сред(Сообщение, ТекСимвол, 1)) = 10 Тогда
ВрСообщение = ВрСообщение + " ";
Иначе
ВрСообщение = ВрСообщение + Сред(Сообщение, ТекСимвол, 1);
КонецЕсли;
КонецЦикла;
Сообщение = ВрСообщение;
Сообщение = СтрЗаменить(Сообщение, "%", "%25");
Сообщение = СтрЗаменить(Сообщение, " ", "%20");
Сообщение = СтрЗаменить(Сообщение, "&", "%26");
Сообщение = СтрЗаменить(Сообщение, "#", "%23");
Сообщение = СтрЗаменить(Сообщение, "*", "%2A");
Сообщение = СтрЗаменить(Сообщение, "|", "%7C");
Сообщение = СтрЗаменить(Сообщение, "\", "%5C");
Сообщение = СтрЗаменить(Сообщение, "/", "%2F");
Сообщение = СтрЗаменить(Сообщение, "?", "%3F");
Сообщение = СтрЗаменить(Сообщение, "^", "%5E");
Возврат Сообщение;
КонецФункции
Категория:
COM-объекты, WMI, WSH Парсер XML в дерево значений Код 1C v 8.2 УП
// Чтение 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, DBF, TXT, CSV Сохранение реквизитов и табличных частей объектов в 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-файлами лежит технология доступа 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.Записать();
КонецЦикла;
КонецЕсли;
КонецЦикла;
Категория:
XML, DBF, TXT, CSV Как можно загрузить XML-документ произвольной структуры? Код 1C v 8.х
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу); //ПутьКФайлу - Путь к загружаемому XML-документу указан в переменной
//Используется модель последовательного доступа.
Пока Чтение.Прочитать() Цикл // Прочитать «структурные части» элементов.
// Проверить, какая часть элемента текущая.
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяУзла = Чтение.Имя;
Сообщить("--" + ИмяУзла);
// Атрибуты элементов можно читать, только если текущая часть – начало элемента.
Пока Чтение.ПрочитатьАтрибут() Цикл
// Прочитать данные узла атрибута.
ТипУзла = Чтение.ТипУзла;
Имя = Чтение.Имя;
Значение = Чтение.Значение;
// Обработать полученные значения.
// ...
КонецЦикла;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
// В примере просто выводим текст в окно сообщений.
Сообщить("Текст:" + Чтение.Значение);
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
// В примере просто выводим признак конца элемента в окно сообщений.
Сообщить("--Конец:" + Чтение.Имя);
Категория:
XML, DBF, TXT, CSV