В практике работы с 1С:Управление торговлей (УТ) и другими учетными системами часто возникает классическая коллизия: заказ клиента оформлен в иностранной валюте или условных единицах, а первичные документы (ТОРГ-12, Счет-фактура) и платежные документы (ПКО, Поступление на счет) должны быть оформлены в рублях. В процессе пересчета итоговых сумм по курсу возникают погрешности округления в несколько копеек, из-за которых итоговая сумма реализации не совпадает с суммой оплаты. Разберем, почему это происходит и как корректно «подтянуть» цифры программными методами.
Проанализируем ситуацию: когда мы переводим валютную накладную в рубли, система вынуждена выполнять округление в каждой строке документа. Согласно правилам бухгалтерского учета, мы не можем просто умножить общий итог валютного документа на курс. Мы должны:
В результате математического сложения округленных строк итоговая сумма внизу документа почти никогда не будет идеально равна (Общая сумма в валюте × Курс). Разница в 1–20 копеек является естественным следствием дискретности расчетов. Однако для бухгалтерии важно, чтобы сумма в ТОРГ-12 до копейки соответствовала сумме, фактически внесенной покупателем в кассу или на расчетный счет.
Рассмотрим наиболее корректный с точки зрения алгоритмики способ — распределение накопленной погрешности по строкам документа. Мы не можем просто отнять копейки от случайной строки, так как это может исказить цену. Правильнее всего будет распределить разницу пропорционально стоимости товаров, отнеся остаток на самую крупную позицию.
Посмотрим на пример функции, которая реализует этот механизм. Данный код часто встречается в типовых решениях (например, в ЗУП или старых версиях УПП), и его легко адаптировать под УТ 11:
Функция РаспределитьСуммуПропорциональноКоэффициентам(Знач РаспределяемаяСумма, Коэффициенты, Знач Точность = 2) Экспорт
Если Коэффициенты.Количество() = 0 или Не ЗначениеЗаполнено(РаспределяемаяСумма) Тогда
Возврат Неопределено;
КонецЕсли;
ИндексМаксимальногоКоэффициента = 0;
МаксимальныйКоэффициент = 0;
РаспределеннаяСумма = 0;
СуммаКоэффициентов = 0;
// Сначала определим общую базу для распределения и найдем самую весомую позицию
Для Индекс = 0 По Коэффициенты.Количество() - 1 Цикл
Коэффициент = Коэффициенты[Индекс];
АбсолютноеЗначениеКоэффициента = ?(Коэффициент > 0, Коэффициент, -Коэффициент);
Если МаксимальныйКоэффициент < АбсолютноеЗначениеКоэффициента Тогда
МаксимальныйКоэффициент = АбсолютноеЗначениеКоэффициента;
ИндексМаксимальногоКоэффициента = Индекс;
КонецЕсли;
СуммаКоэффициентов = СуммаКоэффициентов + Коэффициент;
КонецЦикла;
Если СуммаКоэффициентов = 0 Тогда
Возврат Неопределено;
КонецЕсли;
Результат = Новый Массив(Коэффициенты.Количество());
Для Индекс = 0 По Коэффициенты.Количество() - 1 Цикл
Результат[Индекс] = Окр(РаспределяемаяСумма * Коэффициенты[Индекс] / СуммаКоэффициентов, Точность, 1);
РаспределеннаяСумма = РаспределеннаяСумма + Результат[Индекс];
КонецЦикла;
// Погрешности округления относим на коэффициент с максимальным весом
Если Не РаспределеннаяСумма = РаспределяемаяСумма Тогда
Результат[ИндексМаксимальногоКоэффициента] = Результат[ИндексМаксимальногоКоэффициента] + РаспределяемаяСумма - РаспределеннаяСумма;
КонецЕсли;
Возврат Результат;
КонецФункции
Как применить этот код в задаче с ТОРГ-12:
ЦелеваяСуммаИтого = СуммаОплатыПоПКО.Коэффициенты).ЦелеваяСуммаИтого и массив.Если в документе много строк, а разница составляет всего несколько копеек, можно применить упрощенный метод «хвоста». Разберем этот алгоритм подробнее:
Проанализируем ситуацию: мы знаем, какая общая сумма должна получиться в итоге (например, 10 500.50 руб.). Мы суммируем все строки печатной формы, кроме самой последней. Допустим, сумма первых (N-1) строк составила 9 000.20 руб. Тогда сумма последней строки жестко задается как (10 500.50 - 9 000.20 = 1 500.30).
Этот метод гарантирует 100% совпадение итогов, однако требует осторожности: если последняя строка имеет маленькую сумму (например, 1 рубль), а корректировка составляет 50 копеек, это будет выглядеть подозрительно. Именно поэтому способ с распределением (Способ 1) предпочтительнее.
Выясним причину, по которой бухгалтеры иногда опасаются таких корректировок. Согласно ПБУ 3/2006, разницы, возникающие при пересчете валюты, являются курсовыми разницами.
Важные моменты:
Рекомендация: Прежде чем внедрять программную «подрезку» копеек, уточните у главного бухгалтера, не является ли эта разница законной курсовой разницей. Если же бухгалтер подтверждает, что это именно ошибка округления при расчете цены (так называемая «суммовая погрешность»), используйте приведенный выше программный код.
Для реализации подмены сумм в печатной форме в современных конфигурациях на управляемых формах рекомендуем использовать расширения конфигурации. Рассмотрим шаги:
РеализацияТоваровУслуг).ПечатьТОРГ12 или формирование соответствующего табличного документа).ТабличногоДокумента (визуальной формы), не затрагивая данные в базе данных (регистры накопления), чтобы не нарушить целостность оперативного учета.Таким образом, мы обеспечим соответствие печатного документа требованиям заказчика и при этом сохраним корректность валютного учета в системе.