19.11.2025 Андрей Шестернев 13
Как считать обмен данными XML файла через обр...

Содержание:

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

 

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

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



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


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

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

Наши проекты

ЗАО «Ламбумиз»
ЗАО «Ламбумиз»

Отрасль:
Производство картонной упаковки

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

- Маркетинг;
- Продажи;
- Планирование закупок;
- Закупки;
- Регламенти...

Фармацевтическое предприятие «Оболенское»
АО «Фармацевтическое предприятие «Оболенское»

Отрасль:
Фармацевтическая промышленность

Внедренное типовое решение:
1С:Управление производственным предприятием

- Адаптации блоков/подсистем планирования продаж, закупок и казначейства. ...

АО «РЭП Холдинг»
АО «РЭП Холдинг»

Отрасль:
Энергомашиностроительный холдинг

Внедренное типовое решение:
«1С: Управление производственным предприятием» и «1С:Консолидация ПРОФ»

- Функциональный блок «Консолидированная отчетность РСБУ» - разработка час...

Разработка функциональных требований к информсистеме на базе «1С:Управление холдингом 8»
ФГУП «СВЯЗЬ-безопасность»

Отрасль:
Охранные услуги

Внедренное типовое решение:
1С:Управление холдингом

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

Группа компаний АО «Киномакс»
Группа компаний АО «Киномакс»

Отрасль:
Культура, шоу-бизнес

Внедренное типовое решение:
БИТ.Финанс

- Разработка Положения о Казначействе группы компаний
- Разработка Положе...

Филиал ГлавУпДК при МИД России фирма «Инпредкадры»
Филиал ГлавУпДК при МИД России фирма «Инпредкадры»

Отрасль:
Государственное управление

Внедренное типовое решение:
1С:Бухгалтерия

- Расчеты с контрагентами;
- Управленческий учет;
- Формирование отраслев...

Внедрение «1С:Зарплата и управление персоналом 8 КОРП» в компании «ПБК»
ООО «Партнер Бухгалтер Консультант»

Отрасль:
Бухгалтерские услуги

Внедренное типовое решение:
1С:Зарплата и управление персоналом

- Интеграция продукта с базой данных оперативного учета Axapta;
- Доработка фу...

Внедрение ПП "1С:Бухгалтерия 8 ПРОФ" в ООО Фирма «Бисер»
ООО фирма «Бисер»

Отрасль:
Производство

Внедренное типовое решение:
1С:Бухгалтерия 8 ПРОФ

Финансы, управленческий учет, мониторинг показателей:
- Налоговый учет...

ООО ХДМ Рус
ООО ХДМ Рус

Отрасль:
Торговля

Внедренное типовое решение:
1С:Бухгалтерия ПРОФ

Бухгалтерский учет Банк и касса Расчеты с контрагентами Торговые операции ...

Автоматизация кадрового учета на базе «1С:ERP Управление предприятием 2.0»
Автопредприятие ПАО «Газпром»

Отрасль:
Транспорт

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

- Настройка подсистемы кадрового учета;
- Перенос персональных данных;
- З...

ФГОУ ВПО «Горский государственный аграрный университет»
ФГОУ ВПО «Горский государственный аграрный университет»

Отрасль:
Образование

Внедренное типовое решение:
1С:Колледж ПРОФ

- Управление персоналом и кадровый учет (HRM):
Кадровый учет
Управление об...

Внедрение 1С:Управление торговлей в оптово-розничной компании «Ална-Байк»
ИП Титов Виктор Сергеевич «Ална-Байк»

Отрасль:
Торговля

Внедренное типовое решение:
1С:Управление торговлей

- Управление складами;
- Управление заказами поставщиков;
- Управление зак...

Наши соц. сети

Telegram-канал «Koderline 1С» Группа в Вконтакте «Кодерлайн КОРП» Rutube

Остались вопросы - обратитесь к нам!

Впишите свои Имя и Телефон, чтобы мы ответили на все интересующие Вас вопросы.
ФИО*
E-mail*
Телефон*
Сообщение