Как добавить свой тег в XML-файл при выгрузке из 1С через обработку СБИС?

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

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

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

Принцип работы механизма выгрузки СБИС

Прежде чем приступать к доработке, важно понимать архитектуру обработки СБИС. Процесс формирования конечного XML-файла — это не прямое создание документа по XDTO-схеме из 1С. Он состоит из нескольких этапов:

  1. На основе данных из документа 1С и правил, описанных в специальных файлах настроек, формируется промежуточный XML-файл внутреннего формата СБИС.
  2. Затем, с помощью XSLT-преобразований, этот промежуточный файл конвертируется в конечный XML-файл требуемого формата (например, УПД по формату ФНС).

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

Ключевой принцип доработки — неизменность стандартных компонентов. Для этого СБИС предлагает два мощных инструмента:

Решение: Добавление тега через пользовательские настройки и внешние функции

Чтобы добавить тег <ТранГруз> в нужное место структуры, например, внутрь тега <СвПер>, необходимо выполнить два шага: создать пользовательский файл настроек и, при необходимости, описать логику получения данных в обработке внешних функций.

Шаг 1: Создание пользовательского файла настроек

Сначала нужно найти стандартный файл, который отвечает за выгрузку вашего документа, и создать на его основе пользовательскую версию.

  1. Найдите каталог, где хранятся настройки обработки СБИС. Обычно это папка C:\Sbis1C\ на компьютере пользователя.

  2. В этом каталоге найдите стандартный файл настроек для выгрузки УПД в формате XML (например, для документа «Реализация товаров и услуг»). Эти файлы имеют расширение .sbis3.xml. Например, ВО82БУХ3-0-67-38_РеализацияТоваровУслуг.sbis3.xml.

  3. Скопируйте этот файл в ту же папку и переименуйте его, убрав расширение .sbis3. В нашем примере новый файл будет называться ВО82БУХ3-0-67-38_РеализацияТоваровУслуг.xml. Обработка СБИС при запуске обнаружит этот файл и будет использовать его с приоритетом над стандартным.

  4. Откройте созданный XML-файл в любом текстовом редакторе. Найдите в структуре место, куда нужно вставить новый тег. В нашем случае это узел <СвПер>. Добавьте в него нужный тег и укажите, как получать для него данные. Для этого можно вызвать функцию из внешней обработки.

Посмотрим на условный пример содержимого файла настроек:


<?xml version="1.0" encoding="UTF-8"?>
<ини>
    <мФайл Имя="ЭДОНакл">
        <!-- ... другие теги ... -->
        <СвПродПер>
            <СвПер СодОпер="Реализация">
                <ОснПер НаимОсн="Без документа-основания"/>
                
                <!-- Вот наш новый тег. Данные для атрибута СвТранГруз
                     будут получены вызовом функции сбисПолучитьДанныеТранспорта() -->
                <ТранГруз СвТранГруз="{сбисПолучитьДанныеТранспорта()}"/> 
            
            </СвПер>
        </СвПродПер>
        <!-- ... другие теги ... -->
    </мФайл>
</ини>

Конструкция {имя_функции()} в значении атрибута указывает обработке СБИС, что нужно вызвать экспортную функцию с таким именем из обработки ВнешниеФункции_Клиент.epf и подставить ее результат.

Шаг 2: Реализация логики в обработке `ВнешниеФункции_Клиент.epf`

Теперь нужно создать саму функцию, которая будет возвращать данные для нашего тега. Это особенно актуально, если вы формируете специфические документы, такие как OZON УПД (поможет обработка формирования XML-файлов УПД и УКД для OZON) или WildBerries УПД «ДОП».

  1. Если у вас еще нет обработки ВнешниеФункции_Клиент.epf, создайте ее в конфигураторе 1С как новую внешнюю обработку.

  2. Сохраните ее либо в каталоге настроек СБИС (например, C:\Sbis1C\), либо загрузите в справочник "Дополнительные отчеты и обработки" вашей конфигурации 1С. Обработка СБИС будет искать ее в обоих местах.

  3. В модуле объекта этой обработки создайте экспортную функцию с именем, которое вы указали в XML-файле на предыдущем шаге.

Посмотрим на пример кода для ВнешниеФункции_Клиент.epf:


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

    // Здесь может быть ваша сложная логика для получения данных
    ЗначениеТранспорта = "Тест_Транспорт";
	
    Возврат ЗначениеТранспорта;
	
КонецФункции

После сохранения обработки и файла настроек, при следующей выгрузке документа через СБИС, в XML-файл будет добавлен тег <ТранГруз> с данными, которые вернула ваша функция.

Альтернативный способ: функция `сбисПослеФормированияДокумента`

В обсуждениях часто упоминается еще одна полезная функция — сбисПослеФормированияДокумента. Она также размещается в ВнешниеФункции_Клиент.epf, но вызывается уже после того, как основной XML-документ сформирован по файлам настроек.

Эта функция удобна, когда нужно добавить тег в конец документа или в конец какой-либо секции, не меняя основную структуру. Однако, если требуется вставить тег строго в определенное место между другими тегами (как в нашем примере), то метод с переопределением файла настроек является более правильным и управляемым.

Пример использования для добавления данных в конец документа:


// Функция добавляется в модуль объекта обработки "ВнешниеФункции_Клиент.epf"
Функция сбисПослеФормированияДокумента(Док, Кэш, Контекст) Экспорт
	
    // Проверяем, что для документа нужно добавить сведения о выбытии маркированных товаров
    Если Контекст.Документ.ДокументОснование.ОперацияВыбытияМаркированныхТоваров <> 0 Тогда
        // Добавляем новый параметр в корневой узел документа
        Док.Файл.Документ.Параметр.Добавить(Новый Структура("Имя, Значение", "СвВыбытияМАРК", Контекст.Документ.ДокументОснование.ОперацияВыбытияМаркированныхТоваров));	
    КонецЕсли;	
	
КонецФункции

Важно понимать: этот метод добавляет узел на верхний уровень. Для встраивания тега вглубь иерархии XML используйте первый способ с пользовательскими файлами настроек.

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

← На главную