При переходе на электронный документооборот (ЭДО) одной из самых трудоемких задач становится выгрузка ЭД УПД в XML и формирование XML-файлов, соответствующих жестким требованиям ФНС и операторов, таких как «Диадок». Основным инструментом для решения этой задачи в среде 1С является механизм XDTO или специализированная выгрузка УПД в XML для Diadoc (XML Data Transfer Objects). В этой статье мы подробно разберем, как пройти путь от XSD-схемы до готового файла, пригодного для загрузки в систему электронного документооборота, или как использовать готовое решение для выгрузки УПД из Реализации товаров и услуг — для этого подойдёт обработка выгрузки УПД из 1С в XML-файл.
Для начала разберем общую концепцию. XSD-схема (XML Schema Definition) — это документ, описывающий правила построения XML: какие теги должны быть, в какой последовательности они идут, какие атрибуты являются обязательными, а какие — нет. Читать такую схему «глазами» и пытаться собрать XML-файл простой склейкой строк — путь к бесконечным ошибкам. Проанализируем правильный алгоритм действий.
Самый надежный способ — импортировать схему в вашу конфигурацию или создать на ее основе XDTO-пакет. Рассмотрим, как это сделать:
.xsd (например, для УПД это схема ON_NSCHFDOPPR), 1С автоматически создаст структуру объектов.Это дает нам огромное преимущество: мы сможем обращаться к свойствам объектов через точку, а система сама будет подсказывать доступные поля и проверять типы данных.
Теперь разберем практический пример кода. Предположим, у нас уже есть подключенный 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.Создать(). Важно помнить, что если свойство является составным объектом, нельзя просто присвоить ему строку или число — нужно сначала создать объект соответствующего типа, заполнить его, а затем присвоить родителю.
Одной из самых частых причин отказа в приеме файла «Диадоком» является неверный ИдФайл. Разберем его структуру подробно. Для УПД формат следующий:
Префикс_ИдОтправителя_ИдПолучателя_Дата_УникальныйИдентификатор
ON_NSCHFDOPPR для счета-фактуры и УПД).2BE.В реальном УПД всегда есть список товаров или услуг. В 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 — это наиболее профессиональный и стабильный подход. Он обеспечивает автоматический контроль типов, упрощает работу с вложенными структурами и позволяет легко проводить валидацию данных перед отправкой.