Почему в УТ 11 в отчет Ведомость расчетов с поставщиками попадает сумма без НДС и как это исправить

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

При ведении учета в конфигурации 1С:Управление торговлей (в частности, редакции 11) пользователи и аналитики иногда сталкиваются с неприятной ситуацией: итоговая сумма проведенного документа Поступление товаров и услуг составляет, например, 118 рублей (с учетом НДС), однако в отчете Ведомость расчетов с поставщиками задолженность отражается только на сумму 100 рублей. В результате регистры взаиморасчетов искажаются, долг перед поставщиком занижается на сумму налога, а сверка взаиморасчетов показывает необъяснимое сальдо.

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

В чем кроется корень проблемы

Рассмотрим, как устроено проведение документов поступления по взаиморасчетам. В типовой конфигурации 1С:Управление торговлей 11 движения по регистру накопления Расчеты с поставщиками строятся не путем простого сложения строк табличной части в момент проведения, а на основании специализированных реквизитов взаиморасчетов, таких как СуммаВзаиморасчетов, а также сумм в валюте управленческого и регламентированного учета.

Проанализируем цепочку факторов, которые приводят к искажению данных:

  1. Раздельное хранение сумм и НДС. Если в документе поступления налог рассчитывается «сверху» (снят признак ЦенаВключаетНДС), то в табличной части Товары колонка Сумма содержит чистую стоимость товаров без учета налога, а налог фиксируется отдельно в колонке СуммаНДС. Общая задолженность перед контрагентом при этом должна равняться сумме двух этих величин.
  2. Программная загрузка через внешние сервисы. Ошибка чаще всего проявляется, когда документы создаются не вручную пользователем, а загружаются автоматически через внешние модули интеграции (например, сервисы ЭДО, Контур, Диадок или самописные обмены). Внешняя обработка напрямую создает ДокументОбъект и заполняет реквизит СуммаВзаиморасчетов значением из поля Сумма входящего файла, забывая прибавить выделенный НДС.
  3. Обход логики управляемых форм. В типовых конфигурациях пересчет итогов и сумм взаиморасчетов исторически завязан на клиентские обработчики событий формы документа (при изменении количества, цены, ставки налога или вида цены). При фоновой загрузке через COM-соединение или внешние модули форма документа не открывается. Служебные процедуры пересчета не вызываются, и документ записывается с некорректно заполненными служебными реквизитами.

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

Способ 1. Доработка модуля загрузки из сервиса ЭДО

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

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


// Перед вызовом метода Записать() у объекта ДокументОбъект
// проверяем корректность заполнения суммы взаиморасчетов
Если Не ДокументОбъект.ЦенаВключаетНДС Тогда
    СуммаБезНДС = ДокументОбъект.Товары.Итог("Сумма");
    СуммаНДС = ДокументОбъект.Товары.Итог("СуммаНДС");
    ДокументОбъект.СуммаВзаиморасчетов = СуммаБезНДС + СуммаНДС;
Иначе
    ДокументОбъект.СуммаВзаиморасчетов = ДокументОбъект.Товары.Итог("Сумма");
КонецЕсли;

ДокументОбъект.СуммаДокумента = ДокументОбъект.СуммаВзаиморасчетов;

Если в модуле интеграции доступны типовые экспортные процедуры пересчета конфигурации (например, процедуры общего модуля взаиморасчетов), предпочтительно вызывать именно их, чтобы корректно заполнялись не только суммы взаиморасчетов, но и эквиваленты в валютах учета при мультивалютных расчетах.

Способ 2. Контроль сумм через подписку на событие

Бывают ситуации, когда модуль интеграции поставляется поставщиком решения в закрытом виде или регулярно обновляется, из-за чего вносить в него правки нежелательно. В таком случае разберем универсальный вариант: использование подписки на событие в основной конфигурации или в расширении.

Создадим подписку на событие ПередЗаписью для документа ПоступлениеТоваровУслуг:


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

Такой подход гарантирует, что даже при некорректном программном заполнении реквизит взаиморасчетов будет актуализирован непосредственно перед формированием движений по регистрам.

Способ 3. Исправление уже проведенных документов в базе

Важно помнить: обычное групповое перепроведение документов или использование обработки «Групповое изменение реквизитов» не решит проблему с уже накопленными ошибками. Перепроведение просто возьмет ранее записанные ошибочные значения реквизитов и повторно сформирует по ним движения.

Для исправления существующего пула документов создадим внешнюю обработку или разовый алгоритм. Разберем его по шагам:

  1. Выбираем запросом все документы поступления за проблемный период, у которых реквизит СуммаВзаиморасчетов не равен расчетной сумме документа с учетом НДС.
  2. Для каждого найденного документа получаем объект с помощью ПолучитьОбъект().
  3. Вычисляем правильную сумму взаиморасчетов (сумма без НДС + сумма НДС) и перезаписываем реквизит.
  4. Записываем документ в режиме проведения: ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение).

После выполнения данной процедуры движения по регистру Расчеты с поставщиками переформируются, и в отчете Ведомость расчетов с поставщиками суммы встанут с учетом налога, восстановив реальную картину взаиморасчетов предприятия.

← На главную