Как загрузить свои XML-документы УПД (ON_NSCHFDOPPR) в собственную "Реализацию товаров и услуг" в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

При работе с 1С и электронным документооборотом часто возникает задача загрузки входящих документов — для этого есть автоматическая загрузка XML-документов УПД в 1С. Однако загрузка своих собственных XML-документов формата ON_NSCHFDOPPR (Универсальный передаточный документ для продавца, версия 5.03) не в привычное "Поступление товаров и услуг", а в "Реализацию товаров и услуг", является нетиповой задачей. Давайте вместе разберемся, как реализовать такую загрузку, используя механизмы платформы 1С:Предприятие или универсальное решение для загрузки исходящих УПД в реализацию.

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

Понимание формата ON_NSCHFDOPPR (УПД 5.03) и особенности задачи

Прежде чем приступить к разработке, давайте подробнее рассмотрим, с чем мы имеем дело:

  1. Формат УПД ON_NSCHFDOPPR: Этот формат предназначен для продавца и является стандартизированным XML-файлом для передачи данных универсального передаточного документа — для этого подойдёт автоматическое распознавание и загрузка УПД в систему. В обычной практике электронного документооборота (ЭДО) он используется покупателем для автоматического создания документа "Поступление товаров и услуг" в своей учетной системе 1С.
  2. Нестандартность задачи: Ваша цель — загрузить этот "продажный" УПД в собственный документ "Реализация товаров и услуг". Это означает, что мы не можем использовать типовые обработчики ЭДО "как есть", поскольку они заточены под обратный процесс.
  3. Актуальность формата: Формат УПД 5.03 является действующим и стал обязательным с 1 апреля 2025 года. Для корректной работы с ним важно, чтобы ваша конфигурация 1С была обновлена, также можно использовать актуальные решения для формата 5.03, обеспечивающие поддержку маркировки и прослеживаемости.

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

Общий подход к решению: Разработка пользовательской обработки или расширения

Для нашей задачи наиболее эффективным решением будет создание собственной внешней обработки или использование готового расширения для импорта XML в реализацию (удобнее через загрузка документов из XML в реализацию). Это позволит нам детально контролировать процесс:

  1. Парсинг XML-файла: Мы будем читать XML-файла, извлекая из него необходимую информацию.
  2. Маппинг данных: Сопоставим данные из XML-файла с реквизитами документа "Реализация товаров и услуг".
  3. Создание/Заполнение документа: На основе извлеченных и сопоставленных данных мы программно создадим новый документ "Реализация товаров и услуг" или заполним существующий.

Типовая обработка "Универсальный обмен данными в формате XML" из "Режима технического специалиста", хотя и предназначена для импорта/экспорта данных, скорее всего, не подойдет, так как она требует специфического формата XML-файлов и правил обмена, которые не соответствуют структуре УПД ON_NSCHFDOPPR.

Пошаговая реализация загрузки XML в 1С

Давайте разберем по шагам, как построить логику загрузки.

1. Чтение и парсинг XML-файла

Первым шагом нам нужно прочитать содержимое XML-файла. Для этого в 1С используются объекты ЧтениеXML.

Рассмотрим пример кода для инициализации чтения XML и прохода по его структуре:


Функция ЗагрузитьУПД_ON_NSCHFDOPPR(ИмяФайлаXML) Экспорт
    
    Перем ОбъектЧтениеXML;
    Попытка
        ОбъектЧтениеXML = Новый ЧтениеXML;
        ОбъектЧтениеXML.ОткрытьФайл(ИмяФайлаXML);
    Исключение
        Сообщить("Ошибка открытия XML-файла: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
    // Переменные для хранения данных из XML
    СтруктураДанныхДокумента = Новый Структура;
    
    Попытка
        Пока ОбъектЧтениеXML.Прочитать() Цикл
            Если ОбъектЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                // Здесь мы будем обрабатывать различные элементы XML-файла
                // Например, ищем корневой элемент документа, информацию о контрагентах и табличную часть.
                Если ОбъектЧтениеXML.Имя = "Файл" Тогда
                    // Предполагаем, что внутри элемента "Файл" будут все основные данные
                    РазборЭлементаФайл(ОбъектЧтениеXML, СтруктураДанныхДокумента);
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    Исключение
        Сообщить("Ошибка при чтении XML-файла: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
    ОбъектЧтениеXML.Закрыть();
    
    Возврат СтруктураДанныхДокумента;
КонецФункции

Процедура РазборЭлементаФайл(ЧтениеXML, СтруктураДанныхДокумента)
    Пока ЧтениеXML.Прочитать() Цикл
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Файл" Тогда
            Прервать; // Выходим из текущего элемента
        КонецЕсли;
        
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            Если ЧтениеXML.Имя = "СвУчДокОбор" Тогда // Сведения об участниках документооборота
                // Здесь мы можем получить данные о продавце и покупателе
                // Например, ИНН, КПП, наименование
                // Для УПД продавца, продавцом будет наша организация, покупателем - контрагент
                РазборУчастниковДокументооборота(ЧтениеXML, СтруктураДанныхДокумента);
            ИначеЕсли ЧтениеXML.Имя = "Документ" Тогда // Сам документ УПД
                РазборДокументаУПД(ЧтениеXML, СтруктураДанныхДокумента);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Мы будем рекурсивно или итеративно проходить по узлам XML-файла, извлекая нужные значения, такие как ИНН, наименование контрагента, номер документа, дата, номенклатура, количество, цена, сумма, ставка НДС и т.д. Все извлеченные данные будем сохранять во временную структуру или таблицу значений.

2. Сопоставление номенклатуры – ключевой аспект

Один из самых важных этапов – это правильное сопоставление номенклатуры (поможет интеллектуальное сопоставление номенклатуры поставщиков в ЭДО) из XML-файла с номенклатурой в вашей базе 1С. Разберем основные подходы:

  1. Регистр сведений "Номенклатура контрагентов БЭД": Этот регистр является стандартным механизмом 1С для сопоставления наименований номенклатуры, используемой контрагентом, с вашей внутренней номенклатурой. При импорте данных мы сначала попытаемся найти соответствие именно здесь.
  2. Поиск по справочнику "Номенклатура": Если в регистре соответствие не найдено, следующим шагом может быть поиск в основном справочнике по наименованию, артикулу или штрихкоду.
  3. Создание новой номенклатуры: В случае отсутствия соответствия, ваша обработка может автоматически создавать новые позиции. В этом случае крайне полезна профессиональная загрузка с расширенным сопоставлением номенклатуры, которая позволяет сохранять связи для будущих загрузок.

Посмотрим на пример логики сопоставления:


Функция ПолучитьНоменклатуруПоДаннымXML(НаименованиеИзXML, Контрагент)
    
    // 1. Поиск в регистре "Номенклатура контрагентов БЭД"
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    НоменклатураКонтрагентовБЭД.Номенклатура
        |ИЗ
        |    РегистрСведений.НоменклатураКонтрагентовБЭД КАК НоменклатураКонтрагентовБЭД
        |ГДЕ
        |    НоменклатураКонтрагентовБЭД.Контрагент = &Контрагент
        |    И НоменклатураКонтрагентовБЭД.НаименованиеКонтрагента = &НаименованиеИзXML";
    Запрос.УстановитьПараметр("Контрагент", Контрагент);
    Запрос.УстановитьПараметр("НаименованиеИзXML", НаименованиеИзXML);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Номенклатура;
    КонецЕсли;
    
    // 2. Поиск в справочнике "Номенклатура"
    Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(НаименованиеИзXML);
    Если Номенклатура <> Неопределено Тогда
        Возврат Номенклатура;
    КонецЕсли;
    
    // 3. Создание новой номенклатуры (если разрешено)
    Если ПараметрыОбработки.СоздаватьНенайденнуюНоменклатуру Тогда
        НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
        НоваяНоменклатура.Наименование = НаименованиеИзXML;
        НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар");
        НоваяНоменклатура.Записать();
        Возврат НоваяНоменклатура;
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

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

3. Работа с контрагентами и другими реквизитами

Из XML-файла нам также потребуется извлечь данные о контрагенте (покупателе в нашем случае) и нашей организации (продавце). Мы ищем их в соответствующих справочниках 1С по ИНН/КПП или наименованию.

Другие важные реквизиты, которые необходимо получить из XML и заполнить в документе "Реализация товаров и услуг":

4. Создание и заполнение документа "Реализация товаров и услуг"

После того как все данные из XML извлечены и сопоставлены, мы можем приступать к программному созданию документа РеализацияТоваровУслуг. Разберем по шагам создание документа:

  1. Создание нового объекта документа: Используем метод СоздатьДокумент().
  2. Заполнение шапки документа: Заполняем основные реквизиты: Дата, Организация, Контрагент, ДоговорКонтрагента.
  3. Заполнение табличной части "Товары": Добавляем строки, заполняя Номенклатура, Количество, Цена, Сумма.
  4. Расчет итогов и запись: Выполняем расчет итогов и записываем документ методом Записать().

Посмотрим на пример кода для создания документа:


Функция СоздатьДокументРеализация(СтруктураДанныхДокумента)
    
    НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    
    // Заполнение шапки документа
    НовыйДокумент.Дата = СтруктураДанныхДокумента.ДатаДокумента;
    НовыйДокумент.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", СтруктураДанныхДокумента.ИННПродавца);
    НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", СтруктураДанныхДокумента.ИННПокупателя);
    НовыйДокумент.ДоговорКонтрагента = НовыйДокумент.Контрагент.ОсновнойДоговорКонтрагента;
    
    // Заполнение табличной части "Товары"
    Для Каждого СтрокаТЧИзXML Из СтруктураДанныхДокумента.ТабличнаяЧасть Цикл
        НоваяСтрока = НовыйДокумент.Товары.Добавить();
        НоваяСтрока.Номенклатура = ПолучитьНоменклатуруПоДаннымXML(СтрокаТЧИзXML.НаименованиеНоменклатуры, НовыйДокумент.Контрагент);
        НоваяСтрока.Количество = СтрокаТЧИзXML.Количество;
        НоваяСтрока.Цена = СтрокаТЧИзXML.Цена;
        НоваяСтрока.Сумма = СтрокаТЧИзXML.Сумма;
        НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НайтиПоНаименованию(СтрокаТЧИзXML.СтавкаНДС);
    КонецЦикла;
    
    Попытка
        НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
        Сообщить("Документ успешно создан.");
    Исключение
        Сообщить("Ошибка при записи: " + ОписаниеОшибки());
    КонецПопытки;
    
    Возврат НовыйДокумент;
    
КонецФункции

5. Использование готовых решений и их адаптация

На платформах, таких как Инфостарт, часто встречаются публикации, демонстрирующие подходы к загрузке XML-документов. Например, крайне полезна публикация с универсальным решением для УТ 11, КА 2, ERP 2 и БП 3.0. Хотя подобные решения часто описывают импорт для создания документов поступления, они могут послужить отличной отправной точкой.

Как адаптировать такое решение?

  1. Изучите код парсинга XML: Логика чтения XML-файла и извлечения данных о контрагентах будет аналогичной.
  2. Измените процесс создания документа: Вместо создания объекта Документы.ПоступлениеТоваровУслуг используйте Документы.РеализацияТоваровУслуг.
  3. Пересмотрите маппинг полей: Убедитесь, что в "Реализации" ваша организация стоит в поле "Организация", а контрагент — в поле "Контрагент".
  4. Адаптируйте сопоставление номенклатуры: Используйте механизмы сопоставления через регистр НоменклатураКонтрагентовБЭД.

Важные моменты и доработки

Таким образом, для успешной загрузки своих документов XML ON_NSCHFDOPPR (УПД 5.03) в собственную "Реализацию товаров и услуг" нам потребуется разработка специализированной внешней обработки или расширения. Она будет включать в себя парсинг XML-файла, тщательное сопоставление данных (особое внимание уделяем номенклатуре) и программное создание или перезаполнение документов "Реализация товаров и услуг".

← На главную