В практике интеграции систем на платформе 1С часто возникает задача упрощения данных при переносе из торговой базы в бухгалтерскую. Одной из таких задач является «схлопывание» (агрегация) номенклатуры в документах реализации или поступления. Например, когда в базе 1С:Управление торговлей 10.3 (УТ) менеджеры ведут детальный учет по каждой позиции, а в 1С:Бухгалтерия предприятия 3.0 (БП) бухгалтерии достаточно видеть общие суммы в разрезе ставок НДС (например, товары «С НДС» и «Без НДС»).
В рамках данной статьи мы разберем, как правильно модифицировать правила конвертации объектов в Конвертации данных 2.1, чтобы трансформировать многострочную табличную часть в компактный вид, и проанализируем технические нюансы, связанные с расчетом цен и округлением копеек.
Первым делом проанализируем, в какой момент лучше производить трансформацию данных. Существует два подхода:
ПослеЗагрузки. Этот метод может быть медленнее, но он полезен, если логика схлопывания зависит от настроек базы-приемника.Для нашей задачи мы выберем этап выгрузки, так как это позволит минимизировать размер файла обмена и нагрузку на обе системы.
Рассмотрим пошагово, как реализовать механизм свертки табличной части Товары. Основная идея заключается в использовании временной таблицы значений и метода Свернуть(). Весь код мы будем писать в Правилах Конвертации Свойств (ПКС) для табличной части или в обработчике ПередВыгрузкой ПКО документа.
Разберем пример кода для обработчика ПередВыгрузкой табличной части:
// 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 корректные проводки:
// Ключ свертки: Номенклатура + СтавкаНДС + Тип (Товар/Услуга)
ТЗ_Товары.Свернуть("Номенклатура, СтавкаНДС, ТипНоменклатуры", "Количество, Сумма, СуммаНДС");
Мы рассмотрели процесс агрегации данных при обмене. Подводя итог, выделим главные правила успеха:
Свернуть() для программной манипуляции табличной частью.