19.11.2025 Андрей Шестернев 134
Как считать обмен данными 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с-РАРУС МСК
1с-РАРУС МСК

Отрасль:
Разработка компьютерного программного обеспечения

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

- Финансово-бухгалтерский блок
- Казначейство ...

ООО «ЛИГА-ТРАНС»
ООО «ЛИГА-ТРАНС»

Отрасль:
Профессиональные услуги, бытовое обслуживание

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

- Сделано ТЗ по автоматизации учета МСФО: - Разработана карта бюджета доходо...

Фирма 1С
Фирма 1С

Отрасль:

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

- Подготовка функциональной модели прикладного решения «1С:Документооборот...

Внедрение ПП «1С:Предприятие 8. Аренда и управление недвижимостью на базе "1С:Бухгалтерия 8"» в компании «Бутово Молл»
ООО «Бутово Молл»

Отрасль:
Недвижимость

Внедренное типовое решение:
1С:Аренда и управление недвижимостью на базе «1С:Бухгалтерия 8»

Управление продажами, логистикой и транспортом (SFM, WMS, TMS):
- Оформление зак...

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

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

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

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

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

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

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

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

Московский филиал ООО «Авиакомпания «Икар»
Московский филиал ООО «Авиакомпания «Икар»

Отрасль:
Авиаперевозки

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

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

ООО "АСТАРМЕДИКА КЛИНИКА МИКРОХИРУРГИИ ГЛАЗА"
ООО "АСТАРМЕДИКА КЛИНИКА МИКРОХИРУРГИИ ГЛАЗА"

Отрасль:
Деятельность больничных организаций

Внедренное типовое решение:
БИТ:Управление медицинским центром 8

- Управление отношениями с клиентами (CRM)
- Делопроизводство
- Ведение но...

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

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

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

Документооборот (ECM):
- Учет рабочего времени;
Управление персоналом и ка...

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

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

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

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

ООО "ОМЗ"
ООО "ОМЗ"

Отрасль:
Металлургическая промышленность, металлообработка

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

Автоматизация бизнес-процессов...

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

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

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

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