Как решить проблему расхождения НДС на копейки в счетах-фактурах и ТОРГ-12 в 1С?

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

Каждый практикующий специалист 1С и бухгалтер рано или поздно сталкивается с так называемой «проблемой копеек». Суть ее заключается в том, что при оформлении крупных отгрузок с большим количеством номенклатурных позиций общая сумма НДС, рассчитанная построчно (путем сложения округленных значений налога по каждой строке), не совпадает на одну или несколько копеек с суммой НДС, исчисленной от общего итога документа. Ситуация усугубляется, когда расчеты ведутся в условных единицах или иностранной валюте, где рублевый эквивалент рассчитывается по курсу ЦБ РФ.

Налоговые органы на местах при проверках и сверках через автоматизированную систему контроля деклараций могут предъявлять необоснованные требования, отказывая покупателям в вычете, если НДС «рвется» хотя бы на копейку. Кроме того, жесткие алгоритмы ERP-систем крупных контрагентов часто блокируют автоматическое проведение документов, если выявляется малейшее расхождение. Давайте подробно разберем, почему возникает эта проблема, как к ней относится законодательство и как решить ее техническими средствами в среде 1С.

Выясним причину: почему возникают расхождения в копейках?

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

  1. Различные алгоритмы в печатных формах 1С: В типовых конфигурациях прошлых поколений (например, в Управление торговлей 10.3 или Бухгалтерия предприятия 2.0) разработчики реализовывали расчет сумм для Счета-фактуры и товарной накладной ТОРГ-12 в разных модулях печати. Из-за этого алгоритмы распределения копеек и округлений могли отличаться. ТОРГ-12 могла сформироваться с одной суммой налога, а Счет-фактура — с другой.
  2. Расчеты в иностранной валюте и условных единицах (у.е.): При пересчете валютной стоимости по курсу на дату отгрузки программа вынуждена округлять каждую строчку. Официальная методология разработчиков 1С, опирающаяся на пункт 3 статьи 153 Налогового кодекса РФ, предполагает следующий порядок:
    • Итоговая сумма документа в валюте пересчитывается в рубли по установленному курсу.
    • Полученная общая рублевая сумма распределяется между строками пропорционально их валютной стоимости.
    • Сумма НДС в рублях определяется отдельно по каждой строке путем умножения полученной рублевой стоимости строки на ставку налога.
    В результате такого пропорционального распределения одинаковые позиции с одинаковой ценой в у.е. в разных строках документа могут получить разные рублевые суммы (разница в копейку), что вызывает логичные вопросы со стороны бухгалтеров и контрагентов.

Что говорит законодательство о построчном расчете НДС?

Рассмотрим правовую сторону вопроса. Согласно пункту 2 статьи 168 НК РФ, сумма НДС, предъявляемая покупателю, должна исчисляться по каждому виду товаров (работ, услуг) как соответствующая налоговой ставке процентная доля цены. Таким образом, расчет налога построчно по каждой позиции является единственно верным и законным методом. Итоговая сумма НДС в документе должна получаться исключительно путем сложения округленных значений НДС из строк.

Расчет НДС «от общего итога» всего документа законодательством не предусмотрен. Следовательно, если итоговый НДС по строкам отличается на несколько копеек от расчетного НДС, исчисленного от общей стоимости документа, — это не является ошибкой. Более того, Минфин РФ неоднократно подтверждал в своих разъяснениях, что незначительные технические погрешности округления не могут служить основанием для отказа покупателю в принятии НДС к вычету, так как они не мешают налоговым органам идентифицировать продавца, покупателя, наименование товара, его стоимость и ставку налога (абз. 2 п. 2 ст. 169 НК РФ).

Однако на практике бороться с требованиями инспекторов или автоматическим контролем крупных клиентов бывает крайне сложно. Проще доработать систему учета так, чтобы документ удовлетворял жестким требованиям «копейка в копейку».

Способы решения проблемы

Выделим три основных подхода к устранению расхождений:

Рассмотрим подробнее реализацию программного метода на примере конфигурации 1С:Управление торговлей 10.3.

Реализация алгоритма автоматической подгонки копеек НДС

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

Этот алгоритм будет автоматически срабатывать, когда в документе (например, РеализацияТоваровУслуг, ЗаказПокупателя или СчетНаОплатуПокупателю) снят флаг «Сумма включает НДС». Программа будет искусственно подгонять базовую сумму строки под такое значение, которое при умножении на ставку НДС (18% или 20%) дает строго округленную сумму налога, не вызывающую расхождений с итогом.

Внедрите следующий код 1С в указанную процедуру общего модуля:


