Почему не удается провести поступление товаров и услуг из-за расхождения сумм и как это исправить?

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

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

Выясним причину ошибки

Проанализируем ситуацию, которая приводит к сбою. Ошибка чаще всего возникает на стыке двух факторов:

  1. Дробное количество и расчет сумм. Когда номенклатура поступает в дробных величинах (например, метры квадратные, килограммы или литры), при умножении количества на цену с копейками результат содержит доли копеек. Например, при количестве 25,15 и цене 277,95 произведение составляет 6990,4425 руб. В регламентированном учете метаданные 1С для денежных показателей строго ограничены форматом Число(15, 2) — учет ведется исключительно в рублях и копейках. Ни один бухгалтерский регистр физически не хранит десятитысячные доли.
  2. Проблема «лишней копейки» при пропорциональном распределении. Если на закладке «Услуги» внесена сумма (например, доставка на сумму 350 рублей), программа пытается распределить ее пропорционально между позициями товаров. Рассчитывая долю каждой строки, система выполняет округление каждого промежуточного значения до двух знаков после запятой. В результате суммирования округленных значений общий итог распределения часто дает расхождение с исходной суммой услуги на 1–2 копейки (получается 349,99 руб. или 350,01 руб.). При проведении срабатывает контроль соответствия сумм, и транзакция отменяется.

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

Решение 1. Оформление услуги отдельным документом

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

  1. Удалим доставку или дополнительную услугу с закладки «Услуги» в текущем документе поступления и проведем накладную только с товарами.
  2. Для включения стоимости доставки в себестоимость товаров воспользуемся специализированным документом Поступление доп. расходов (или Приобретение услуг и прочих активов в зависимости от используемой конфигурации).
  3. В специализированном документе укажем документ партии (наше поступление товаров) и общую сумму расходов. Типовой механизм распределения дополнительных расходов оптимизирован для подобных операций и корректно относит затраты на партии.

Решение 2. Ручная корректировка копеек в табличной части

Если требуется провести услугу именно в текущем документе поступления, применим ручную корректировку распределенной суммы:

  1. Нажмем кнопку «Распределить» на закладке «Услуги».
  2. Перейдем в табличную часть товаров и найдем колонку, куда записалась сумма распределенной услуги.
  3. Сложим полученные значения по всем строкам и сопоставим итог с общей стоимостью услуги.
  4. Найдем строку с наибольшей суммой или количеством и скорректируем значение вручную на недостающую или избыточную копейку, чтобы общая сумма распределения сошлась с исходной суммой затрат до сотых долей рубля.
  5. Если погрешность вызвана перемножением количества на цену, введем в строку жесткое значение в поле «Сумма» напрямую из первичного документа поставщика, позволив программе самой рассчитать результирующую цену.

Решение 3. Программная корректировка алгоритма распределения (для программиста)

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

Рассмотрим пример правильного алгоритма распределения с контролем остатка:


// Предположим, у нас есть ОбщаяСуммаУслуги и ТабличнаяЧастьТовары
НакопленнаяСумма = 0;
ВсегоСтрок = ТабличнаяЧастьТовары.Количество();

Для Индекс = 0 По ВсегоСтрок - 1 Цикл
    СтрокаТовара = ТабличнаяЧастьТовары[Индекс];
    
    Если Индекс = ВсегоСтрок - 1 Тогда
        // На последнюю строку относим весь оставшийся «хвост»
        СтрокаТовара.СуммаУслуги = ОбщаяСуммаУслуги - НакопленнаяСумма;
    Иначе
        // Рассчитываем пропорциональную долю строки с математическим округлением до копеек
        Доля = Окр((СтрокаТовара.Сумма / ИтогСуммаТоваров) * ОбщаяСуммаУслуги, 2);
        СтрокаТовара.СуммаУслуги = Доля;
        НакопленнаяСумма = НакопленнаяСумма + Доля;
    КонецЕсли;
КонецЦикла;

Такой подход полностью устраняет ошибку несовпадения итогов, так как последняя строка гарантированно поглощает погрешность округления Разница = СуммаУслуги - СуммаРаспределения, позволяя документу беспрепятственно сформировать проводки.

← На главную