|

Как считать обмен данными XML файла через обработку


Содержание:

  1. Написание программного кода
  2. Создание элемента справочника

Для начала поймем, что такое xml файл? Простыми словами, это текстовый файл с данными из базы. Его можно открыть через текстовый редактор и увидеть данные, заключенные в теги. (если вы видите белиберду, измените кодировку на ANSI).

Выгрузка.xml

Например, внутри тега «элемент справочника» находится тег «код» с самим кодом, также «наименование» и так далее, по закрывающему тегу мы понимаем иерархию, что все теги находятся внутри тега «Элемент справочника». Это поможет нам в понимании кода, который мы напишем далее.

Написание программного кода

1. Создаем внешнюю обработку, добавляем простую форму, заходим в форму, во вкладку «Команды».

Команды

2. Во вкладке «Команды» создаем команду, переносим на форму, чтобы появилась одноименная кнопка, создаем действие на клиенте и сервере.

Команда1

3. В модуле формы появятся 2 процедуры, в которых мы и будем работать. В процедуру на клиенте вставляем код, позволяющий выбрать и открыть файл.

ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

               ДиалогВыбораФайла.Фильтр = “Выбери файл xml, пожалуйста)|*.xml”;

               ДиалогВыбораФайла.Заголовок = “Выберите файл”;

               ДиалогВыбораФайла.ПредварительныйПросмотр = Истина;

               ДиалогВыбораФайла.ИндексФильтра = 0;

               Если ДиалогВыбораФайла.Выбрать() Тогда

                              ПутьКФайлу = ДиалогВыбораФайла.ПолноеИмяФайла;

                              Команда1НаСервере(ПутьКФайлу);

               КонецЕсли;

В фильтре все что до | это надпись для пользователя, а вот дальше *.xml – тоже своего рода фильтр, но для файлов, * – любой набор символов, а дальше окончание .xml, если хотите переключать регистр, *.[xX][mM][lL]

Если пользователь выбрал файл, мы получим строку адреса файла, например «C:\Program Files\1cv8\Файлик.xml»,присваиваем переменной и передаем ее в серверную функцию, которую дополняем одноименным параметром.

ПутьКФайлу

Осталось в процедуре на сервере вызвать ЧтениеXML и прочесть документ:

Парсер = Новый ЧтениеXML;

               Парсер.ОткрытьФайл(ПутьКФайлу);

               Пока Парсер.Прочитать() Цикл     

                              а=1;

               Парсер.Закрыть();

Метод «Прочитать» возвращает истину, если переходит на следующий тег, в переменной «Парсер» находится вся информация об узле, имя, значение, и т.д.  Советую открыть в отладке и убедиться самостоятельно.

Парсер

Итак, наш парсер проходит каждый узел в документе, который может быть либо тегом, либо значением. Сначала берется тег, далее внутри значение, и опять тег, закрывающий. Схема тег -> значение -> тег. Например, тег «Код» потом его значение «000000001» и дальше тег «/Код».

Код

Можно держать в голове эту структуру и обойти весь файл, но лучше использовать свойство каждого узла «ИмеетИмя» и «ИмеетЗначение».

По сути, это и есть признаки, говорящие сразу, узел является тегом или значением.

Добавим этот код внутрь цикла «Пока» и получим упорядоченные теги и значения. Теперь нам хватает понимания инструментов для того, чтобы считывать из файла XML целые объекты метаданных.

               Если Парсер.ИмеетЗначение Тогда

                              Сообщить(“Значение “+Парсер.Значение);

               КонецЕсли;

               Если Парсер.ИмеетИмя Тогда

                              Сообщить(“Имя “+Парсер.Имя);

               КонецЕсли;

Создание элемента справочника

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

Готово.

СтрокаТаблицыЗначений

               ДанныеСправочников = Новый ТаблицаЗначений;

               ДанныеСправочников.Колонки.Добавить(“Имя”);

               ДанныеСправочников.Колонки.Добавить(“Код”);

               Пока Парсер.Прочитать() Цикл  

                              Если Парсер.ИмеетИмя Тогда

                                            Если Парсер.Имя = “ЭлементСправочника” Тогда

                                                           Стр = ДанныеСправочников.Добавить();

                                                           Пока Парсер.Прочитать() И НЕ Парсер.Имя = “ЭлементСправочника” Цикл 

                                                                          Если Парсер.Имя = “Наименование” Тогда

                                                                                         Парсер.Прочитать();

                                                                                         Стр.Имя = Парсер.Значение;  

                                                                                         Парсер.Прочитать();

                                                                          КонецЕсли;   //Эти условия вылавливают нужные данные, необходимые

                                                                          Если Парсер.Имя = “Код” Тогда //можете добавить copy+paste

                                                                                         Парсер.Прочитать();

                                                                                         Стр.Код = Парсер.Значение;

                                                                                         Парсер.Прочитать();

                                                                          КонецЕсли;

                                                           КонецЦикла;

                                            КонецЕсли;  

                              КонецЕсли;

               КонецЦикла;

Парсер.Закрыть();

Напоследок о возможной проблеме: 1С не читает кодировку ANCI, для корректной работы обработки xml файлов должны быть приведены к кодировке utf-8, (можно реализовать с помощью notepad++) и иметь encoding = utf-8.

xml

Полная программа должна выглядеть так:

С учетом обращения к проводнику и созданию таблицы с колонками для хранения данных согласитесь довольно лаконичный и простой код.

ВнешняяОбработка

Специалист компании ООО “Кодерлайн”,

Шестернев Андрей


Помогла ли вам статья? Оставьте свой комментарий:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Блог про 1С:Предприятие

Copyright © 2024 TopKoder

Мы занимаемся внедрением и обслуживанием программных продуктов 1С.