В процессе работы с конфигурацией «1С:Управление торговлей» версии 11 (а также в 1С:ERP и 1С:КА) пользователи часто сталкиваются с ситуацией, когда необходимо реализовать товар в очень малых дозах. Типичный пример: основная единица хранения — килограмм (кг), а продажа осуществляется в граммах или даже долях грамма (например, 0,25 г). При попытке провести такой документ система выдает критическую ошибку: «Обнаружено нулевое количество при пересчете в единицу хранения». В этой статье мы разберем природу этого ограничения и рассмотрим пошаговые методы его преодоления.
Для начала проанализируем ситуацию с технической точки зрения. В платформе 1С:Предприятие 8 для большинства числовых ресурсов (включая количество в регистрах накопления) по умолчанию используется точность 3 знака после запятой. Это означает, что система физически не может хранить или обрабатывать число в остатках, которое меньше 0,001.
Давайте проведем расчет на примере из темы форума:
Номенклатура — килограмм (кг).0,25 г / 1000 = 0,00025 кг.Важно понимать, что создание дополнительной единицы измерения (упаковки) с типом «Разупаковка» и коэффициентом 0,001 ситуацию не исправит, если итоговый результат пересчета в базовую единицу все равно остается меньше 0,001. Система всегда «приземляет» расчеты к единице хранения.
Проанализируем самый надежный способ — переход на более мелкую единицу хранения. Если специфика вашего бизнеса предполагает регулярную продажу товаров в граммах или миллиграммах, хранить остатки в килограммах архитектурно неверно.
Рассмотрим алгоритм действий:
Номенклатура, если по ней уже есть движения (документы).Путь А: Создание новой карточки номенклатуры. Это наиболее «чистый» метод. Мы создаем новый товар «Товар (в граммах)», устанавливаем базовую единицу «гр.», а килограммы добавляем как Упаковку с коэффициентом 1000. После этого необходимо перенести остатки со старой карточки на новую документом Сборка (разборка) товаров или через инвентаризацию (списание/оприходование).
Путь Б: Групповое изменение реквизитов. Рассмотрим вариант для опытных пользователей. С помощью обработки Групповое изменение реквизитов можно принудительно изменить единицу хранения. Внимание: это действие приведет к тому, что все прошлые документы станут неверными (10 кг превратятся в 10 г), поэтому этот метод допустим только в паре с полной корректировкой остатков на текущую дату и пониманием, что исторические отчеты «поплывут».
Если вам нужно продавать фиксированные малые дозы, разберем вариант с упаковками. В 1С:УТ 11 можно настроить индивидуальные упаковки для номенклатуры.
Если мы создадим упаковку «Доза 0,25г» для товара, хранящегося в килограммах, мы все равно столкнемся с ошибкой округления при проведении. Однако, если изменить логику и сделать базовой единицей Грамм, то мы сможем легко создавать упаковки любого размера:
Рассмотрим радикальный метод, который часто обсуждается в сообществе 1С-программистов, но редко рекомендуется к внедрению — изменение точности в конфигураторе. Можно изменить формат числа в ОпределяемыеТипы (например, Количество или КоличествоКнижное), увеличив точность с 3 до 5 или 6 знаков.
Проанализируем риски этого решения:
Выясним, какой способ лучше выбрать. Если вы столкнулись с ошибкой пересчета, выполните следующие шаги вместе с нами:
НСИ и калькуляция -> Номенклатура.Заказа клиента или Реализации товаров и услуг выбирайте этот товар. Теперь при вводе количества 0,25 система сохранит его корректно, так как 0,250 грамма полностью укладывается в стандартную точность 1С.Посмотрим на пример логики пересчета в коде, который может использовать система при проведении (упрощенно):
// Пример логики пересчета количества в базовую единицу
КоличествоВЕдиницахХранения = Округлить(КоличествоВДокументе * КоэффициентУпаковки, 3);
Если КоличествоВЕдиницахХранения = 0 И КоличествоВДокументе > 0 Тогда
ВызватьИсключение "Обнаружено нулевое количество при пересчете!";
КонецЕсли;
Как мы видим из этого примера, именно функция Округлить(..., 3) является «бутылочным горлышком». Поэтому правильная настройка нормативно-справочной информации (НСИ) — это залог отсутствия ошибок в учете без вмешательства в программный код системы.
Подведем итог: Всегда выбирайте в качестве единицы хранения ту величину, которая позволит записывать минимальную партию отгрузки с точностью не более 3-х знаков после запятой. Если вы торгуете золотом или высокоточными химикатами — используйте миллиграммы. Если торгуете металлом, но иногда продаете по 100 грамм — используйте килограммы. Но никогда не пытайтесь продать 0,0001 часть от базовой единицы.