При ведении складского и торгового учета в конфигурациях 1С (таких как «1С:Управление торговлей 10.3», «1С:Комплексная автоматизация 1.1», «1С:Управление производственным предприятием 1.3») часто возникает задача отгрузки штучного товара в весовых единицах (например, штучные банки или упаковки фиксированного веса требуется продавать в килограммах). Однако при попытке настроить пересчет через дополнительную единицу измерения пользователи сталкиваются с дробными «хвостами» при списании остатков: вместо целого числа штук программа списывает, например, 9.996 шт.
Разберем математическую причину этой проблемы, выясним, почему нельзя просто добавить функцию округления в модуль проведения документа, и рассмотрим правильные варианты решения задачи.
Проанализируем механику работы типовых регистров накопления ТоварыНаСкладах, ПартииТоваровНаСкладах и ТоварыОрганизаций. В них учет всегда ведется строго в единице хранения остатков (базовой единице номенклатуры).
Когда в табличной части документа выбирается дополнительная единица измерения, количество для движений регистра рассчитывается по базовой формуле:
КоличествоВРегистре = КоличествоВДокументе * Коэффициент
Реквизит Коэффициент в справочнике ЕдиницыИзмерения и табличных частях документов имеет типовую разрядность Число(10, 3). Рассмотрим конкретный пример:
1 / 0.850 = 1.176470588...8.5 * 1.176 = 9.996 шт.В результате на остатках склада образуется «зависший хвост» в 0.004 шт., который невозможно списать стандартной продажей.
Попытка вмешаться в процедуру ОбработкаПроведения документов реализации и принудительно применить функцию Окр() влечет за собой серьезные риски:
Если специфика учета компании предполагает складской учет в штуках, а представление в килограммах требуется исключительно для покупателя (в накладных ТОРГ-12, УПД или актах), оптимальным решением является разделение учета и печатных документов.
Разберем по шагам, как реализовать данную схему:
// Пример пересчета в модуле внешней печатной формы
ВесЕдиницы = ВыборкаСтрок.Номенклатура.Вес;
Если ЗначениеЗаполнено(ВесЕдиницы) И ВесЕдиницы > 0 Тогда
КоличествоВПечать = ВыборкаСтрок.Количество * ВесЕдиницы;
ЦенаВПечать = ВыборкаСтрок.Сумма / КоличествоВПечать;
Иначе
КоличествоВПечать = ВыборкаСтрок.Количество;
ЦенаВПечать = ВыборкаСтрок.Цена;
КонецЕсли;
ВнешниеОбработки. Конфигурация остается на полной поддержке, а регистры ведутся без дробных погрешностей.Если для предприятия принципиально важно видеть остатки на складе именно в килограммах, правильнее сделать неделимую весовую единицу базовой.
10 шт * 0.850 = 8.500 кг. Списание со склада происходит с абсолютной математической точностью.Если смена базовой единицы невозможна, а клиенту требуется передавать в учет именно весовой товар с номенклатурной позицией в килограммах, применяется схема разукомплектации:
КомплектацияНоменклатуры с видом операции «Разукомплектация».Если описанные выше варианты не подходят по регламенту учета, можно изменить структуру метаданных в конфигураторе:
ЕдиницыИзмерения и меняем тип реквизита Коэффициент с Число(10, 3) на Число(15, 6) или Число(15, 8).Коэффициент в табличных частях Товары всех документов товародвижения.1.176471 погрешность списания снижается до долей грамма и не влияет на управленческие итоги.