Как настроить получение адресов и реквизитов контрагентов во внешней обработке СБИС ЭДО для 1С?

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

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

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

Принцип работы файлов конфигурации СБИС ЭДО

Механизм выгрузки СБИС опирается на XML-файлы сопоставления полей документа 1С с полями формата электронного документа. В каталоге настроек присутствуют два типа файлов:

  1. Базовые файлы конфигурации с расширением .sbis3.xml (или .sbis.xml) — содержат типовые правила выборки данных из метаданных конфигурации 1С.
  2. Файлы пользовательских настроек без суффикса sbis3 (например, УправлениеТорговлей_РеализацияТоваровУслуг.xml) — служат для переопределения типовых правил под специфику учета конкретного предприятия.

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

Переопределение контактной информации (адресов) контрагента и партнера

Рассмотрим, как устроен типовой блок получения адреса стороны документа (например, грузополучателя или грузоотправителя). В стандартной схеме выборка адреса разбита на два шага: подготовка контекста табличной части с отбором и последующее форматирование адреса функцией обработки.

Посмотрим на пример типового описания блока выборки контактной информации:


<Выбор Имя="ЮрАдресГрузополучателя">
    <Адрес Кэш="Грузополучатель" Тип="ТабличнаяЧасть" Отбор_Вид="[ВидыКонтактнойИнформации].ЮрАдресКонтрагента" Отбор_Тип="[ТипыКонтактнойИнформации].Адрес">[Сторона].КонтактнаяИнформация</Адрес>
</Выбор>
<Сторона_Адрес Кэш="Грузополучатель">{ПолучитьАдресУП()}</Сторона_Адрес>

Если в документе информационной базы адрес необходимо извлекать не из реквизита [Сторона] (контрагента), а из справочника Партнеры (например, когда грузополучателем выступает партнер или обособленное подразделение), переопределим источник данных табличной части.

Разберем по шагам, как настроить секцию <мСторона> в файле пользовательских настроек:

  1. Объявим ссылку на объект-источник (партнера), обратившись к документу: <А_Партнер>[Документ].Партнер</А_Партнер>.
  2. Если партнер хранится в отдельном дополнительном или специализированном реквизите, укажем путь к нему: <Партнер>[А_Партнер].Грузополучатель_СБИС</Партнер>.
  3. В блоке отбора контактной информации перенаправим источник табличной части с [Сторона].КонтактнаяИнформация на [Партнер].КонтактнаяИнформация.
  4. Скорректируем виды контактной информации в отборе в соответствии со справочником (например, [ВидыКонтактнойИнформации].АдресПартнера).

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


<мСторона Имя="Грузополучатель">
    <А_Партнер>[Документ].Партнер</А_Партнер>
    <Партнер>[А_Партнер].Грузополучатель_СБИС</Партнер>
    <Сторона>^=([Документ].Грузополучатель,[Документ].Грузополучатель,[Документ].Контрагент)</Сторона>
    <Роль>'Грузополучатель'</Роль>
    <Сторона_ИНН>[Сторона].ИНН</Сторона_ИНН>
    <Сторона_КПП>{ПолучитьКПП_Партнера()}</Сторона_КПП>
    <Сторона_Наименование>{ПолучитьНаименованиеПартнера()}</Сторона_Наименование>
    <ВидыКонтактнойИнформации>Справочник.ВидыКонтактнойИнформации</ВидыКонтактнойИнформации>
    <ТипыКонтактнойИнформации>Перечисление.ТипыКонтактнойИнформации</ТипыКонтактнойИнформации>
    <Выбор Имя="ФактАдресГрузополучателя">
        <Адрес Кэш="Грузополучатель" Тип="ТабличнаяЧасть" Отбор_Вид="[ВидыКонтактнойИнформации].АдресПартнера" Отбор_Тип="[ТипыКонтактнойИнформации].Адрес">[Партнер].КонтактнаяИнформация</Адрес>
        <Условие>^=(Адрес,'Истина','Ложь')</Условие>
    </Выбор>
    <Сторона_Адрес Кэш="Грузополучатель">{ПолучитьАдресУП()}</Сторона_Адрес>
</мСторона>

Использование внешних функций и обработок расширения логики

Для сложных алгоритмов вычисления значений (например, определение КПП по филиалу, вычисление доп. реквизитов) используется вызов экспортных функций из внешней обработки расширения. Функция заключается в фигурные скобки: {ИмяФункции()}.

Выясним причину, по которой обработка СБИС может игнорировать вызов пользовательской функции:

  1. Использование произвольных (нестандартных) XML-тегов: ядро обработки парсит только те теги, которые соответствуют предопределенной схеме целевого электронного документа. Если создать собственный произвольный тег <МойТег>{МояФункция()}</МойТег>, парсер пропустит его и не станет вычислять код в фигурных скобках. Вызовы функций необходимо назначать на стандартные предопределенные реквизиты (например, Сторона_КПП, Сторона_Наименование, Сторона_Адрес).
  2. Экспортный модификатор: функция в модуле внешней обработки обязательно должна быть объявлена с ключевым словом Экспорт.
  3. Параметр контекста: при вызове функции ядро СБИС передает в нее структуру параметров объекта. В коде функции доступ к исходному документу 1С выполняется через поле переданного контекста.

Посмотрим на пример реализации функции во внешней обработке расширения:


Функция ПолучитьКПП_Партнера(Контекст) Экспорт
    
    // Проверяем наличие переданных данных документа
    Если Контекст = Неопределено Тогда
        Возврат "";
    КонецЕсли;
    
    // Получаем значение реквизита или дополнительного свойства
    ПартнерОбъект = Контекст.Документ.Партнер;
    Если ЗначениеЗаполнено(ПартнерОбъект) И ЗначениеЗаполнено(ПартнерОбъект.КПП) Тогда
        Возврат СокрЛП(ПартнерОбъект.КПП);
    КонецЕсли;
    
    Возврат "";
    
КонецФункции

Рекомендации по работе с дополнительными реквизитами (БСП)

Если данные (например, ссылка на обособленного грузополучателя) хранятся не в реквизитах шапки, а в механизме дополнительных реквизитов и сведений (табличная часть ДополнительныеРеквизиты), прямое обращение через точку вида [Документ].Партнер.Грузополучатель не сработает.

В этом случае рекомендуются два подхода:

  1. Программное получение во внешней функции: переопределить типовые поля выгрузки (Сторона_Наименование, Сторона_КПП, Сторона_Адрес) через экспортные функции, где значение свойства считывается прямым запросом к табличной части ДополнительныеРеквизиты объекта или через методы подсистемы БСП УправлениеСвойствами.
  2. Вынесение значения в реквизиты объекта: если конфигурация находится на поддержке с возможностью изменения, добавление явного реквизита в справочник Партнеры существенно упрощает XML-описание настроек и снижает число серверных вызовов при пакетной обработке документов.
← На главную