При организации обмена данными между конфигурациями «1С:Управление торговлей» (ред. 11) и «1С:Бухгалтерия предприятия» (ред. 3.0) разработчики часто сталкиваются с разной методологией ведения учета. Типичный пример — использование характеристик номенклатуры. В «1С:Управлении торговлей» (УТ) менеджеры ведут детальный учет товаров по размерам, цветам, брендам или артикулам с помощью характеристик. В «1С:Бухгалтерии предприятия» (БП) такой детальный аналитический учет чаще всего не требуется — бухгалтерам важна лишь сама номенклатурная позиция для корректного формирования проводок и налоговой отчетности.
В результате при выгрузке документа РеализацияТоваровУслуг (РТУ) из УТ в БП стандартный обмен переносит каждую строку с разной характеристикой как отдельную строку. На стороне БП характеристики отбрасываются, и бухгалтер видит документ, в котором одна и та же номенклатурная позиция дублируется множество раз с разным количеством. Естественное желание бухгалтерии в такой ситуации — свернуть (сгруппировать) одинаковые строки, чтобы документ выглядел лаконично, а количество суммировалось.
В этой статье мы подробно разберем, почему в типовом обмене нет готовой «галочки» для решения этой задачи, как реализовать свертку программно на разных этапах обмена и с какими серьезными рисками в расчете НДС и себестоимости вы можете столкнуться.
Начнем с важного факта: в типовом обмене на базе универсального формата EnterpriseData (ED) стандартного переключателя для автоматической свертки табличных частей при исключении характеристик не предусмотрено. Разработчики фирмы «1С» придерживаются концепции строгой идентичности первичных документов в базе-источнике и базе-приемнике. Принцип простой: «что отправили, то и получили».
Поскольку штатного механизма нет, задачу приходится решать путем доработки правил конвертации или написания внешних обработок. Рассмотрим два основных технических подхода к реализации этой задачи.
Наиболее изящный способ с технической точки зрения — сгруппировать строки еще на этапе подготовки данных к отправке в базе УТ. В современных версиях УТ 11 обмен работает по технологии EnterpriseData через менеджер обмена. Чтобы не снимать конфигурацию с поддержки, доработку правил обмена рекомендуется выполнять через расширение конфигурации.
Для модификации логики выгрузки документа нам потребуется перехватить обработчик события в модуле менеджера обмена. Наша цель — найти ПКО (правило конвертации объектов) для документа РеализацияТоваровУслуг и переопределить алгоритм заполнения данных XDTO перед их отправкой.
Рассмотрим пример реализации алгоритма в обработчике ПриОтправкеДанных для ПКО выгрузки реализации:
Процедура ПередЗаписьюПолученныхДанных_РеализацияТоваровУслуг(ДанныеXDTO, ПолученныеДанные, ДокументОбъект, КомпонентОбмена) Экспорт
// Проверим наличие табличной части "Товары" в отправляемых данных XDTO
Если ДанныеXDTO.Свойства().Получить("Товары") = Неопределено Тогда
Возврат;
КонецЕсли;
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Номенклатура");
ТаблицаТоваров.Колонки.Добавить("СтавкаНДС");
ТаблицаТоваров.Колонки.Добавить("Цена");
ТаблицаТоваров.Колонки.Добавить("Количество");
ТаблицаТоваров.Колонки.Добавить("Сумма");
ТаблицаТоваров.Колонки.Добавить("СуммаНДС");
ТаблицаТоваров.Колонки.Добавить("СуммаСНДС");
// Заполняем временную таблицу значений из структуры XDTO
Для Каждого СтрокаТовара Из ДанныеXDTO.Товары Цикл
НоваяСтрока = ТаблицаТоваров.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТовара);
КонецЦикла;
// Сворачиваем таблицу по ключевым полям: номенклатура, ставка НДС и цена.
// Ресурсы (количество и суммы) складываем.
ТаблицаТоваров.Свернуть("Номенклатура, СтавкаНДС, Цена", "Количество, Сумма, СуммаНДС, СуммаСНДС");
// Очищаем старую коллекцию в XDTO и заполняем ее свернутыми данными
ДанныеXDTO.Товары.Очистить();
Для Каждого СтрокаТаблицы Из ТаблицаТоваров Цикл
НоваяСтрокаXDTO = ДанныеXDTO.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаXDTO, СтрокаТаблицы);
КонецЦикла;
КонецПроцедуры
Важное примечание к коду: Сворачивать таблицу значений необходимо не только по полю Номенклатура. Обязательно включайте в группировку поля Цена и СтавкаНДС. Если этого не сделать, система попытается сложить строки с разной ценой или разными ставками налога, что приведет к грубейшим ошибкам в расчете суммовых показателей документа.
Если вы не хотите вмешиваться в механизмы формирования универсального формата EnterpriseData на стороне УТ, свертку можно произвести уже после того, как документ попал в базу «1С:Бухгалтерия предприятия».
Этот способ можно реализовать двумя путями:
ПередЗаписью для документа РеализацияТоваровУслуг в БП (через расширение) с проверкой, что документ записывается в процессе обмена данными (используя параметр ОбменДанными.Загрузка = Истина).Рассмотрим пример кода для подписки на событие ПередЗаписью в БП 3.0:
Процедура СвернутьТабличнуюЧастьПриЗагрузкеПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Проверяем, что запись происходит в режиме загрузки данных из другой базы
Если Не Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Работаем только с документами Реализация товаров и услуг
Если ТипЗнч(Источник) <> Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
Возврат;
КонецЕсли;
ТабличнаяЧасть = Источник.Товары;
Если ТабличнаяЧасть.Количество() > 0 Тогда
// Сворачиваем табличную часть по ключевым реквизитам
ТабличнаяЧасть.Свернуть(
"Номенклатура, Содержание, СтавкаНДС, Цена, СчетУчета, СчетУчетаНДС",
"Количество, Сумма, СуммаНДС, Всего"
);
КонецЕсли;
КонецПроцедуры
Этот подход проще в отладке, однако он увеличивает время записи документов непосредственно в момент сеанса синхронизации, так как на каждый документ тратится дополнительное процессорное время.
Несмотря на кажущуюся простоту задачи, перед внедрением любого из описанных решений программист обязан предупредить главного бухгалтера о рисках возникновения расхождений в учете. Рассмотрим две ключевые проблемы, с которыми вы гарантированно столкнетесь.
Это самый опасный подводный камень автоматической свертки строк. Дело в округлении копеек при расчете НДС по каждой отдельной строке. Проанализируем конкретную математическую ситуацию.
Допустим, в УТ мы продаем 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 руб.).
Последствия: На выходе мы получаем расхождение сумм НДС между книгой продаж в УТ и книгой продаж в БП. При сдаче декларации по НДС автоматизированная система контроля ФНС (АСК НДС) мгновенно обнаружит эти копеечные расхождения с книгой покупок вашего контрагента и пришлет требование о представлении пояснений. Бухгалтерии придется вручную выискивать эти копейки по сотням документов.
Если в «1С:Управлении торговлей» себестоимость товаров рассчитывается детально (с учетом партий под конкретные характеристики), то в БП учет ведется по усредненной номенклатуре. При свертке строк в одну БП спишет весь объем товара по своей партионной цепочке (например, по ФИФО), основываясь на одной объединенной строке. Это неизбежно приведет к тому, что финансовый результат (себестоимость продаж и прибыль) в отчете о финансовых результатах в БП начнет расходиться с управленческими отчетами УТ.
Технически свертка строк номенклатуры при обмене УТ-БП реализуется достаточно просто через расширение и доработку обработчиков в менеджере обмена или подписок на события. Однако перед написанием кода выполните следующие действия: