четверг, 18 февраля 2016 г.

Использование XML в 1С 7.7

Памятка отсюда, хороший был сайт:
http://web.archive.org/web/20041102064633/http://chin.dataltd.ru/index2.php?id=1c_xml1
http://web.archive.org/web/20041102065411/http://chin.dataltd.ru/index2.php?id=1c_xml2

Создание XML-файла с помощью компоненты v7plus.dll.

XML, как известно, один из языков разметки. Подробно о нем можно прочитать в книге и в Инете. С его помощью легко реализовать древовидную структуру хранения данных , а также задать жесткие правила построения дерева, что уменьшит ошибки, связанные с доступом к данным.


Применительно к 1С с его помощью можно реализовать множество задач, в частности по документообороту внутри компании и с внешними корреспондентами, всевозможные переносы справочников и документов между конфигурациями, обмен данными с другими приложениями, поддерживающими формат XML.

XML-документ вкратце можно представить следующим образом. Верхним в иерархии является корневой элемент. Все остальные элементы (кроме сведений о формате файла) являются вложенными по отношению к нему (подчиненными), назовем их ветви. Каждый элемент, в т.ч. и корневой поименован. Каждый элемент имеет атрибуты, может содержать данные, а также может иметь множество других вложенных в него элементов. В качестве примера разберем задачу по переносу приходно-кассовых ордеров и банковских выписок, формируемых оперативным отделом с помощью ТиС в бухгалтерию. Данный пример показывает простые приемы работы со структурой XML-документа.Код с пояснениями:

//Сначала проинициализируем компоненту v7plus, предоставляющую объекты для работы с XML:
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда
     Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() +
"v7plus.dll") <> 1 Тогда
          Предупреждение(
"Компонента v7plus.dll не найдена!");
     КонецЕсли;
КонецЕсли;
Анализатор = СоздатьОбъект("AddIn.XMLParser");


//Теперь начнем строить дерево документа. Заодно занесем служебную информацию о файле выгрузки в атрибуты корневого элемента
Корень=Анализатор.СоздатьДокумент();
Данные =Корень.СоздатьПодчиненныйЭлемент("Данные");Данные.УстановитьАтрибут("ИБ",КаталогИБ());
Данные
.УстановитьАтрибут("Дата",Строка(РабочаяДата()));
Данные
.УстановитьАтрибут("Оператор",ИмяПользователя());


//И создади две основные ветви Справочники и Документы
Справочники=Данные.СоздатьПодчиненныйЭлемент("Справочники");
Документы=Данные.СоздатьПодчиненныйЭлемент("Документы");
 

// в общей ветке Справочники создадим ветку для справочника Контрагентов
Клиенты=Справочники.СоздатьПодчиненныйЭлемент("Клиенты");


//А вот так заполняются элементы для справочников. Каждый реквизит справочника выносится в отдельный элемент дерева. Т.к. в данном задании выбрана схема синхронизации справочника Контрагентов по ИНН, то в значение элемента записываем ИНН, а для наглядности в атрибут элемента заносим наименование клиента
К=СписокКлиентов.ПолучитьЗначение(х);
Состояние(
"Выгружаются сведения по: " +К.Наименование);
Клиент=Клиенты.СоздатьПодчиненныйЭлемент("Клиент");
Клиент.УстановитьАтрибут("Наименование",К.Наименование);
Клиент.Значение=К.ИНН;

 

// выгружаем все нужные реквизиты контрагента
ПН=Клиент.СоздатьПодчиненныйЭлемент("ПолнНаименование");
ПН.Значение=К.ПолнНаименование;
ВК=Клиент.СоздатьПодчиненныйЭлемент("ВидКонтрагента");
ВК.Значение=К.ВидКонтрагента.Идентификатор();

 

// и так далее по всем необходимым реквизитам, аналогично заполняется информация о документах в соответствии с разработанной схемой обмена с бухгалтерией.

// Завершающие шаги и сохранение файла
ИмяФайла= СтрЗаменить(Строка(ДатаВыгрузки)+Строка(ДатаВыгрузки1),".","") + ".xml";
ПапкаФайла= "C:\1C\Change\Sweet\";
Корень.Записать(ПапкаФайла+ИмяФайла);



Чтение данных. 


В первой части статьи были рассмотрены простейшие приемы работы по созданию XML-документа. В этой части будут описаны способы получения данных. Основным моментом, на который я хотел бы обратить Ваше внимание, является следующее правило: сперва с помощью методов .ВыбратьУзел() или .ВыбратьУзлы() производится выборка узла/элемента, а затем с помощью методов соответственно .ПолучитьПодчиненныйПоНомеру() и .ПолучитьУзел() обеспечивается непосредственный доступ к узлам/элементам документа. Впрочем, здесь можно провести аналогию работы со справочниками и документами в 1С: сначала делаем выборку с помощью .ВыбратьЭлементы() или .ВыбратьДокументы(), а затем получаем сами объекты .ПолучитьЭлемент() или ПолучитьДокумент(). Оба приема используются в данном примере. Код с пояснениями:

Инициализацию компоненты опустим. Для чтения она ничем не отличается.
//создадим объект для доступа к xml-файлу, загрузим в него файл и получим ссылку на корневой элемент xml-документа. Напомню, что у нас он назван "Данные"
ФайлДанных=Анализатор.СоздатьДокумент();
ФайлДанных.Загрузить(ФайлЭксп);
ВсеУзлы=ФайлДанных.ВыбратьУзлы("Данные");


// получаем доступ к корневому узлу/элементу и читаем его атрибутыДанные=ВсеУзлы.ПолучитьУзел(0);
Сообщить(
"Идет загрузка данных из базы: " +Данные.ПолучитьАтрибут("ИБ"));
Сообщить(
"Выгрузка производилась: " +Данные.ПолучитьАтрибут("Дата"));
Сообщить(
"Выгрузку произвел/произвела: " +Данные.ПолучитьАтрибут("Оператор"));


// следующими операторами мы получаем доступ к двум основным ветвям: ветки Справочники и ветке Клиенты
Справочники=Данные.ВыбратьУзел("Справочники");
Документы=Данные.ВыбратьУзел("Документы");


// "спускаемся" по иерархии глубже и получаем доступ к элементу Клиенты, Выписки и Приходники
Клиенты=Справочники.ВыбратьУзел("Клиенты");
Выписки=Документы.ВыбратьУзел("Выписки");
Приходники=Документы.ВыбратьУзел("Приходники");


//если очень интересно сколько прийдется загружать Контрагентов, то можно воспользоваться следующей конструкцией 

Сообщить("Количество клиентов: " + Строка(Клиенты.КоличествоПодчиненных()));

// организация перебора всех элементов узла Клиенты
Для х= 1 ПоКлиенты.КоличествоПодчиненных() Цикл
     Клиент=Клиенты.ПолучитьПодчиненныйПоНомеру(х);
     ИНН=Клиент.Значение;
     Если ПустоеЗначение(ИНН) = 1 Тогда
          Сообщить(
"Ошибка. В файле выгрузки не задан ИНН клиента " +Клиент.ПолучитьАтрибут("Наименование"),"!!");
     Продолжить; 

     КонецЕсли;
КонецЦикла;



2 комментария:

Unknown комментирует...

Спасибо!

Unknown комментирует...

Спасибо, очень помогли.