При использовании внешней обработки интеграции со СБИС в типовых и отраслевых конфигурациях на платформе 1С:Предприятие часто возникает необходимость скорректировать данные, попадающие в выгружаемый электронный документ. Например, требуется выгрузить фактический или юридический адрес не из основного контрагента, а из связанного партнера (или грузополучателя), либо переопределить КПП и другие контактные данные с помощью собственного программного алгоритма.
Разберем архитектуру работы файлов настроек СБИС, правила редактирования XML-схем и особенности подключения собственных функций из внешних обработок.
Механизм выгрузки СБИС опирается на XML-файлы сопоставления полей документа 1С с полями формата электронного документа. В каталоге настроек присутствуют два типа файлов:
.sbis3.xml (или .sbis.xml) — содержат типовые правила выборки данных из метаданных конфигурации 1С.sbis3 (например, УправлениеТорговлей_РеализацияТоваровУслуг.xml) — служат для переопределения типовых правил под специфику учета конкретного предприятия.Проанализируем ключевое правило: чтобы пользовательская настройка корректно применилась, переопределяемый параметр или блок должен существовать в основной структуре базового файла, либо должен быть описан по строго поддерживаемым правилам модели данных.
Рассмотрим, как устроен типовой блок получения адреса стороны документа (например, грузополучателя или грузоотправителя). В стандартной схеме выборка адреса разбита на два шага: подготовка контекста табличной части с отбором и последующее форматирование адреса функцией обработки.
Посмотрим на пример типового описания блока выборки контактной информации:
<Выбор Имя="ЮрАдресГрузополучателя">
<Адрес Кэш="Грузополучатель" Тип="ТабличнаяЧасть" Отбор_Вид="[ВидыКонтактнойИнформации].ЮрАдресКонтрагента" Отбор_Тип="[ТипыКонтактнойИнформации].Адрес">[Сторона].КонтактнаяИнформация</Адрес>
</Выбор>
<Сторона_Адрес Кэш="Грузополучатель">{ПолучитьАдресУП()}</Сторона_Адрес>
Если в документе информационной базы адрес необходимо извлекать не из реквизита [Сторона] (контрагента), а из справочника Партнеры (например, когда грузополучателем выступает партнер или обособленное подразделение), переопределим источник данных табличной части.
Разберем по шагам, как настроить секцию <мСторона> в файле пользовательских настроек:
<А_Партнер>[Документ].Партнер</А_Партнер>.<Партнер>[А_Партнер].Грузополучатель_СБИС</Партнер>.[Сторона].КонтактнаяИнформация на [Партнер].КонтактнаяИнформация.[ВидыКонтактнойИнформации].АдресПартнера).Посмотрим на итоговый рабочий пример секции для блока Грузополучатель:
<мСторона Имя="Грузополучатель">
<А_Партнер>[Документ].Партнер</А_Партнер>
<Партнер>[А_Партнер].Грузополучатель_СБИС</Партнер>
<Сторона>^=([Документ].Грузополучатель,[Документ].Грузополучатель,[Документ].Контрагент)</Сторона>
<Роль>'Грузополучатель'</Роль>
<Сторона_ИНН>[Сторона].ИНН</Сторона_ИНН>
<Сторона_КПП>{ПолучитьКПП_Партнера()}</Сторона_КПП>
<Сторона_Наименование>{ПолучитьНаименованиеПартнера()}</Сторона_Наименование>
<ВидыКонтактнойИнформации>Справочник.ВидыКонтактнойИнформации</ВидыКонтактнойИнформации>
<ТипыКонтактнойИнформации>Перечисление.ТипыКонтактнойИнформации</ТипыКонтактнойИнформации>
<Выбор Имя="ФактАдресГрузополучателя">
<Адрес Кэш="Грузополучатель" Тип="ТабличнаяЧасть" Отбор_Вид="[ВидыКонтактнойИнформации].АдресПартнера" Отбор_Тип="[ТипыКонтактнойИнформации].Адрес">[Партнер].КонтактнаяИнформация</Адрес>
<Условие>^=(Адрес,'Истина','Ложь')</Условие>
</Выбор>
<Сторона_Адрес Кэш="Грузополучатель">{ПолучитьАдресУП()}</Сторона_Адрес>
</мСторона>
Для сложных алгоритмов вычисления значений (например, определение КПП по филиалу, вычисление доп. реквизитов) используется вызов экспортных функций из внешней обработки расширения. Функция заключается в фигурные скобки: {ИмяФункции()}.
Выясним причину, по которой обработка СБИС может игнорировать вызов пользовательской функции:
<МойТег>{МояФункция()}</МойТег>, парсер пропустит его и не станет вычислять код в фигурных скобках. Вызовы функций необходимо назначать на стандартные предопределенные реквизиты (например, Сторона_КПП, Сторона_Наименование, Сторона_Адрес).Экспорт.Посмотрим на пример реализации функции во внешней обработке расширения:
Функция ПолучитьКПП_Партнера(Контекст) Экспорт
// Проверяем наличие переданных данных документа
Если Контекст = Неопределено Тогда
Возврат "";
КонецЕсли;
// Получаем значение реквизита или дополнительного свойства
ПартнерОбъект = Контекст.Документ.Партнер;
Если ЗначениеЗаполнено(ПартнерОбъект) И ЗначениеЗаполнено(ПартнерОбъект.КПП) Тогда
Возврат СокрЛП(ПартнерОбъект.КПП);
КонецЕсли;
Возврат "";
КонецФункции
Если данные (например, ссылка на обособленного грузополучателя) хранятся не в реквизитах шапки, а в механизме дополнительных реквизитов и сведений (табличная часть ДополнительныеРеквизиты), прямое обращение через точку вида [Документ].Партнер.Грузополучатель не сработает.
В этом случае рекомендуются два подхода:
Сторона_Наименование, Сторона_КПП, Сторона_Адрес) через экспортные функции, где значение свойства считывается прямым запросом к табличной части ДополнительныеРеквизиты объекта или через методы подсистемы БСП УправлениеСвойствами.Партнеры существенно упрощает XML-описание настроек и снижает число серверных вызовов при пакетной обработке документов.