Процедура РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ДокументОбъект, СпособРасчета = Неопределено) Экспорт
    ИмяТабличнойЧасти = ОбщегоНазначения.ПолучитьИмяТабличнойЧастиПоСсылкеНаСтроку(СтрокаТабличнойЧасти);
    МетаданныеДокумента = ДокументОбъект.Метаданные;
    Сумма = СтрокаТабличнойЧасти.Цена * СтрокаТабличнойЧасти.Количество;

    // Начало изменений: Корректировка округления для точного совпадения копеек НДС
    Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РеализацияТоваровУслуг") 
        Или ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЗаказПокупателя") 
        Или ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.СчетНаОплатуПокупателю") Тогда
        
        Если ДокументОбъект.УчитыватьНДС И НЕ ДокументОбъект.СуммаВключаетНДС Тогда
            
            // Обработка для ставки НДС 18%
            Если СтрокаТабличнойЧасти.СтавкаНДС = Перечисления.СтавкиНДС.НДС18 
                Или СтрокаТабличнойЧасти.СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118 Тогда
                
                Сумма = Окр(Сумма/59, 2) * 59;
                СуммаНДС = Окр(Сумма * 18 / 100, 2);
                Сумма = Окр(СуммаНДС * 100 / 18, 2);
                
                Если СтрокаТабличнойЧасти.Количество > 0 Тогда
                    СтрокаТабличнойЧасти.Price = Сумма / СтрокаТабличнойЧасти.Количество;
                КонецЕсли;
                
            // Обработка для ставки НДС 20%
            ИначеЕсли СтрокаТабличнойЧасти.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 
                Или СтрокаТабличнойЧасти.СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120 Тогда
                
                Сумма = Окр(Сумма/60, 2) * 60;
                СуммаНДС = Окр(Сумма * 20 / 100, 2);
                Сумma = Окр(СуммаНДС * 100 / 20, 2);
                
                Если СтрокаТабличнойЧасти.Количество > 0 Тогда
                    СтрокаТабличнойЧасти.Цена = Сумма / СтрокаТабличнойЧасти.Количество;
                КонецЕсли;
            КонецЕсли;
            
        КонецЕсли;
    КонецЕсли;
    // Конец изменений

    // [Здесь выполняется штатный код процедуры, включая расчет скидок...]
    // ..................................................................
    
    // В конце процедуры, после расчета суммы скидки, добавим финальную корректировку:
    СтрокаТабличнойЧасти.Сумма = Сумма - СуммаСкидки;

    // Начало изменений: Корректировка суммы после применения скидок
    Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РеализацияТоваровУслуг") 
        Или ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЗаказПокупателя") 
        Или ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.СчетНаОплатуПокупателю") Тогда
        
        Если ДокументОбъект.УчитыватьНДС И НЕ ДокументОбъект.СуммаВключаетНДС Тогда
            
            // Финальный расчет по ставке 18%
            Если СтрокаТабличнойЧасти.СтавкаНДС = Перечисления.СтавкиНДС.НДС18 
                Или СтрокаТабличнойЧасти.СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118 Тогда
                
                СтрокаТабличнойЧасти.Сумма = Окр(СтрокаТабличнойЧасти.Сумма / 59, 2) * 59;
                СуммаНДС = Окр(СтрокаТабличнойЧасти.Сумма * 18 / 100, 2);
                СтрокаТабличнойЧасти.Сумма = Окр(СуммаНДС * 100 / 18, 2);
                
            // Финальный расчет по ставке 20%
            ИначеЕсли СтрокаТабличнойЧасти.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 
                Или СтрокаТабличнойЧасти.СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120 Тогда
                
                СтрокаТабличнойЧасти.Сумма = Окр(СтрокаТабличнойЧасти.Сумма / 60, 2) * 60;
                СуммаНДС = Окр(СтрокаТабличнойЧасти.Сумма * 20 / 100, 2);
                СтрокаТабличнойЧасти.Сумма = Окр(СуммаНДС * 100 / 20, 2);
            КонецЕсли;
            
        КонецЕсли;
    КонецЕсли;
    // Конец изменений
КонецПроцедуры

Анализ работы алгоритма

Проанализируем математическую логику предложенной доработки. Алгоритм делит сумму строки на определенный коэффициент (59 для ставки 18%, так как 18/100 раскладывается через пропорции, и 60 для ставки 20%, так как 20/100 = 1/5), округляет результат до копеек, а затем производит обратное умножение. Это гарантирует, что полученная база без НДС при последующем умножении на ставку налога (18% или 20%) даст абсолютно точную, ровную величину налога без бесконечных дробных остатков, которые обычно и вызывают погрешности округления.

В результате внедрения данного кода цена номенклатуры в строке может незначительно скорректироваться (в пределах долей копейки), зато во всех печатных формах (будь то УПД, ТОРГ-12 или Счет-фактура) итоговая сумма НДС по строкам будет идеально сходиться с расчетной суммой НДС от общего итога документа.

← На главную