Как избежать погрешности округления количества при использовании коэффициентов пересчета единиц измерения в 1С?

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

При ведении складского и торгового учета в конфигурациях 1С (таких как «1С:Управление торговлей 10.3», «1С:Комплексная автоматизация 1.1», «1С:Управление производственным предприятием 1.3») часто возникает задача отгрузки штучного товара в весовых единицах (например, штучные банки или упаковки фиксированного веса требуется продавать в килограммах). Однако при попытке настроить пересчет через дополнительную единицу измерения пользователи сталкиваются с дробными «хвостами» при списании остатков: вместо целого числа штук программа списывает, например, 9.996 шт.

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

Причина возникновения погрешности пересчета

Проанализируем механику работы типовых регистров накопления ТоварыНаСкладах, ПартииТоваровНаСкладах и ТоварыОрганизаций. В них учет всегда ведется строго в единице хранения остатков (базовой единице номенклатуры).

Когда в табличной части документа выбирается дополнительная единица измерения, количество для движений регистра рассчитывается по базовой формуле:

КоличествоВРегистре = КоличествоВДокументе * Коэффициент

Реквизит Коэффициент в справочнике ЕдиницыИзмерения и табличных частях документов имеет типовую разрядность Число(10, 3). Рассмотрим конкретный пример:

  1. Базовая единица товара — штука (шт).
  2. Вес одной штуки — 0.850 кг.
  3. Дополнительная единица — килограмм (кг). Для нее рассчитывается коэффициент: 1 / 0.850 = 1.176470588...
  4. Из-за ограничения точности в три знака коэффициент сохраняется как 1.176.
  5. При продаже 10 банок (8.5 кг) программа рассчитывает количество для списания: 8.5 * 1.176 = 9.996 шт.

В результате на остатках склада образуется «зависший хвост» в 0.004 шт., который невозможно списать стандартной продажей.

Почему нельзя использовать функцию Окр в коде проведения

Попытка вмешаться в процедуру ОбработкаПроведения документов реализации и принудительно применить функцию Окр() влечет за собой серьезные риски:

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

Способ 1. Использование внешней печатной формы (рекомендуемый)

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

Разберем по шагам, как реализовать данную схему:

  1. Оформляем документы поступления, перемещения и реализации в стандартных базовых единицах (в штуках). Это гарантирует целостность регистров и отсутствие погрешностей при обмене с бухгалтерскими программами.
  2. Создаем внешнюю печатную форму на базе типовой накладной.
  3. В алгоритме формирования табличной части печатной формы программно пересчитываем количество и цену, умножая штуки на вес единицы (0.850 кг):
    
    // Пример пересчета в модуле внешней печатной формы
    ВесЕдиницы = ВыборкаСтрок.Номенклатура.Вес;
    Если ЗначениеЗаполнено(ВесЕдиницы) И ВесЕдиницы > 0 Тогда
        КоличествоВПечать = ВыборкаСтрок.Количество * ВесЕдиницы;
        ЦенаВПечать = ВыборкаСтрок.Сумма / КоличествоВПечать;
    Иначе
        КоличествоВПечать = ВыборкаСтрок.Количество;
        ЦенаВПечать = ВыборкаСтрок.Цена;
    КонецЕсли;
    
  4. Подключаем готовую обработку через справочник ВнешниеОбработки. Конфигурация остается на полной поддержке, а регистры ведутся без дробных погрешностей.

Способ 2. Методологическое изменение базовой единицы

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

  1. В карточке номенклатуры в качестве базовой единицы (единицы хранения остатков) указываем кг.
  2. В качестве дополнительной единицы измерения создаем «Упаковка / Банка» (шт) с коэффициентом 0.850.
  3. В этом случае расчет пересчета упаковок в базовую единицу не содержит бесконечных дробей: 10 шт * 0.850 = 8.500 кг. Списание со склада происходит с абсолютной математической точностью.

Способ 3. Использование документа «Комплектация номенклатуры»

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

  1. Создаются две позиции номенклатуры: «Компот (шт)» с базовой единицей «шт» и «Компот весовой (кг)» с базовой единицей «кг».
  2. Перед отгрузкой оформляется документ КомплектацияНоменклатуры с видом операции «Разукомплектация».
  3. В табличной части списывается целое число штук (например, 10 шт.) и приходуется точное количество килограммов (8.5 кг) с корректным распределением себестоимости.
  4. Отгрузка покупателю производится с весовой позиции номенклатуры.

Способ 4. Увеличение разрядности реквизита «Коэффициент» в метаданных

Если описанные выше варианты не подходят по регламенту учета, можно изменить структуру метаданных в конфигураторе:

  1. Снимаем конфигурацию с поддержки с сохранением возможности изменений.
  2. Находим справочник ЕдиницыИзмерения и меняем тип реквизита Коэффициент с Число(10, 3) на Число(15, 6) или Число(15, 8).
  3. Аналогично увеличиваем точность реквизита Коэффициент в табличных частях Товары всех документов товародвижения.
  4. Пересчитываем коэффициенты в существующих единицах измерения. При коэффициенте 1.176471 погрешность списания снижается до долей грамма и не влияет на управленческие итоги.
← На главную