Формирование файла XML. Простая выгрузка для стороннего приложения
В организации учет может вестить не только в решениях на платформе 1С:Предприятие, но и в других программным комплексах (Галактика, Парус, SAP и прочее). При этом появляются задачи интеграции двух приложений.
Напрмер, в некотором приложении (назовем его «X») требуется прочитать список документов конфигурации. О практической пользе решения подобной задачи говорить не будем, отмечу лишь, что наиболее удобным и универсальным способом в такой ситуации будет выгрузка списка документов в формате XML .
Обмен с использованием этого формата является универсальным, поскольку с ним могут работать большинство приложений. Рассмотрим как можно из 1С:Предприятия выгрузить список документов конфигурации в XML-файл.
Выгрузка в XML
И так, перейдем к главному. Нам нужно обойти список метаданных документов и сформировать список в XML-файле. На следующем скриншоте представлен алгоритм формирования XML-файла:
Функция СоздатьXML() Экспорт // Получаем имя временного файла Путь = ПолучитьИмяВременногоФайла(); // Инициализируем класс "ЗаписьXML" Запись = Новый ЗаписьXML; // Открываем временный файл для записи Запись.ОткрытьФайл(Путь, "UTF-8"); // Записываем объявление XML-файла Запись.ЗаписатьОбъявлениеXML(); // Запись.ЗаписатьНачалоЭлемента("ДокументыКонфигурации"); // Первый элемент // Атрибут первого элемента с датой формирования файла Запись.ЗаписатьАтрибут("generated", Формат(ТекущаяДата(), "ДФ=гггг-ММ-ddThh:mm:ss; ДЛФ=DT")); // Записываем элемент для каждого документа конфигурации. В текст помещаем имя документа. Для Каждого Док Из Метаданные.Документы Цикл Запись.ЗаписатьНачалоЭлемента("Документ"); Запись.ЗаписатьТекст(Док.Имя); Запись.ЗаписатьКонецЭлемента(); КонецЦикла; // Завершаем запись первого элемента Запись.ЗаписатьКонецЭлемента(); Запись.Закрыть(); // Закрываем файл // Получаем двоичные данные файла и помещаем их во временное хранилище ДвоичныеДанные = Новый ДвоичныеДанные(Путь); Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор); Возврат Адрес; // Возвращаем адрес файла в хранилище КонецФункции
Каждый созданный элемент должен быть правильно завершен. После выполнения «ЗаписатьНачалоЭлемента()» обязательно должен быть выполнен метод «ЗаписатьКонецЭлемента», иначе структура XML-файла будет некорректной.
Общий шаблон создания XML-файлов предсавляет собой следующую последовательность:
// 1. Инициализируем класс "ЗаписьXML" Запись = Новый ЗаписьXML; // 2. Открываем временный файл для записи Запись.ОткрытьФайл(Путь, "UTF-8"); // 3. Записываем объявление XML-файла Запись.ЗаписатьОбъявлениеXML(); // // 4. ++ Записываем содержимое XML-файла Запись.ЗаписатьНачалоЭлемента("ЭлементXML"); Запись.ЗаписатьКонецЭлемента(); // -- Записываем содержимое XML-файла // 5. Закрываем файл Запись.Закрыть();
С помощью этих пяти шагов создается практически любой XML-файл.
В нашем примере созданный файл переводится в двоичные данные и возвращается в место вызова функции «СоздатьXML». Далее этот файл может быть записан в файловую систему.
Пример выгруженного файла Вы могли видеть на скриншоте выше.
Стороннее приложение
Для примере создал приложение на .NET Framework, чтобы продемонстрировать чтенеие XML-файла в стороннем приложении.
Програма читает созданный файл и выводит документы в виде списка:

