Как настроить выгрузку нескольких ГТД по одному товару в модуле СБИС (Saby) для 1С:УТ 11 / КА 2 / ERP?

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

При работе с электронным документооборотом (ЭДО) через модуль интеграции СБИС (Saby) в ERP-подобных конфигурациях 1С (к которым относятся 1С:Управление торговлей 11, 1С:Комплексная автоматизация 2 и 1С:ERP Управление предприятием 2) пользователи часто сталкиваются с неприятной технической проблемой. При продаже товара, списанного из разных партий с разными грузовыми таможенными декларациями (ГТД), в выгружаемый документ УПД попадает только один номер ГТД. В то же время в печатной форме самой 1С всё отображается корректно.

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

В чем причина проблемы? Анализируем архитектуру 1С

Для того чтобы понять, почему модуль ЭДО СБИС «из коробки» (особенно в более ранних версиях или на сильно измененных конфигурациях) некорректно обрабатывает множественные ГТД, нам необходимо рассмотреть внутреннее устройство документов отгрузки (например, Реализация товаров и услуг) в 1С.

В ERP-решениях 1С коммерческий учет отделен от партионного и финансового:

  1. Табличная часть Товары отвечает за коммерческие условия сделки. Здесь хранятся номенклатура, заказанное количество, цена, ставка НДС и итоговая сумма. В этой таблице строка товара всегда одна, независимо от того, из каких партий он будет списан.
  2. Табличная часть ВидыЗапасов формируется системой автоматически при проведении документа. Именно она отвечает за партионный учет, определение организации-владельца, налогообложение и, что самое главное, за хранение номеров ГТД и РНПТ (для прослеживаемых товаров).

Связь между этими табличными частями осуществляется по уникальному идентификатору — реквизиту КлючСвязи. Если мы продаем 10 штук одного товара, но 6 из них списываются по одной ГТД, а 4 — по другой, то в табличной части Товары у нас останется одна строка, а в табличной части ВидыЗапасов появятся две строки с одинаковым ключом связи, но разными номерами ГТД.

Стандартный конфигурационный XML-файл выгрузки СБИС по умолчанию обращается к табличной части Товары и пытается сопоставить её со строкой из ТЧ ВидыЗапасов. Из-за связи «один ко многим» сопоставление возвращает только первую попавшуюся строку видов запасов. Как результат — в xml-файл электронного документа записывается только один номер ГТД, а покупатель получает некорректный входящий документ.

Если же мы просто перенаправим источник данных выгрузки СБИС исключительно на табличную часть ВидыЗапасов, мы решим проблему с ГТД, но полностью потеряем услуги. Поскольку услуги не являются материальным запасом, они не отражаются в партионном учете и физически отсутствуют в ТЧ ВидыЗапасов.

Ниже мы подробно разберем, как обойти это ограничение.

Решение 1. Разделение источников данных и фильтрация через внешнюю обработку

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

Для этого выполним следующие шаги:

  1. Найдем рабочий конфигурационный файл выгрузки СБИС для вашего документа. Обычно это файл с именем вида ВО82УТ11_РеализацияТоваровУслуг.sbis3.xml.
  2. Создадим локальную копию этого файла в каталоге обмена СБИС (например, C:\Sbis1C\) и переименуем его в ВО82УТ11_РеализацияТоваровУслуг.xml (убрав часть расширения .sbis3). Таким образом, модуль интеграции начнет использовать наш локальный файл вместо стандартного серверного шаблона.
  3. В структуре XML-файла перенастроим выгрузку товаров на табличную часть ВидыЗапасов. При этом обязательно передаем в параметры строку связи и аналитику номенклатуры (АналитикаНоменклатуры).
  4. Выгрузку услуг настроим из стандартной табличной части Товары.

После такой настройки возникнет дублирование: товары будут выгружаться и из видов запасов (с ГТД), и из таблицы товаров (без ГТД, но с ценами). Чтобы отсечь дубли, задействуем механизм внешних функций СБИС через обработку ВнешниеФункции_Клиент.epf.

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


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

Этот несложный алгоритм позволяет полностью решить проблему: услуги выгружаются корректно, а товары берутся из видов запасов, дробясь на несколько строк в соответствии с реальными номерами ГТД.

