19.11.2025 Андрей Шестернев 45
Как считать обмен данными 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С:Бухгалтерия 8 ПРОФ" в ООО "ДЕКОР"
ООО «ДЕКОР»

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

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

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

СТС-Медиа
СТС-Медиа

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

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

- Бухгалтерский учет;
- Налоговый учет;
- МСФО (GAAP/управленческий учет);
- ...

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

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

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

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

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

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

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

– Оформление заказов поставщикам;
– Управление отношениями с поставщика...

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

Отрасль:

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

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

Внедрение ПП "1С:Бухгалтерия 8 ПРОФ" в ООО «Союз Три» (Кондитерский дом Renardi)
ООО «Союз Три»

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

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

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

ОАО «Интер РАО – Электрогенерация»
ОАО «Интер РАО – Электрогенерация»

Отрасль:
Электрогенерация

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

Для работы 2500 пользователей в 9 часовых поясах организована территориально-...

Внедрение системы финансового учета БИТ:Финанс
ООО «Алькор и Ко» (Л’Этуаль)

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

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

- Финансовый учет;
- Поддержка проекта внедрения МСФО;
- Регламентные рабо...

Доработка конфигурации Заказчика «1С:Управление строительной организацией»
ЗАО «Стройтрансгаз»

Отрасль:
Проектирование

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

Взаиморасчеты с поставщиками;
- Оформление заказов поставщикам;
- Склад ...

Группа компаний ТМ «Дружба народов»
Группа компаний ТМ «Дружба народов»

Отрасль:
Пищевая промышленность

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

- Переход на новый релиз 2.1 программы «1С:ERP Управление предприятием»
- Разра...

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

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

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

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