Можете попробовать сами, приложение доступно для загрузки по ссылке в конце статьи.
Универсальность
Формат XML используется в большинстве конфигурации обмена данными между прикладными решениями на платформе 1С:Предприятие. Другим часто используемым способом обмена является подключение через COM-соединение. XML-позволяет выполнять обмен практически с любыми приложениями, чем и заслужил называться универсальным.
Файлы для загрузки:
Приложение чтения XML-файла.
Обработка формирования XML-файла.
Описание и установка обработки «Выгрузка и загрузка данных XML»
Универсальная обработка «Выгрузка и загрузка данных XML» производит полную или частичную выгрузку данных информационной базы в файл в формате XML. Впоследствии этот файл может быть загружен в информационную базу с помощью этой же обработки. Формат файла выгрузки отличается от формата файла, создаваемого при выгрузке по плану обмена, заголовочной частью.
Обработка может использоваться только в тех случаях, когда информационная база, в которой осуществлялась выгрузка данных, и та, в которой данные загружаются, являются однородными (конфигурации идентичны, данные могут различаться), либо все выгружаемые объекты практически полностью идентичны по составу и типам реквизитов и табличных частей, свойствам «ведущего» объекта метаданных и т. д.
Использование этой обработки возможно, например, для создания полной или частичной резервной копии данных, осуществления обмена данными между информационными базами, а также как вспомогательный инструмент при восстановлении сбойных информационных баз.
Обработка поддерживает выгрузку данных с возможностью задания отбора по периоду. Также реализована проверка объектов на наличие недопустимых символов при обмене через XML.
Обработка «Выгрузка и загрузка данных XML» поставляется в составе конфигурации «Конвертация данных, редакция 2».
Внешняя обработка Выгрузка и загрузка данных XML.epf для запуска в «1С:Предприятии» версии 8.3 находится в каталоге EXE/EXTREPS/UNIREPS83/UploadToXML
Чтение данных из файла XML и запись данных в файл XML с использованием 1С
Открываем конфигуратор и создаем новую внешнюю обработку.

Добавляем форму обработки и на нее помещаем две кнопки: Загрузить данные и Выгрузить данные. Также на форму добавим таблицу значений и путь к файлу для записи и чтения данных в формате XML . Для наглядности перед записью данных в формате XML в файл выведем эти данные в таблицу значений. Добавим кнопку на форму Заполнить список физических лиц и по нажатию на нее выберем запросом данные из справочника Физические лица, затем результат выборки поместим в таблицу значений.

Заполнение списка физических лиц производится при помощи запроса к справочнику Физические лица и дальнейшим помещением результата в табличную часть. Листинг здесь не приводится.
Теперь поместим в обработчик кнопки «Выгрузить данные» следующий код:
Если Не ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда Возврат; КонецЕсли; Если Объект.ФизическиеЛица.Количество() = 0 Тогда Возврат; КонецЕсли; ФайлЗаписи = Новый ЗаписьXML; ФайлЗаписи.ОткрытьФайл(Объект.ПутьКФайлу, "UTF-8"); ФайлЗаписи.ЗаписатьОбъявлениеXML(); ФайлЗаписи.ЗаписатьНачалоЭлемента("ФизическиеЛица"); ФайлЗаписи.ЗаписатьНачалоЭлемента("Конфигурация"); ФайлЗаписи.ЗаписатьТекст(ПолучитьВерсиюМетаданных()); ФайлЗаписи.ЗаписатьКонецЭлемента(); Для Каждого ТекСтрока Из Объект.ФизическиеЛица Цикл ФайлЗаписи.ЗаписатьНачалоЭлемента("ФизическоеЛицо"); ФайлЗаписи.ЗаписатьАтрибут("Наименование", ТекСтрока.ФизическоеЛицо); ФайлЗаписи.ЗаписатьАтрибут("ДатаРождения", Строка(Формат(ТекСтрока.ДатаРождения, "ДФ=dd.MM.yyyy"))); ФайлЗаписи.ЗаписатьАтрибут("ИНН", ?(ЗначениеЗаполнено(ТекСтрока.ИНН), ТекСтрока.ИНН, "000000000000")); ФайлЗаписи.ЗаписатьКонецЭлемента(); КонецЦикла; ФайлЗаписи.ЗаписатьКонецЭлемента();
В обработчике кнопки Загрузить данные вставим иной код. В ходе выполнения чтения из файла XML в данном примере данные помещаются в структуру для передачи в функцию для заполнения табличной части. У пользователя может быть свой алгоритм обработки прочитанных данных.
Если Не ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда Возврат; КонецЕсли; ФайлПроверки = Новый Файл(Объект.ПутьКФайлу); Если НЕ ФайлПроверки.Существует() Тогда Возврат; КонецЕсли; ФайлПроверки = Неопределено; ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(Объект.ПутьКФайлу); СтруктураДанныхФЛ = Новый Структура; Сч = 0; Пока ЧтениеXML.Прочитать() Цикл ОбработкаПрерыванияПользователя(); //Если надобно экстренно прервать работу Если (ЧтениеXML.Имя = "ФизическоеЛицо") И (ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента) Тогда Наименование = СокрЛП(ЧтениеXML.ПолучитьАтрибут("Наименование")); ДатаРождения = СокрЛП(ЧтениеXML.ПолучитьАтрибут("ДатаРождения")); ИНН = СокрЛП(ЧтениеXML.ПолучитьАтрибут("ИНН")); СтруктураДанныхФЛ.Вставить("СтрокаДанных" + Сч, Наименование + "::" + ДатаРождения + "::" + ?(ИНН = "000000000000", "", ИНН)); Сч = Сч + 1; КонецЕсли; КонецЦикла; ЧтениеXML.Закрыть(); ЗаполнитьТЧФизическиеЛица(СтруктураДанныхФЛ);
В результате получилась обработка, в которой сначала в файл XML выгружаются данные. Затем — по нажатию кнопки загрузки данных — загружаются из файла XML . загруженные данные для наглядности помещаются в таблицу значений на форме.
Пример обработки и файла для чтения данных можно скачать тут
Формирование XML файла 1С
Добрый день, уважаемые форумчане!
Появилась у меня задача сформировать XML файл из таблицы 1С,которая формируется на форме. Есть вопрос в оформлении XML файла(прикладываю два файла) Мне нужно,чтобы шапочка с кажой номенклатурой разворачивалась и туда записывались атрибуты. что то типо ЗаписьXML.ЗаписатьАтрибут. У меня возникли с этим трудности.
Прикрепленные файлы:
По теме из базы знаний
- Выгрузка xml файлов по контрагенту для загрузки в Декларант-алко для конфигурации Управление торговлей алкогольной продукцией 10.3
- Краткое описание создания XML файла по XSD схеме на примере создания выгрузки Статистической отчетности для ФТС
- Формирование xml файла ЭДО (СБИС, Диадок, Такском и т.п.) для типовых документов (счета-фактуры, накладные)
- Лайфхак по бесплатному формированию xml файла ЭДО (СБИС, Диадок, Такском и т.п.) для типовых документов
- Формирование XML документа (УПД, счет, накладная, СФ и прочее)
- Дата
- Дата
- Рейтинг всех уровней
- Рейтинг 1-го уровня
- Древо развёрнутое
- Древо свернутое
Свернуть все
2. Az18011993 29.03.20 09:12 Сейчас в теме
Просто атрибуты записываются справа, могу ли я их выводить вниз?
Прикрепленные файлы:
3. karamazoff 94 29.03.20 09:19 Сейчас в теме
рабочий пример кода, формируемый файл прикреплен, разбирайтесь, там не сложно
ЗаписьXML = Новый ЗаписьXML;
//ЗаписьXML.УстановитьСтроку(«windows-1251»);
ЗаписьXML.ОткрытьФайл(ИмяФайла);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента(«DOCLIST»);
Для каждого стр из табл цикл
док = стр.ссылка;
ЗаписьXML.ЗаписатьНачалоЭлемента(«DOC»); //новый документ
ЗаписьXML.ЗаписатьАтрибут(«DOCNUMBER»,СокрЛП(строка(Док.Номер)));
ЗаписьXML.ЗаписатьАтрибут(«DOCDATE», СокрЛП(Формат(Док.Дата,»ДФ=»»гггг-ММ-дд»»»)));
ЗаписьXML.ЗаписатьАтрибут(«DOCTOTAL», Формат(Док.СуммаДокумента, «ЧДЦ=2;ЧРД=.;ЧГ=0»));
ЗаписьXML.ЗаписатьНачалоЭлемента(«KONTRAGENT»); //контрагент с реквизитами
ЗаписьXML.ЗаписатьАтрибут(«NAME», (Док.Контрагент.Наименование));
ЗаписьXML.ЗаписатьАтрибут(«INN», СокрЛП(строка(Док.Контрагент.ИНН)));
ЗаписьXML.ЗаписатьАтрибут(«KPP», СокрЛП(строка(Док.Контрагент.КПП)));
ЗаписьXML.ЗаписатьКонецЭлемента();
Для каждого Док1 из Док.ДокументыОснования цикл
Для каждого товар из Док1.ДокументОснование.Товары цикл
ЗаписьXML.ЗаписатьНачалоЭлемента(«DOCLINE»); //табличная часть
ЗаписьXML.ЗаписатьАтрибут(«QUANTITY», Формат(Товар.Количество, «ЧДЦ=3;ЧРД=.;ЧГ=0»));
ЗаписьXML.ЗаписатьАтрибут(«SUMMA», Формат(Товар.Сумма, «ЧДЦ=2;ЧРД=.;ЧГ=0»));
ЗаписьXML.ЗаписатьАтрибут(«PRICE_NO_NDS», Формат(Товар.Цена, «ЧДЦ=2;ЧРД=.;ЧГ=0»));
ЗаписьXML.ЗаписатьАтрибут(«NDSRATE», ОбрНДС(СокрЛП(строка(Товар.СтавкаНДС))));
ЗаписьXML.ЗаписатьАтрибут(«NDSSUM», Формат(Товар.СуммаНДС, «ЧДЦ=2;ЧРД=.;ЧГ=0»));
Если Док1.ДокументОснование.СуммаВключаетНДС тогда
ЗаписьXML.ЗаписатьАтрибут(«TOTAL»,Формат(Товар.Сумма, «ЧДЦ=2;ЧРД=.;ЧГ=0»));
иначе
ЗаписьXML.ЗаписатьАтрибут(«TOTAL»,Формат(Товар.Сумма+Товар.СуммаНДС, «ЧДЦ=2;ЧРД=.;ЧГ=0»));
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента(«TOVAR»); //номенклатура
ЗаписьXML.ЗаписатьАтрибут(«CODE», СокрЛП(строка(Товар.Номенклатура.Код)));
ЗаписьXML.ЗаписатьАтрибут(«NAME», СокрЛП(строка(Товар.Номенклатура.Наименование)));
ЗаписьXML.ЗаписатьАтрибут(«UNITNAME», СокрЛП(строка(Товар.ЕдиницаИзмерения.Наименование)));
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
Для каждого товар из Док1.ДокументОснование.Услуги цикл
ЗаписьXML.ЗаписатьНачалоЭлемента(«DOCLINE»); //табличная часть
ЗаписьXML.ЗаписатьАтрибут(«QUANTITY», Формат(Товар.Количество, «ЧДЦ=3;ЧРД=.;ЧГ=0»));
ЗаписьXML.ЗаписатьАтрибут(«SUMMA», Формат(Товар.Сумма, «ЧДЦ=2;ЧРД=.;ЧГ=0»));
ЗаписьXML.ЗаписатьАтрибут(«PRICE_NO_NDS», Формат(Товар.Цена, «ЧДЦ=2;ЧРД=.;ЧГ=0»));
ЗаписьXML.ЗаписатьАтрибут(«NDSRATE», ОбрНДС(СокрЛП(строка(Товар.СтавкаНДС))));
ЗаписьXML.ЗаписатьАтрибут(«NDSSUM», Формат(Товар.СуммаНДС, «ЧДЦ=2;ЧРД=.;ЧГ=0»));
Если Док1.ДокументОснование.СуммаВключаетНДС тогда
ЗаписьXML.ЗаписатьАтрибут(«TOTAL»,Формат(Товар.Сумма, «ЧДЦ=2;ЧРД=.;ЧГ=0»));
иначе
ЗаписьXML.ЗаписатьАтрибут(«TOTAL»,Формат(Товар.Сумма+Товар.СуммаНДС, «ЧДЦ=2;ЧРД=.;ЧГ=0»));
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента(«TOVAR»); //номенклатура
ЗаписьXML.ЗаписатьАтрибут(«CODE», СокрЛП(строка(Товар.Номенклатура.Код)));
//ЗаписьXML.ЗаписатьАтрибут(«NAME», СокрЛП(строка(Товар.Номенклатура.Наименование)));
ЗаписьXML.ЗаписатьАтрибут(«NAME», СокрЛП(строка(Товар.Содержание)));
ЗаписьXML.ЗаписатьАтрибут(«UNITNAME», СокрЛП(строка(Товар.Номенклатура.ЕдиницаИзмерения.Наименование)));
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
Прикрепленные файлы:
4. Az18011993 29.03.20 09:35 Сейчас в теме
(3)Все бы хорошо,но это не то что мне нужно,повторюсь,мне нужно реквизиты таблицы вывести вниз,если я вывожу их с помощью конструкции ЗаписатьАтрибут,они выводятся слева направо. Скрин прикрепляю. Или же это не через атрибуты делать. Вот прошу подсказать.
Прикрепленные файлы:
9. user856012 13 29.03.20 11:29 Сейчас в теме
мне нужно реквизиты таблицы вывести вниз,если я вывожу их с помощью конструкции ЗаписатьАтрибут,они выводятся слева направо
Вопрос: зачем? Формат XML предназначен для обмена информацией между программами , а им глубоко плевать, как там расположены атрибуты -переводы строк, пробелы и отступы игнорируются. «Налогоплательщик ЮЛ» вон вообще формирует весь файл отчета в одну строку — и ничего, никому это не мешает.
Но если уж так приспичило, то как вам подсказать — что надо сделать, если вы не показываете, как вы это делаете (код)?
Поэтому пара общих советов, которые мгновенно находятся поиском:
Сумеете ли вы ими воспользоваться — от меня не зависит.
5. karamazoff 94 29.03.20 10:13 Сейчас в теме
посмотрите внимательно на приложенный файл
там где у вас Страны у меня DOCLIST
где Страна Название — DOC DOCNUMBER
ТрадиционныеБлюда — DOCLINE
Блюдо Название — TOVAR CODE
все как у вас в файле как нужно — лесенкой
лишние не берите
там где нужна ступенька вниз делаете ЗаписатьНачалоЭлемента, где вправо ЗаписатьАтрибут
ЗаписьXML.ЗаписатьНачалоЭлемента(«ТрадиционныеБлюда»);
ЗаписьXML.ЗаписатьНачалоЭлемента(«Блюдо»);
ЗаписьXML.ЗаписатьАтрибут(«Название», «Солянка»);
ЗаписьXML.ЗаписатьАтрибут(«Название», «Щи»);
ЗаписьXML.ЗаписатьАтрибут(«Название», «Кисель»);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
Вот я вам уже и код ваш написал.
6. Az18011993 29.03.20 10:23 Сейчас в теме
(5)Спс конечно,но по скриншоту же видно,что я так и делаю. Я просил можно ли как то вывести.
<Товар>
Наименование
Артикул
Группа
Характеристика
Товар>
Или нет? Атрибуты всегда выводятся слева направо?
7. karamazoff 94 29.03.20 11:11 Сейчас в теме
попробуйте так
ЗаписьXML.ЗаписатьНачалоЭлемента(«Товар»);
ЗаписьXML.ЗаписатьНачалоЭлемента(«Наименование»);
ЗаписьXML.ЗаписатьАтрибут(«Значение», «Солянка»);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента(«Артикул»);
ЗаписьXML.ЗаписатьАтрибут(«Значение», «1111111»);
ЗаписьXML.ЗаписатьКонецЭлемента();
.
ЗаписьXML.ЗаписатьКонецЭлемента();
будет
<Товар>
Наименование Значение = .
Артикул Значение = .
Группа Значение = .
Характеристика Значение = .
Товар>
либо
ЗаписьXML.ЗаписатьНачалоЭлемента(«Товар»);
ЗаписьXML.ЗаписатьНачалоЭлемента(«Наименование»);
ЗаписьXML.ЗаписатьТекст(«Солянка»);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента(«Артикул»);
ЗаписьXML.ЗаписатьТекст(«1111111»);
ЗаписьXML.ЗаписатьКонецЭлемента();
.
ЗаписьXML.ЗаписатьКонецЭлемента();
