Как программно устранить расхождение в копейках в печатной форме ТОРГ-12 при валютных расчетах

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

В практике работы с 1С:Управление торговлей (УТ) и другими учетными системами часто возникает классическая коллизия: заказ клиента оформлен в иностранной валюте или условных единицах, а первичные документы (ТОРГ-12, Счет-фактура) и платежные документы (ПКО, Поступление на счет) должны быть оформлены в рублях. В процессе пересчета итоговых сумм по курсу возникают погрешности округления в несколько копеек, из-за которых итоговая сумма реализации не совпадает с суммой оплаты. Разберем, почему это происходит и как корректно «подтянуть» цифры программными методами.

Анализ причины: почему возникают «лишние» копейки?

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

  1. Пересчитать цену каждой позиции в рубли и округлить ее.
  2. Умножить округленную цену на количество, получив сумму строки.
  3. Рассчитать НДС от суммы каждой строки и округлить его.

В результате математического сложения округленных строк итоговая сумма внизу документа почти никогда не будет идеально равна (Общая сумма в валюте × Курс). Разница в 1–20 копеек является естественным следствием дискретности расчетов. Однако для бухгалтерии важно, чтобы сумма в ТОРГ-12 до копейки соответствовала сумме, фактически внесенной покупателем в кассу или на расчетный счет.

Способ 1: Алгоритм пропорционального распределения погрешности

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

Посмотрим на пример функции, которая реализует этот механизм. Данный код часто встречается в типовых решениях (например, в ЗУП или старых версиях УПП), и его легко адаптировать под УТ 11:


Функция РаспределитьСуммуПропорциональноКоэффициентам(Знач РаспределяемаяСумма, Коэффициенты, Знач Точность = 2) Экспорт
    Если Коэффициенты.Количество() = 0 или Не ЗначениеЗаполнено(РаспределяемаяСумма) Тогда
        Возврат Неопределено;
    КонецЕсли;

    ИндексМаксимальногоКоэффициента = 0;
    МаксимальныйКоэффициент = 0;
    РаспределеннаяСумма = 0;
    СуммаКоэффициентов = 0;

    // Сначала определим общую базу для распределения и найдем самую весомую позицию
    Для Индекс = 0 По Коэффициенты.Количество() - 1 Цикл
        Коэффициент = Коэффициенты[Индекс];
        АбсолютноеЗначениеКоэффициента = ?(Коэффициент > 0, Коэффициент, -Коэффициент);
        Если МаксимальныйКоэффициент < АбсолютноеЗначениеКоэффициента Тогда
            МаксимальныйКоэффициент = АбсолютноеЗначениеКоэффициента;
            ИндексМаксимальногоКоэффициента = Индекс;
        КонецЕсли;
        СуммаКоэффициентов = СуммаКоэффициентов + Коэффициент;
    КонецЦикла;

    Если СуммаКоэффициентов = 0 Тогда
        Возврат Неопределено;
    КонецЕсли;

    Результат = Новый Массив(Коэффициенты.Количество());
    Для Индекс = 0 По Коэффициенты.Количество() - 1 Цикл
        Результат[Индекс] = Окр(РаспределяемаяСумма * Коэффициенты[Индекс] / СуммаКоэффициентов, Точность, 1);
        РаспределеннаяСумма = РаспределеннаяСумма + Результат[Индекс];
    КонецЦикла;

    // Погрешности округления относим на коэффициент с максимальным весом
    Если Не РаспределеннаяСумма = РаспределяемаяСумма Тогда
        Результат[ИндексМаксимальногоКоэффициента] = Результат[ИндексМаксимальногоКоэффициента] + РаспределяемаяСумма - РаспределеннаяСумма;
    КонецЕсли;

    Возврат Результат;
КонецФункции

Как применить этот код в задаче с ТОРГ-12:

  1. Вычисляем ЦелеваяСуммаИтого = СуммаОплатыПоПКО.
  2. Собираем массив текущих рублевых сумм из строк документа (это будут наши Коэффициенты).
  3. Вызываем функцию, передав в нее ЦелеваяСуммаИтого и массив.
  4. Полученные из массива значения записываем обратно в печатную форму (в колонку «Сумма с НДС»).
  5. Для соблюдения целостности документа пересчитываем «Сумму НДС» и «Сумму без НДС» обратным ходом от новой итоговой суммы строки.

Способ 2: Метод корректировки последней строки

Если в документе много строк, а разница составляет всего несколько копеек, можно применить упрощенный метод «хвоста». Разберем этот алгоритм подробнее:

Проанализируем ситуацию: мы знаем, какая общая сумма должна получиться в итоге (например, 10 500.50 руб.). Мы суммируем все строки печатной формы, кроме самой последней. Допустим, сумма первых (N-1) строк составила 9 000.20 руб. Тогда сумма последней строки жестко задается как (10 500.50 - 9 000.20 = 1 500.30).

Этот метод гарантирует 100% совпадение итогов, однако требует осторожности: если последняя строка имеет маленькую сумму (например, 1 рубль), а корректировка составляет 50 копеек, это будет выглядеть подозрительно. Именно поэтому способ с распределением (Способ 1) предпочтительнее.

Методологические и законодательные риски

Выясним причину, по которой бухгалтеры иногда опасаются таких корректировок. Согласно ПБУ 3/2006, разницы, возникающие при пересчете валюты, являются курсовыми разницами.

Важные моменты:

Рекомендация: Прежде чем внедрять программную «подрезку» копеек, уточните у главного бухгалтера, не является ли эта разница законной курсовой разницей. Если же бухгалтер подтверждает, что это именно ошибка округления при расчете цены (так называемая «суммовая погрешность»), используйте приведенный выше программный код.

Практические советы по реализации в 1С:УТ 11

Для реализации подмены сумм в печатной форме в современных конфигурациях на управляемых формах рекомендуем использовать расширения конфигурации. Рассмотрим шаги:

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

Таким образом, мы обеспечим соответствие печатного документа требованиям заказчика и при этом сохраним корректность валютного учета в системе.

← На главную