Решение 2. Использование SQL-подобного запроса в XML-файле СБИС (Альтернативный и более элегантный способ)

Рассмотрим более производительный вариант, который не требует модификации внешних обработок 1С и позволяет держать всю логику внутри одного конфигурационного XML-файла СБИС. Модуль интеграции СБИС поддерживает выполнение произвольных запросов к базе данных 1С с помощью тега <мЗапрос>.

Мы можем написать один запрос, который самостоятельно соединит таблицы Товары и ВидыЗапасов, рассчитает пропорционально цены/суммы для каждой партии и объединит полученный результат с услугами из таблицы Товары с помощью конструкции ОБЪЕДИНИТЬ ВСЕ.

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


ВЫБРАТЬ
    РеализацияТовары.НомерСтроки КАК НомерСтроки,
    РеализацияТовары.Номенклатура КАК Номенклатура,
    РеализацияТовары.Количество КАК Количество,
    РеализацияТовары.Цена КАК Цена,
    РеализацияТовары.Сумма КАК Сумма,
    РеализацияТовары.СтавкаНДС КАК СтавкаНДС,
    РеализацияТовары.СуммаНДС КАК СуммаНДС,
    ЗНАЧЕНИЕ(Справочник.НомераГТД.ПустаяСсылка) КАК НомерГТД,
    ИСТИНА КАК ЭтоУслуга
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ГДЕ
    РеализацияТовары.Ссылка = &Ссылка
    И (РеализацияТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
        ИЛИ РеализацияТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа))

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    РеализацияТовары.НомерСтроки КАК НомерСтроки,
    РеализацияТовары.Номенклатура КАК Номенклатура,
    РеализацияВидыЗапасов.Количество КАК Количество,
    РеализацияТовары.Цена КАК Цена,
    // Вычисляем сумму пропорционально количеству из видов запасов
    РеализацияВидыЗапасов.Количество * РеализацияТовары.Цена КАК Сумма,
    РеализацияТовары.СтавкаНДС КАК СтавкаНДС,
    // Аналогично рассчитываем НДС для выделенной строки ГТД
    (РеализацияВидыЗапасов.Количество * РеализацияТовары.Цена) * (ВЫБОР 
        КОГДА РеализацияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20) ТОГДА 0.20
        КОГДА РеализацияТовары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10) ТОГДА 0.10
        ИНАЧЕ 0 
    Конец) КАК СуммаНДС,
    РеализацияВидыЗапасов.НомерГТД КАК НомерГТД,
    ЛОЖЬ КАК ЭтоУслуга
ИЗ
    Документ.РеализацияТоваровУслуг.ВидыЗапасов КАК РеализацияВидыЗапасов
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
        ПО РеализацияВидыЗапасов.КлючСвязи = РеализацияТовары.КлючСвязи
        И РеализацияВидыЗапасов.Ссылка = РеализацияТовары.Ссылка
ГДЕ
    РеализацияВидыЗапасов.Ссылка = &Ссылка

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

Этот запрос прописывается в конфигурационном файле СБИС внутри секции описания источника данных:


<мЗапрос Имя="ЗапросПоТоварамИУслугам">
    <Текст>
        // Здесь размещается текст нашего запроса к 1С
    </Текст>
</мЗапрос>

Такой подход считается наиболее профессиональным, поскольку он не зависит от обновлений внешних обработок СБИС и работает значительно быстрее за счет выполнения всей математики и фильтрации на стороне СУБД (MS SQL Server / PostgreSQL) средствами платформы 1С.

Важное замечание о прослеживаемости товаров (РНПТ)

Обратим внимание, что описанная выше проблема актуальна не только для классических номеров ГТД импортных товаров, но и для номеров РНПТ (прослеживаемых товаров, например, мониторов, холодильников, бытовой техники). Учет прослеживаемости в 1С реализован по точно такой же схеме: номера РНПТ хранятся в ТЧ ВидыЗапасов.

Если ваша компания торгует прослеживаемым импортным товаром, использование одного из предложенных методов настройки конфигурации СБИС является критически важным. В противном случае ФНС не примет отчетность по прослеживаемости из-за незаполненных или утерянных номеров РНПТ в цепочке электронных документов.

← На главную