19.11.2025 Андрей Шестернев 344
Как считать обмен данными 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С:Управление небольшой фирмой 1.6

- Оформление заказов покупателей;
- Управление складскими запасами;
- Ана...

ФГУП «Почта России»
ФГУП «Почта России»

Отрасль:
Почта, доставка

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

- Бухгалтерский учет
- Расчет зарплаты и кадровый учет
- Налоговый учет ...

Внедрение блока бухгалтерского учета «1С:Управление производственным предприятием»
ОАО «Издательство «Просвещение»

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

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

Бухгалтерский учет:
- Завершение периода;
- Регламентированная отчетнос...

Установка программного продукта БИТ.Финанс для 1С:Бухгалтерия 8
ООО «Джи Эй Си Шиппинг энд Лоджистикс»

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

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

Построение единого информационного пространства финансовой службы;
Учет ...

Оптимизация производительности системы
ЗАО ИД «Комсомольская правда»

Отрасль:
Медиа

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

- Оптимизация производительности системы, в том числе сервера Postgre. ...

Автоматизация документооборота в компании ООО "Ликард"
ООО «Ликард» (ОАО ЛУКОЙЛ)

Отрасль:
Нефтесервис

Внедренное типовое решение:
1С:Документооборот КОРП

- Отказ от бумажного документооборота, от громоздких систем на базе офисного...

Автоматизация складских операций на базе «1С:Предприятие 8. WMS Логистика. Управление складом»
ОАО «Фрейт Линк»

Отрасль:
Логистика и грузоперевозки

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

Реализовали разработку уникального модуля «Интернет-магазины» на базе прог...

ООО «ПраксисКом»
ООО «ПраксисКом»

Отрасль:
Аутсорсинг бухгалтерских услуг

Внедренное типовое решение:
1С:Управление небольшой фирмой 8 ПРОФ

- Взаиморасчеты с поставщиками
- Учет прихода ТМЦ
- Взаиморасчеты с поку...

ООО «Аэроэкспресс»
ООО «Аэроэкспресс»

Отрасль:

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

· Планирование закупок · Управление закупочными процедурами, включая 223 ФЗ ...

ООО «Лаборатория успеха»
ООО «Лаборатория успеха»

Отрасль:
Общественное и плановое питание, гостиничный бизнес, туризм

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

Бухгалтерский учет;
Расчет зарплаты и кадровый учет;...

Автоматизации учета затрат и расчета себестоимости с использованием конфигурации «Koderline: Управление проектами строительства скважин»
ООО «Буровая сервисная компания «ГРАНД»

Отрасль:
Нефтесервис

Внедренное типовое решение:
«Koderline: Управление проектами строительства скважин»

Учет и планирование:
- собственную разработку компании «Кодерлайн» – конф...

ООО «Иви.ру»
ООО «Иви.ру»

Отрасль:
Медиаиндустрия

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

Подсистема казначейства
Модуль бюджетного контроля по ДДС ...

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

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

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

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