При работе в программе 1С:Управление торговлей (редакция 11) пользователи часто сталкиваются с неприятной ситуацией: при попытке отгрузить последнюю единицу товара система блокирует проведение документа реализации, сообщая о нехватке микроскопического количества номенклатуры (например, недостаточно товара 0,002 упак.). При этом фактически товар на складе есть, а в информационной базе по отчетам все должно сходиться "в ноль".
В этой статье мы подробно разберем, почему возникает данная ошибка, как устроена математика пересчета единиц измерения в платформе 1С, и рассмотрим несколько практических способов решения этой проблемы как на методологическом уровне, так и с помощью оперативных корректировок без программирования.
Давайте проанализируем ситуацию изнутри. В конфигурациях на платформе 1С:Предприятие 8 для всех числовых показателей в регистрах накопления (включая остатки товаров на складах) используется стандартный тип данных — число с точностью до 3 знаков после запятой (формат 15.3). Это означает, что любое количество товара в системе может быть записано максимум с тремя знаками в дробной части.
Когда мы регистрируем карточку номенклатуры, система требует указать базовую (основную) единицу хранения. Если в качестве базовой единицы выбрана упаковка (коробка, пачка), содержащая, например, 24 штуки, а фактические продажи в розницу или мелким оптом ведутся в штуках, программе приходится выполнять операцию обратного пересчета при каждом проведении документа продажи:
1 штука = 1 / 24 упаковки = 0,0416666... упаковки
Поскольку система физически не может хранить бесконечную простую дробь и ограничена тремя знаками после запятой, происходит округление. Значение 0,041666... округляется по математическим правилам до 0,042.
Теперь посмотрим на примере реальной цепочки продаж, что происходит в регистрах накопления при последовательном списании товара по 1 или несколько штук:
1 * 0,04167 = 0,042 упак. (остаток: 0,958 упак.)3 * 0,04167 = 0,125 упак. (остаток: 0,833 упак.)0,042 упак. (остаток: 0,791 упак.)4 * 0,04167 = 0,167 упак. (остаток: 0,624 упак.)0,042 упак. (остаток: 0,582 упак.)0,125 упак. (остаток: 0,457 упак.)0,042 упак. (остаток: 0,415 упак.)0,167 упак. (остаток: 0,248 упак.)5 * 0,04167 = 0,208 упак. (остаток: 0,040 упак.)Физически на складе осталась ровно 1 штука (ведь продано было 1+3+1+4+1+3+1+4+5 = 23 штуки из 24). Однако в регистре остатков программы 1С сейчас числится лишь 0,040 упаковки. При попытке провести документ реализации на эту последнюю 1 штуку, программа рассчитывает ее объем в упаковках как 0,042 и сравнивает с текущим остатком в системе. В результате сравнения 0,040 < 0,042 система выдает ошибку проведения: "Недостаточно товара 0,002 упак.".
Платформа 1С не использует простые дроби в регистрах, поэтому накопление таких погрешностей округления неизбежно при неверном выборе базовой единицы хранения.
В зависимости от того, в каком периоде возникла проблема, насколько жестко закрыты прошлые периоды и сколько таких карточек заведено в системе, мы можем применить один из трех подходов.
Самое правильное и надежное решение, которое навсегда избавит от проблем с округлением в будущем — это соблюдение золотого правила методологии 1С: базовой (основной) единицей хранения номенклатуры всегда должна быть самая минимальная единица измерения, в которой возможен учет или продажа товара (в данном случае — штука).
Поскольку в существующей карточке номенклатуры, по которой уже есть движения в закрытых периодах, изменить базовую единицу измерения невозможно, мы выполним переход на новую карточку. Рассмотрим этот процесс по шагам:
[НЕ ИСПОЛЬЗОВАТЬ] Товар 002. В карточке на вкладке настроек можно также установить флаг "Блокировать продажу".Если вам нужно срочно провести реализацию "здесь и сейчас", а пересоздавать карточку и переносить остатки прямо сейчас нет времени, можно использовать временный административный обходной путь. Рассмотрим этот алгоритм:
-0,002 упак.0,002, единицу измерения — упаковка. В качестве статьи доходов выберем статью, связанную с прочими операционными доходами (например, "Доходы от округления").В некоторых случаях снизить остроту проблемы с микро-недостачами помогает использование встроенного механизма округления в настройках программы.
Проанализируем этот функционал. Перейдем в раздел НСИ и администрирование — Настройка НСИ и разделов — Номенклатура. Раскроем группу параметров "Единицы измерения". Здесь присутствует настройка "Допустимое отклонение при автоматическом округлении".
Если мы укажем здесь небольшой процент допустимого отклонения (например, 1% или 2%), то при проведении документов отгрузки мерных или разупакованных товаров система будет пытаться автоматически сглаживать мелкие расхождения, списывая остатки до нуля, если величина недопоставки укладывается в рамки этого процента. Однако стоит учитывать, что в старых релизах конфигурации (например, в УТ 11.4.6) этот механизм не всегда стабильно отрабатывал для штучных товаров с упаковками, поэтому наиболее надежным и рекомендуемым остается именно Способ 1.
Подводя итоги нашего анализа, сделаем важные выводы для дальнейшей работы в «1С:Управление торговлей»: