Как сформировать XML-файл со сложной структурой и пространствами имен в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С со сторонними системами (особенно с банковскими сервисами в рамках зарплатных проектов) разработчики часто сталкиваются с необходимостью выгрузки данных в строго определенном XML-формате. Наибольшие трудности обычно вызывает формирование заголовочной части файла — корневого элемента с множеством служебных атрибутов и пространств имен (таких как xmlns:xs, xmlns:xsi, xsi:type и др.).

В этой статье мы подробно разберем, как решить эту задачу в 1С двумя способами: классической ручной записью через объект ЗаписьXML и более современным, надежным методом с использованием технологии XDTO. Также мы обсудим скрытые технические нюансы и "подводные камни", которые могут возникнуть при загрузке ваших файлов на стороне банков.

Постановка задачи

Нам необходимо получить XML-файл, заголовок которого выглядит следующим образом:


<?xml version="1.0" encoding="windows-1251" ?>
<СчетаПК xmlns:xs="http://www.w3.org/2001/XMLSchema" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://v8.1c.ru/edi/edi_stnd/109" 
         xsi:type="СчетПК" 
         ДатаФормирования="2023-10-27" 
         НомерДоговора="1" 
         НаименованиеОрганизации="ООО Рога и Копыта" 
         ИНН="7700000000" 
         РасчетныйСчетОрганизации="40702810..." 
         БИК="044525225" 
         ИдПервичногоДокумента="333555">

Этот заголовок соответствует стандарту обмена электронными документами с банками по зарплатным проектам (файл «Заявки на открытие лицевых счетов», корневой элемент СчетаПК).

---

Решение №1: Ручное формирование через ЗаписьXML

Если вам требуется быстро решить задачу "в лоб" без создания дополнительных метаданных в конфигурации, можно использовать стандартный объект платформы ЗаписьXML.

Главный секрет, который вызывает затруднения у начинающих разработчиков: любые объявления пространств имен (начинающиеся с xmlns) внутри открывающего тега для платформы 1С являются обычными XML-атрибутами. Их необходимо записывать с помощью метода ЗаписатьАтрибут().

Разберем по шагам правильный алгоритм и код для генерации такого заголовка:


ПутьКФайлу = "C:\Upload\export_bank.xml";

ЗаписьXML = Новый ЗаписьXML;
// Открываем файл с явным указанием кодировки, требуемой банком
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "windows-1251");

// 1. Записываем стандартное объявление XML в первой строке (<?xml version="1.0" encoding="windows-1251"?>)
ЗаписьXML.ЗаписатьОбъявлениеXML();

// 2. Открываем корневой элемент "СчетаПК"
ЗаписьXML.ЗаписатьНачалоЭлемента("СчетаПК");

// 3. Записываем пространства имен (Namespaces) как обычные атрибуты
ЗаписьXML.ЗаписатьАтрибут("xmlns:xs", "http://www.w3.org/2001/XMLSchema");
ЗаписьXML.ЗаписатьАтрибут("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
ЗаписьXML.ЗаписатьАтрибут("xmlns", "http://v8.1c.ru/edi/edi_stnd/109");

// 4. Записываем тип схемы
ЗаписьXML.ЗаписатьАтрибут("xsi:type", "СчетПК");

// 5. Записываем прикладные атрибуты нашей организации и договора
ЗаписьXML.ЗаписатьАтрибут("ДатаФормирования", Формат(ТекущаяДата(), "ДФ=ГГГГ-ММ-ДД"));
ЗаписьXML.ЗаписатьАтрибут("НомерДоговора", "1");
ЗаписьXML.ЗаписатьАтрибут("НаименованиеОрганизации", "ООО Рога и Копыта");
ЗаписьXML.ЗаписатьАтрибут("ИНН", "7700000000");
ЗаписьXML.ЗаписатьАтрибут("РасчетныйСчетОрганизации", "40702810000000000001");
ЗаписьXML.ЗаписатьАтрибут("БИК", "044525225");
ЗаписьXML.ЗаписатьАтрибут("ИдПервичногоДокумента", "333555");

// Здесь будет код выгрузки табличной части (строк сотрудников)
// ...

// 6. Закрываем корневой элемент и сам файл
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();

Важное примечание: Обратите внимание на то, как записывается дата формирования. Формат выгрузки XML очень чувствителен к типам данных. Стандартное приведение даты в 1С к строке даст формат "27.10.2023 14:30:15", что вызовет ошибку валидации в банке. Всегда форматируйте даты в соответствии со спецификацией XML: YYYY-MM-DD (в коде 1С за это отвечает маска "ДФ=ГГГГ-ММ-ДД").

---

Решение №2: Использование механизмов XDTO (Рекомендуемый способ)

Хотя ручная запись через ЗаписьXML проста и понятна, у нее есть существенный минус — полное отсутствие контроля валидности структуры со стороны 1С. Любая опечатка в имени тега или неверный формат данных приведет к отказу в приеме файла банком.

Для создания сложных XML-документов правильнее использовать встроенный в платформу механизм XDTO (XML Data Transfer Objects). В типовых конфигурациях 1С (таких как ЗУП, ERP, КА, БП) уже присутствует готовый XDTO-пакет ФорматОбменаСБанкамиПоЗарплатнымПроектам, созданный именно под эти стандарты.

Рассмотрим, как выгрузить те же самые данные через XDTO-фабрику:


// Получаем доступ к фабрике XDTO и типу объекта из схемы
ТипОбъектаСчетаПК = ФабрикаXDTO.Тип("http://v8.1c.ru/edi/edi_stnd/109", "СчетПК");

// Создаем новый XDTO-объект на основании схемы
НовыйСчетПК = ФабрикаXDTO.Создать(ТипОбъектаСчетаПК);

// Заполняем свойства объекта (платформа сама преобразует типы и пропишет пространства имен)
НовыйСчетПК.ДатаФормирования = ТекущаяДата(); // Тип автоматически преобразуется в XML-формат даты
НовыйСчетПК.НомерДоговора = "1";
НовыйСчетПК.НаименованиеОрганизации = "ООО Рога и Копыта";
НовыйСчетПК.ИНН = "7700000000";
НовыйСчетПК.РасчетныйСчетОрганизации = "40702810000000000001";
НовыйСчетПК.БИК = "044525225";
НовыйСчетПК.ИдПервичногоДокумента = "333555";

// Запись готового XDTO-объекта в файл
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Upload\export_xdto.xml", "windows-1251");
ЗаписьXML.ЗаписатьОбъявлениеXML();

// Выгружаем объект с указанием локального имени корневого тега
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, НовыйСчетПК, "СчетаПК");
ЗаписьXML.Закрыть();

Преимущества использования XDTO:

  1. Строгая типизация. Платформа не позволит записать в числовые или дата-поля некорректные строковые значения.
  2. Автоматическая генерация шапки. Платформа сама сопоставит объект со схемой и пропишет все необходимые пространства имен (xmlns) и типы (xsi:type) без ручного кодинга.
  3. Автоматическое экранирование спецсимволов. Символы вроде амперсанда & или кавычек-ёлочек «» в названиях контрагентов будут автоматически преобразованы в безопасные XML-сущности (например, &amp;).

---

"Подводные камни" при обмене с банками

Даже если ваш XML-код сформирован без синтаксических ошибок, при реальном обмене с банками вы можете столкнуться с неочевидными проблемами, которые придется оперативно решать.

Проблема 1. Ограничение длины номера договора

В официальной XML-схеме Сбербанка и фирмы 1С (Wages_3.5.xsd) на атрибут НомерДоговора наложено жесткое ограничение: его длина не должна превышать 8 символов.

Однако на практике некоторые другие банки (например, Россельхозбанк) выдают своим клиентам номера договоров длиной по 15-20 символов. При попытке выгрузить такой файл через стандартный XDTO-пакет система выдаст ошибку валидации схемы еще на этапе записи.

Решение: Если вы используете XDTO, вам потребуется внести изменения в свойства пакета в конфигураторе (или через расширение конфигурации), увеличив ограничение длины (Facet "maxLength") у свойства НомерДоговора в структуре СчетПК.

Проблема 2. Ошибка парсера на стороне банка ("Не удалось распознать структуру")

Некоторые банки используют сильно упрощенные самописные парсеры для чтения файлов от клиентов. Такие программы "пугаются" обилия служебных пространств имен вроде xmlns:xs или xsi:type в корневом теге.

Решение: В типовых конфигурациях 1С для таких случаев предусмотрен специальный механизм "очистки". Перед отправкой файла в банк вызывается функция, которая принудительно удаляет эти атрибуты из текста готового файла. Если вы используете ручной метод ЗаписьXML, вы можете просто закомментировать строки записи пространств имен, оставив только чистые прикладные атрибуты:


// ЗаписьXML.ЗаписатьАтрибут("xmlns:xs", "http://www.w3.org/2001/XMLSchema"); // закомментировать при проблемах в банке

Проанализируйте требования технической поддержки конкретного банка, чтобы понять, необходима ли им строгая валидация по схеме или максимально упрощенный XML-файл.

← На главную