Содержание:
1. Написание программного кода
2. Создание элемента справочника
Для начала поймем, что такое xml файл? Простыми словами, это текстовый файл с данными из базы. Его можно открыть через текстовый редактор и увидеть данные, заключенные в теги. (если вы видите белиберду, измените кодировку на ANSI).
Выгрузка.xml
Например, внутри тега «элемент справочника» находится тег «код» с самим кодом, также «наименование» и так далее, по закрывающему тегу мы понимаем иерархию, что все теги находятся внутри тега «Элемент справочника». Это поможет нам в понимании кода, который мы напишем далее.
1. Написание программного кода
1. Создаем внешнюю обработку, добавляем простую форму, заходим в форму, во вкладку «Команды».
Команды
2. Во вкладке «Команды» создаем команду, переносим на форму, чтобы появилась одноименная кнопка, создаем действие на клиенте и сервере.
Команда1
3. В модуле формы появятся 2 процедуры, в которых мы и будем работать. В процедуру на клиенте вставляем код, позволяющий выбрать и открыть файл.
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Фильтр = "Выбери файл xml, пожалуйста)|*.xml";
ДиалогВыбораФайла.Заголовок = "Выберите файл";
ДиалогВыбораФайла.ПредварительныйПросмотр = Истина;
ДиалогВыбораФайла.ИндексФильтра = 0;
Если ДиалогВыбораФайла.Выбрать() Тогда
ПутьКФайлу = ДиалогВыбораФайла.ПолноеИмяФайла;
Команда1НаСервере(ПутьКФайлу);
КонецЕсли;
В фильтре все что до | это надпись для пользователя, а вот дальше *.xml – тоже своего рода фильтр, но для файлов, * - любой набор символов, а дальше окончание .xml, если хотите переключать регистр, *.[xX][mM][lL]
Если пользователь выбрал файл, мы получим строку адреса файла, например «C:\Program Files\1cv8\Файлик.xml», присваиваем переменной и передаем ее в серверную функцию, которую дополняем одноименным параметром.
ПутьКФайлу
Осталось в процедуре на сервере вызвать ЧтениеXML и прочесть документ:
Парсер = Новый ЧтениеXML;
Парсер.ОткрытьФайл(ПутьКФайлу);
Пока Парсер.Прочитать() Цикл
а=1;
Парсер.Закрыть();
Метод «Прочитать» возвращает истину, если переходит на следующий тег, в переменной «Парсер» находится вся информация об узле, имя, значение, и т.д. Советую открыть в отладке и убедиться самостоятельно.
Парсер
Итак, наш парсер проходит каждый узел в документе, который может быть либо тегом, либо значением. Сначала берется тег, далее внутри значение, и опять тег, закрывающий. Схема тег → значение → тег. Например, тег «Код» потом его значение «000000001» и дальше тег «/Код».
Код
Можно держать в голове эту структуру и обойти весь файл, но лучше использовать свойство каждого узла «ИмеетИмя» и «ИмеетЗначение».
По сути, это и есть признаки, говорящие сразу, узел является тегом или значением.
Если Парсер.ИмеетЗначение Тогда
Сообщить("Значение "+Парсер.Значение);
КонецЕсли;
Если Парсер.ИмеетИмя Тогда
Сообщить("Имя "+Парсер.Имя);
КонецЕсли;
Добавим этот код внутрь цикла «Пока» и получим упорядоченные теги и значения. Теперь нам хватает понимания инструментов для того, чтобы считывать из файла XML целые объекты метаданных.
2. Создание элемента справочника
Предположим, нам необходимо считать все элементы справочника из XML файла:
Заходим в файл, изучаем название тега, который сигнализирует о том, что это данные справочника, в моем случае это «ЭлементСправочника», значит наш парсер должен отлавливать теги с названием «ЭлементСправочника», проваливаться в другие теги, и в зависимости от их имени относить значения в соответствующие сущности. Не забывая при этом проверять узел на наличие имени или значения. Код ниже, а сейчас пояснения:
Создаем таблицу с нужными колонками, в которую будем выгружать данные, для примера наименование и код справочников. Далее отлавливаем момент, когда узел является тегом (имеет имя) и этот тег относится к элементу справочника. Далее запускаем еще один цикл и используем особенность структуры, которую подметили в самом начале статьи. Тег → Значение → Тег. Вызываем метод Прочитать(), чтобы пропустить тег, присваиваем значение, далее опять вызываем метод Прочитать() чтобы пропустить закрывающий тег. Дело сделано, если вам необходимо считать другие метаданные, можете заменить названия и добавить блоки с «Если» путем копирования и назначения нужных значений в блоке условия. Не забываем после прочтения файла вызвать метод Парсер.Закрыть();
Готово.
СтрокаТаблицыЗначений
ДанныеСправочников = Новый ТаблицаЗначений;
ДанныеСправочников.Колонки.Добавить("Имя");
ДанныеСправочников.Колонки.Добавить("Код");
Пока Парсер.Прочитать() Цикл
Если Парсер.ИмеетИмя Тогда
Если Парсер.Имя = "ЭлементСправочника" Тогда
Стр = ДанныеСправочников.Добавить();
Пока Парсер.Прочитать() И НЕ Парсер.Имя = "ЭлементСправочника" Цикл
Если Парсер.Имя = "Наименование" Тогда
Парсер.Прочитать();
Стр.Имя = Парсер.Значение;
Парсер.Прочитать();
КонецЕсли; //Эти условия вылавливают нужные данные, необходимые
Если Парсер.Имя = "Код" Тогда //можете добавить copy+paste
Парсер.Прочитать();
Стр.Код = Парсер.Значение;
Парсер.Прочитать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Парсер.Закрыть();
Напоследок о возможной проблеме: 1С не читает кодировку ANCI, для корректной работы обработки xml файлов должны быть приведены к кодировке utf-8, (можно реализовать с помощью notepad++) и иметь encoding = utf-8.
xml
Полная программа должна выглядеть так:
С учетом обращения к проводнику и созданию таблицы с колонками для хранения данных согласитесь довольно лаконичный и простой код.
ВнешняяОбработка
Специалист компании ООО "Кодерлайн"
Андрей Шестернев








