Как сформировать XML-файл для Диадок на основе XSD-схемы УПД в 1С?

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

При переходе на электронный документооборот (ЭДО) одной из самых трудоемких задач становится выгрузка ЭД УПД в XML и формирование XML-файлов, соответствующих жестким требованиям ФНС и операторов, таких как «Диадок». Основным инструментом для решения этой задачи в среде 1С является механизм XDTO или специализированная выгрузка УПД в XML для Diadoc (XML Data Transfer Objects). В этой статье мы подробно разберем, как пройти путь от XSD-схемы до готового файла, пригодного для загрузки в систему электронного документооборота, или как использовать готовое решение для выгрузки УПД из Реализации товаров и услуг — для этого подойдёт обработка выгрузки УПД из 1С в XML-файл.

Основы работы с XSD-схемами в 1С

Для начала разберем общую концепцию. XSD-схема (XML Schema Definition) — это документ, описывающий правила построения XML: какие теги должны быть, в какой последовательности они идут, какие атрибуты являются обязательными, а какие — нет. Читать такую схему «глазами» и пытаться собрать XML-файл простой склейкой строк — путь к бесконечным ошибкам. Проанализируем правильный алгоритм действий.

Самый надежный способ — импортировать схему в вашу конфигурацию или создать на ее основе XDTO-пакет. Рассмотрим, как это сделать:

  1. Откройте конфигуратор 1С.
  2. Найдите в дереве метаданных раздел Общие -> XDTO-пакеты.
  3. Нажмите правую кнопку мыши и выберите «Импорт схемы XML».
  4. После выбора файла .xsd (например, для УПД это схема ON_NSCHFDOPPR), 1С автоматически создаст структуру объектов.

Это дает нам огромное преимущество: мы сможем обращаться к свойствам объектов через точку, а система сама будет подсказывать доступные поля и проверять типы данных.

Программное формирование структуры XML

Теперь разберем практический пример кода. Предположим, у нас уже есть подключенный XDTO-пакет. Нам необходимо создать объект «Файл», наполнить его данными об отправителе, получателе и самой табличной части документа. Посмотрим на пример реализации, который позволяет создать корень документа и его основные узлы.


// Создаем объект на основании типа, описанного в XDTO-пакете
// "ON_NSCHFDOPPR_2019" - это пространство имен вашей схемы
ФайлXML = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://имя-пространства-имен", "Файл"));

// Заполняем базовые атрибуты заголовка
ФайлXML.ИдФайл = "ON_NSCHFDOPPR_2BE123_2BE456_20231025_GUID";
ФайлXML.ВерсФорм = "5.01";
ФайлXML.ВерсПрог = "1C:ERP 2.5";

// Работаем с вложенными объектами. 
// Чтобы создать вложенный узел, нужно получить его тип из свойств родителя
ТипСвУчДокОбор = ФайлXML.Свойства().Получить("СвУчДокОбор").Тип;
СвУчДокОбор = ФабрикаXDTO.Создать(ТипСвУчДокОбор);

СвУчДокОбор.ИдОтпр = "2BE1234567890"; // Идентификатор отправителя в ЭДО
СвУчДокОбор.ИдПол = "2BE0987654321";  // Идентификатор получателя в ЭДО

// Присваиваем созданный объект родителю
ФайлXML.СвУчДокОбор = СвУчДокОбор;

Проанализируем этот код. Мы используем метод ФабрикаXDTO.Создать(). Важно помнить, что если свойство является составным объектом, нельзя просто присвоить ему строку или число — нужно сначала создать объект соответствующего типа, заполнить его, а затем присвоить родителю.

Важные нюансы идентификатора ИдФайл

Одной из самых частых причин отказа в приеме файла «Диадоком» является неверный ИдФайл. Разберем его структуру подробно. Для УПД формат следующий:

Префикс_ИдОтправителя_ИдПолучателя_Дата_УникальныйИдентификатор

Заполнение табличной части и работа со списками

