Как схлопнуть номенклатуру по ставкам НДС при обмене из УТ 10.3 в БП 3.0 через КД 2.1

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

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

В рамках данной статьи мы разберем, как правильно модифицировать правила конвертации объектов в Конвертации данных 2.1, чтобы трансформировать многострочную табличную часть в компактный вид, и проанализируем технические нюансы, связанные с расчетом цен и округлением копеек.

Выбор этапа обработки: Выгрузка или Загрузка?

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

  1. На этапе выгрузки (в базе-источнике): Мы перехватываем данные документа перед тем, как они попадут в XML-файл. Это наиболее оптимальный вариант, так как объем передаваемых данных сокращается, что ускоряет процесс обмена.
  2. На этапе загрузки (в базе-приемнике): Данные сначала загружаются «как есть», а затем программно сворачиваются в обработчике ПослеЗагрузки. Этот метод может быть медленнее, но он полезен, если логика схлопывания зависит от настроек базы-приемника.

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

Алгоритм реализации через таблицу значений

Рассмотрим пошагово, как реализовать механизм свертки табличной части Товары. Основная идея заключается в использовании временной таблицы значений и метода Свернуть(). Весь код мы будем писать в Правилах Конвертации Свойств (ПКС) для табличной части или в обработчике ПередВыгрузкой ПКО документа.

Разберем пример кода для обработчика ПередВыгрузкой табличной части:


// 1. Создаем таблицу значений для подготовки данных
ТЗ_Товары = Новый ТаблицаЗначений;
ТЗ_Товары.Колонки.Добавить("Номенклатура");
ТЗ_Товары.Колонки.Добавить("СтавкаНДС");
ТЗ_Товары.Колонки.Добавить("Количество");
ТЗ_Товары.Колонки.Добавить("Сумма");
ТЗ_Товары.Колонки.Добавить("СуммаНДС");

// 2. Заполняем ТЗ данными из источника, подменяя номенклатуру
Для Каждого СтрокаТЧ Из Источник.Товары Цикл
    НоваяСтрока = ТЗ_Товары.Добавить();
    
    // Определяем, какую обобщенную номенклатуру подставить
    Если СтрокаТЧ.СтавкаНДС = Перечисления.СтавкиНДС.НДС0 ИЛИ СтрокаТЧ.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
        НоваяСтрока.Номенклатура = Параметры.НоменклатураБезНДС; 
    Иначе
        НоваяСтрока.Номенклатура = Параметры.НоменклатураСНДС;
    КонецЕсли;
    
    НоваяСтрока.СтавкаНДС = СтрокаТЧ.СтавкаНДС;
    НоваяСтрока.Количество = СтрокаТЧ.Количество;
    НоваяСтрока.Сумма = СтрокаТЧ.Сумма;
    НоваяСтрока.СуммаНДС = СтрокаТЧ.СуммаНДС;
КонецЦикла;

// 3. Сворачиваем таблицу по номенклатуре и ставке НДС
ТЗ_Товары.Свернуть("Номенклатура, СтавкаНДС", "Количество, Сумма, СуммаНДС");

// 4. Передаем результат в коллекцию объектов для выгрузки
КоллекцияОбъектов = ТЗ_Товары;

В данном примере мы использовали Параметры для хранения ссылок на обобщенные элементы номенклатуры в приемнике. Это избавляет нас от необходимости жестко прописывать поиск по наименованию в коде.

Проблема «разъезжающихся» копеек и расчет цен

Выясним причину, по которой итоговые суммы могут не сойтись. В 1С:Бухгалтерии документ РеализацияТоваровУслуг жестко завязан на формулу Сумма = Цена * Количество. Когда мы схлопываем несколько строк с разными ценами в одну, понятие «Цена» теряет свой первоначальный смысл, становясь «средней температурой по больнице».

Проанализируем ситуацию: если просто передать сумму и количество, БП 3.0 при записи документа может автоматически пересчитать цену или, наоборот, пересчитать сумму по цене, что приведет к расхождению на копейки из-за округления. Чтобы избежать этого, после свертки таблицы необходимо программно рассчитать цену для каждой строки:


Для Каждого СтрокаТЗ Из ТЗ_Товары Цикл
    Если СтрокаТЗ.Количество <> 0 Тогда
        СтрокаТЗ.Цена = СтрокаТЗ.Сумма / СтрокаТЗ.Количество;
    Иначе
        СтрокаТЗ.Цена = 0;
    КонецЕсли;
КонецЦикла;

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

Особенности сопоставления объектов

Для корректной работы правила ПКО_Номенклатура, нам нужно гарантировать, что система найдет именно те две позиции («Товар С НДС» и «Товар без НДС»), которые мы создали в БП. Рассмотрим несколько вариантов поиска:

Влияние на аналитику и счета учета

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

Поэтому мы рекомендуем усложнить логику свертки, добавив в ключ уникальности не только ставку НДС, но и признак ТипНоменклатуры (Товар или Услуга). Это позволит формировать в БП 3.0 корректные проводки:


// Ключ свертки: Номенклатура + СтавкаНДС + Тип (Товар/Услуга)
ТЗ_Товары.Свернуть("Номенклатура, СтавкаНДС, ТипНоменклатуры", "Количество, Сумма, СуммаНДС");

Резюме

Мы рассмотрели процесс агрегации данных при обмене. Подводя итог, выделим главные правила успеха:

  1. Выполняйте свертку на этапе выгрузки для оптимизации скорости.
  2. Используйте метод Свернуть() для программной манипуляции табличной частью.
  3. Обязательно пересчитывайте цену после свертки, чтобы избежать конфликтов с логикой БП 3.0.
  4. Учитывайте аналитику (счета учета), разделяя хотя бы товары и услуги.
  5. Тщательно проверяйте ставки НДС, так как «Без НДС» и «0%» — это разные значения перечислений в приемнике, которые по-разному отражаются в налоговых регистрах.
← На главную