При организации обмена данными между управленческими базами (такими как 1С:Комплексная автоматизация 2.0, ERP или УТ 11) и бухгалтерскими системами часто возникает задача «схлопывания» или свертки номенклатуры. Это необходимо, когда в бухгалтерии не требуется детальный учет по каждой позиции, а достаточно видеть общие суммы реализации или поступления в разрезе ставок НДС (например, «Товар 20%» и «Товар без НДС»). Рассмотрим, как технически реализовать этот механизм, какие методы использовать и с какими архитектурными сложностями можно столкнуться в современных конфигурациях.
В современных версиях 1С:КА 2.0 обмен чаще всего строится на базе технологии EnterpriseData (синхронизация через универсальный формат). В этом случае правка правил в XML-файлах КД 2.0 уходит на второй план, а основным инструментом становится программный код в общем модуле менеджера обмена.
Разберем по шагам, как внести изменения:
МенеджерОбменаЧерезУниверсальныйФормат (или аналогичный, отвечающий за вашу версию формата).ПКО_Документ_РеализацияТоваровУслуг_Отправка_ПриОбработкеДанных.Важно: При использовании этого метода мы не меняем сам документ в базе-источнике, а лишь модифицируем «пакет данных», который улетает в базу-приемник. Это сохраняет целостность учета в исходной КА 2.0.
Если обмен настраивается через Конвертацию данных 2.0 или используется прямой программный пересчет ТЧ, наиболее эффективным способом будет использование метода Свернуть() для объекта ТаблицаЗначений. Рассмотрим подробный пример кода, который можно разместить в обработчике «При выгрузке» или «Перед выгрузкой» табличной части.
Проанализируем алгоритм работы со строками документа:
// 1. Выгружаем табличную часть в таблицу значений для обработки
ТЗ = Объект.Товары.Выгрузить();
// 2. Группируем данные по ставке НДС и суммируем количественные/финансовые показатели
Попытка
ТЗ.Свернуть("СтавкаНДС", "Сумма, Количество, СуммаНДС, Себестоимость");
Исключение
// Если колонка Себестоимость отсутствует в данной версии документа
ТЗ.Свернуть("СтавкаНДС", "Сумма, Количество, СуммаНДС");
КонецПопытки;
// 3. Очищаем исходную ТЧ и загружаем свернутые данные
Объект.Товары.Загрузить(ТЗ);
// 4. Проходим по свернутым строкам и подменяем номенклатуру на обобщенную
Для Каждого СтрокаТовары Из Объект.Товары Цикл
// Определяем параметры для поиска/создания обобщенного элемента
Если СтрокаТовары.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
СтавкаНДССтрокой = "20%";
ВидСтавкиНДС = Перечисления.ВидыСтавокНДС.Общая;
ИначеЕсли СтрокаТовары.СтавкаНДС = Перечисления.СтавкиНДС.НДС10 Тогда
СтавкаНДССтрокой = "10%";
ВидСтавкиНДС = Перечисления.ВидыСтавокНДС.Пониженная;
Иначе
СтавкаНДССтрокой = "Без НДС";
ВидСтавкиНДС = Перечисления.ВидыСтавокНДС.БезНДС;
КонецЕсли;
Наименование = "Товар (" + СтавкаНДССтрокой + ")";
// Поиск существующей номенклатуры-заменителя
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Наименование);
// Если позиции нет, создаем ее программно (актуально для первичной настройки)
Если Номенклатура.Пустая() Тогда
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = Наименование;
НовыйЭлемент.ВидСтавкиНДС = ВидСтавкиНДС;
НовыйЭлемент.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товары");
НовыйЭлемент.Записать();
Номенклатура = НовыйЭлемент.Ссылка;
КонецЕсли;
// Устанавливаем ссылку на обобщенный товар
СтрокаТовары.Номенклатура = Номенклатура;
// Пересчитываем цену, так как она могла измениться после свертки
Если СтрокаТовары.Количество <> 0 Тогда
СтрокаТовары.Цена = СтрокаТовары.Сумма / СтрокаТовары.Количество;
Иначе
СтрокаТовары.Цена = 0;
КонецЕсли;
КонецЦикла;
Этот подход позволяет гарантированно получить в базе-приемнике документ всего с парой строк, соответствующих налоговым ставкам.
В некоторых случаях, особенно при больших объемах данных в документе, эффективнее использовать механизм запросов для формирования итоговой таблицы. Это позволяет избежать лишних итераций по строкам и сразу получить готовую структуру для записи в объект.
Рассмотрим пример запроса, который выбирает сгруппированные данные из ТЧ документа:
ВЫБРАТЬ
СУММА(ТЧ.Количество) КАК Количество,
ТЧ.СтавкаНДС КАК СтавкаНДС,
СУММА(ТЧ.Сумма) КАК Сумма,
СУММА(ТЧ.СуммаНДС) КАК СуммаНДС,
ТЧ.ЕдиницаИзмерения КАК ЕдиницаИзмерения
ПОМЕСТИТЬ втДанные
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК ТЧ
ГДЕ
ТЧ.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
ТЧ.СтавкаНДС,
ТЧ.ЕдиницаИзмерения
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
вт.Количество,
вт.СтавкаНДС,
вт.Сумма,
вт.СуммаНДС,
вт.Сумма / вт.Количество КАК Цена,
ВЫБОР
КОГДА вт.СтавкаНДС.Наименование ПОДОБНО "%БезНДС%" ТОГДА &НомБезНДС
ИНАЧЕ &НомСНДС
КОНЕЦ КАК Номенклатура
ИЗ
втДанные КАК вт
Использование запроса удобно тем, что мы можем сразу передать параметры (ссылки на предопределенную номенклатуру) и получить таблицу, готовую к методу Загрузить().
Проанализируем ситуацию с точки зрения архитектуры Комплексной автоматизации 2.0. В отличие от старых конфигураций, таких как БП 2.0 или УТ 10.3, КА 2.0 базируется на сложных механизмах распределения затрат и партионного учета.
Проблема себестоимости: Если вы выполняете свертку номенклатуры прямо в документе базы-источника (КА), система потеряет аналитическую связь с реальными остатками на складах. Партионный учет «схлопнется», и расчет себестоимости по одной карточке «Обобщенный товар» приведет к неверным финансовым результатам. Система будет пытаться списать среднюю себестоимость по всем товарам сразу, что недопустимо для большинства предприятий.
Рекомендация: Свертку номенклатуры следует выполнять только в процессе выгрузки (в менеджере обмена) или на стороне приемника (БП). В самой базе КА 2.0 документ должен оставаться детальным, чтобы сохранялась корректность регистров накопления «Выручка и себестоимость продаж» и «Запасы на складах».
Выясним причину возможных расхождений в копейках. При суммировании 10 строк, в каждой из которых НДС был рассчитан и округлен отдельно, итоговая сумма НДС может отличаться от суммы НДС, рассчитанной «в лоб» от итоговой суммы свернутой строки.
Как правильно: При реализации алгоритма свертки (как в Методе 2) никогда не рассчитывайте НДС заново функцией Сумма * Ставка / 100. Всегда используйте СУММА(СуммаНДС) из исходных строк. Только накопление уже рассчитанных сумм гарантирует, что итоговый НДС документа в бухгалтерии сойдется с управленческой базой «копейка в копейку».
Для реализации «схлопывания» в 1С:КА 2.0 мы рекомендуем:
EnterpriseData, не затрагивая типовой функционал.ТЗ.Свернуть() для обработки данных «на лету» в момент обмена.Следуя этим правилам, мы получим чистую бухгалтерскую базу без лишнего справочного «мусора», сохранив при этом точность управленческого учета в основной системе.