В реальном УПД всегда есть список товаров или услуг. В XDTO это реализуется через коллекции. Рассмотрим, как добавить строки в документ:


// Допустим, мы находимся в узле "Документ.ТаблСчФакт"
ТипСведенияОТоваре = ФабрикаXDTO.Тип("http://имя-пространства-имен", "СведенияОТоваре");

Для Каждого СтрокаТЧ Из СсылкаНаДокумент.Товары Цикл
    НоваяСтрока = ФабрикаXDTO.Создать(ТипСведенияОТоваре);
    НоваяСтрока.НомСтр = СтрокаТЧ.НомерСтроки;
    НоваяСтрока.НаимТов = СтрокаТЧ.Номенклатура.Наименование;
    НоваяСтрока.ОКЕИ_Тов = СтрокаТЧ.Номенклатура.ЕдиницаИзмерения.Код;
    НоваяСтрока.КолТов = СтрокаТЧ.Количество;
    НоваяСтрока.ЦенаТов = СтрокаТЧ.Цена;
    НоваяСтрока.СтТовБезНДС = СтрокаТЧ.Сумма;
    
    // Добавляем заполненную строку в коллекцию родительского объекта
    Документ.ТаблСчФакт.СведенияОТоваре.Добавить(НоваяСтрока);
КонецЦикла;

Обратите внимание: метод Добавить() используется только для тех свойств, которые в XSD-схеме помечены как имеющие неограниченное количество вхождений (maxOccurs="unbounded").

Валидация перед выгрузкой

Перед тем как записывать XML на диск, крайне важно проверить его на соответствие схеме. В 1С для этого предусмотрен встроенный метод Проверить(). Это позволит нам выявить ошибки (например, незаполненное обязательное поле или превышение длины строки) до отправки документа контрагенту — для гарантированного прохождения валидации используйте обработку формирования XML УПД и УКД под требования ФНС.


Попытка
    ФайлXML.Проверить();
    Сообщить("Файл успешно прошел валидацию!");
Исключение
    Инфо = ИнформацияОбОшибке();
    Сообщить("Ошибка валидации: " + Инфо.Описание);
    Возврат;
КонецПопытки;

Запись в файл и кодировка

Завершающий этап — физическое сохранение файла. Для документов, передаваемых в налоговую и через операторов ЭДО, критически важна кодировка. Стандартом является windows-1251.


ПутьКФайлу = "C:\EDO\Export\upd_document.xml";
ЗаписьXML = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("windows-1251", "1.0", Ложь);

ЗаписьXML.ОткрытьФайл(ПутьКФайлу, ПараметрыЗаписиXML);
ЗаписьXML.ЗаписатьОбъявлениеXML();

ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ФайлXML);
ЗаписьXML.Закрыть();

Использование объекта ПараметрыЗаписиXML позволяет нам гарантировать, что файл будет прочитан принимающей стороной без ошибок в кириллических символах.

Использование типовых механизмов (БСП)

Если вы работаете в современной конфигурации (БП 3.0, УТ 11, ERP 2), проанализируйте возможность использования встроенных модулей. В составе Библиотеки стандартных подсистем (БСП) уже есть готовые механизмы для работы с ЭДО. Например, общий модуль ЭДОНФС или подсистема СетевойЭДО — альтернативой может стать готовый модуль электронного документооборота в 1С.

Вместо того чтобы описывать каждый узел вручную, вы можете вызвать программный интерфейс, который сформирует объектную модель документа на основании ссылки на реализацию товаров и услуг. Это значительно упрощает поддержку кода, так как при изменении законодательства 1С выпустит обновление, и вам не придется переписывать алгоритмы формирования XML вручную — также можно использовать модуль автоматической выгрузки УПД в XML для ЭДО.

Резюмируем: формирование XML для «Диадока» через XDTO — это наиболее профессиональный и стабильный подход. Он обеспечивает автоматический контроль типов, упрощает работу с вложенными структурами и позволяет легко проводить валидацию данных перед отправкой.

← На главную