Как сгруппировать строки номенклатуры при обмене УТ 11 — БП 3 через EnterpriseData и избежать проблем с НДС?

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

При организации обмена данными между конфигурациями «1С:Управление торговлей» (ред. 11) и «1С:Бухгалтерия предприятия» (ред. 3.0) разработчики часто сталкиваются с разной методологией ведения учета. Типичный пример — использование характеристик номенклатуры. В «1С:Управлении торговлей» (УТ) менеджеры ведут детальный учет товаров по размерам, цветам, брендам или артикулам с помощью характеристик. В «1С:Бухгалтерии предприятия» (БП) такой детальный аналитический учет чаще всего не требуется — бухгалтерам важна лишь сама номенклатурная позиция для корректного формирования проводок и налоговой отчетности.

В результате при выгрузке документа РеализацияТоваровУслуг (РТУ) из УТ в БП стандартный обмен переносит каждую строку с разной характеристикой как отдельную строку. На стороне БП характеристики отбрасываются, и бухгалтер видит документ, в котором одна и та же номенклатурная позиция дублируется множество раз с разным количеством. Естественное желание бухгалтерии в такой ситуации — свернуть (сгруппировать) одинаковые строки, чтобы документ выглядел лаконично, а количество суммировалось.

В этой статье мы подробно разберем, почему в типовом обмене нет готовой «галочки» для решения этой задачи, как реализовать свертку программно на разных этапах обмена и с какими серьезными рисками в расчете НДС и себестоимости вы можете столкнуться.

Существует ли штатное средство для свертки ТЧ в типовом обмене?

Начнем с важного факта: в типовом обмене на базе универсального формата EnterpriseData (ED) стандартного переключателя для автоматической свертки табличных частей при исключении характеристик не предусмотрено. Разработчики фирмы «1С» придерживаются концепции строгой идентичности первичных документов в базе-источнике и базе-приемнике. Принцип простой: «что отправили, то и получили».

Поскольку штатного механизма нет, задачу приходится решать путем доработки правил конвертации или написания внешних обработок. Рассмотрим два основных технических подхода к реализации этой задачи.

Решение 1. Программная свертка на стороне УТ (база-отправитель) через КД3

Наиболее изящный способ с технической точки зрения — сгруппировать строки еще на этапе подготовки данных к отправке в базе УТ. В современных версиях УТ 11 обмен работает по технологии EnterpriseData через менеджер обмена. Чтобы не снимать конфигурацию с поддержки, доработку правил обмена рекомендуется выполнять через расширение конфигурации.

Для модификации логики выгрузки документа нам потребуется перехватить обработчик события в модуле менеджера обмена. Наша цель — найти ПКО (правило конвертации объектов) для документа РеализацияТоваровУслуг и переопределить алгоритм заполнения данных XDTO перед их отправкой.

Рассмотрим пример реализации алгоритма в обработчике ПриОтправкеДанных для ПКО выгрузки реализации:


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

Важное примечание к коду: Сворачивать таблицу значений необходимо не только по полю Номенклатура. Обязательно включайте в группировку поля Цена и СтавкаНДС. Если этого не сделать, система попытается сложить строки с разной ценой или разными ставками налога, что приведет к грубейшим ошибкам в расчете суммовых показателей документа.

Решение 2. Свертка на стороне БП (база-приемник) после загрузки

Если вы не хотите вмешиваться в механизмы формирования универсального формата EnterpriseData на стороне УТ, свертку можно произвести уже после того, как документ попал в базу «1С:Бухгалтерия предприятия».

Этот способ можно реализовать двумя путями:

  1. Создать подписку на событие ПередЗаписью для документа РеализацияТоваровУслуг в БП (через расширение) с проверкой, что документ записывается в процессе обмена данными (используя параметр ОбменДанными.Загрузка = Истина).
  2. Использовать внешнюю обработку, которая запускается регламентно или вручную бухгалтером после завершения сеанса синхронизации, находит новые документы и сворачивает их табличные части.

Рассмотрим пример кода для подписки на событие ПередЗаписью в БП 3.0:


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

Этот подход проще в отладке, однако он увеличивает время записи документов непосредственно в момент сеанса синхронизации, так как на каждый документ тратится дополнительное процессорное время.

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

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

1. Проблема «плывущего» НДС при перепроведении

Это самый опасный подводный камень автоматической свертки строк. Дело в округлении копеек при расчете НДС по каждой отдельной строке. Проанализируем конкретную математическую ситуацию.

Допустим, в УТ мы продаем 3 пары обуви разных размеров (каждая строка — отдельный размер/характеристика) по цене 100 рублей 33 копейки за штуку. Ставка НДС составляет 20%.

В базе УТ документ выглядит следующим образом:

Итого по документу в УТ: Общая сумма = 300.99 руб., Общий НДС = 60.21 руб.

При выгрузке мы сворачиваем эти три строки в одну для БП:

На этапе загрузки в БП документ запишется именно с этой суммой НДС (60.21 руб.), так как при обмене автоматический пересчет сумм отключен. Однако проблемы начнутся позже. Допустим, через неделю бухгалтер открывает этот документ в БП, решает изменить какое-то поле (например, склад или договор) и нажимает кнопку «Провести и закрыть». При интерактивном перепроведении и перезаписи документа платформа 1С автоматически выполнит пересчет НДС по строке:

300.99 рублей * 20% / 120% = 50.17 рублей (НДС сверху) или, если НДС в том числе: 300.99 * 20 / 120 = 50.17.

Если же расчет идет от чистой стоимости 300.99 * 20% = 60.20 руб.

В результате пересчета общая сумма НДС в БП внезапно уменьшается на 1 копейку (станет 60.20 руб. вместо исходных 60.21 руб.).

Последствия: На выходе мы получаем расхождение сумм НДС между книгой продаж в УТ и книгой продаж в БП. При сдаче декларации по НДС автоматизированная система контроля ФНС (АСК НДС) мгновенно обнаружит эти копеечные расхождения с книгой покупок вашего контрагента и пришлет требование о представлении пояснений. Бухгалтерии придется вручную выискивать эти копейки по сотням документов.

2. Проблемы с себестоимостью и партионным учетом (ФИФО)

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

Резюме и рекомендации

Технически свертка строк номенклатуры при обмене УТ-БП реализуется достаточно просто через расширение и доработку обработчиков в менеджере обмена или подписок на события. Однако перед написанием кода выполните следующие действия:

  1. Обязательно донесите до главного бухгалтера информацию о неизбежности «плывущих копеек» по НДС при случайном или намеренном перепроведении документов в БП.
  2. Если бухгалтерия настаивает на свертке, зафиксируйте их согласие. В кодовой части свертки (при отправке или загрузке) стремитесь переносить суммы НДС «как есть», жестко фиксируя их значения без автоматического пересчета, и проинструктируйте пользователей не пересчитывать табличные части документов вручную после загрузки.
  3. В качестве альтернативы предложите бухгалтерам использовать группировку данных непосредственно в печатных формах или отчетах на стороне БП, оставив физическую структуру документа детальной (развернутой по строкам), чтобы полностью исключить налоговые риски.
← На главную