При работе с онлайн-кассами АТОЛ, особенно в контексте продажи маркированных товаров на розлив, можно столкнуться с ошибкой "Объекту ... присвоен код ошибки 148 [Ошибка программирования реквизита 1023 (Недопустимый реквизит для данного типа документа)]". Эта проблема часто возникает при попытке передать в чек дробное количество товара, например, 0.5 литра пива. Давайте вместе разберемся, почему ККТ выдает такую ошибку и как ее исправить.
Проанализируем ситуацию: мы пытаемся фискализировать продажу разливного пива, передавая в драйвер ККТ количество 0.5 в тег 1023 (количество предмета расчета). Однако касса отвергает эту операцию. Основная причина кроется в том, что ККТ не может корректно определить, что мы продаем именно мерный, а не штучный товар. Для штучного товара дробное количество, разумеется, недопустимо.
Рассмотрим по шагам, что нужно проверить и исправить для успешной продажи разливного пива.
Ключевым моментом для продажи мерного маркированного товара является правильная передача статуса этого товара. За это отвечает тег 2110 (в драйвере АТОЛ ему может соответствовать параметр LIBFPTR_PARAM_MARKING_CODE_STATUS с идентификатором 65846).
Существует важное правило, которое драйвер использует для определения типа товара:
В обсуждаемом случае использовался статус LIBFPTR_MES_DRY_FOR_SALE (2). Число 2 — чётное, и, казалось бы, все должно работать. Однако здесь в игру вступает второй критически важный фактор — порядок передачи реквизитов в драйвер.
Важно: Драйвер ККТ должен сначала получить информацию о том, что товар является мерным, и только потом принять его дробное количество. Если вы сначала передадите количество (тег 1023), а потом статус товара (тег 2110), драйвер по умолчанию будет считать товар штучным и закономерно выдаст ошибку на дробное значение 0.5.
Таким образом, правильная последовательность действий при регистрации позиции в чеке должна быть следующей:
LIBFPTR_PARAM_MEASUREMENT_UNIT).LIBFPTR_PARAM_MARKING_CODE_STATUS). Например, значение 2.LIBFPTR_PARAM_QUANTITY). Например, 0.5.Посмотрим на примерный код, демонстрирующий правильный порядок вызовов методов драйвера:
// Устанавливаем единицу измерения - литры
FiscalPrinter.setParam(1212, "Пиво разливное"); // Наименование предмета расчета (тег 1030)
FiscalPrinter.setParam(1079, 150.00); // Цена за единицу (тег 1079)
// Сначала задаем контекст для мерного товара
FiscalPrinter.setParam(65851, 41); // Тег 2108 (LIBFPTR_PARAM_MEASUREMENT_UNIT) = ЛИТР (41)
FiscalPrinter.setParam(65846, 2); // Тег 2110 (LIBFPTR_PARAM_MARKING_CODE_STATUS) = 2 (чётное)
// Теперь передаем дробное количество
FiscalPrinter.setParam(1023, 0.5); // Тег 1023 (LIBFPTR_PARAM_QUANTITY) = 0.5
// Передаем остальные реквизиты (код маркировки, режим обработки и т.д.)
FiscalPrinter.setParam(65852, 0); // LIBFPTR_PARAM_MARKING_PROCESSING_MODE
// ... другие параметры
// Регистрируем позицию
FiscalPrinter.registration();
Еще одна распространенная проблема — использование неправильного разделителя в дробных числах. В большинстве программных сред и, в частности, в драйверах АТОЛ, в качестве десятичного разделителя используется точка (.).
Если в вашем коде или настройках системы в качестве разделителя используется запятая (,), это может привести к ошибке. Убедитесь, что в тег 1023 передается значение именно в формате 0.5, а не 0,5.
В ходе обсуждения возник вопрос: что именно передавать в тег 2000 (код товара) при продаже пива из кеги — полный код маркировки кеги или только ее GTIN?
Для заведений общественного питания (общепита) законодательство предусматривает упрощенный режим. При постановке кеги на кран вы сообщаете в "Честный ЗНАК" полный код маркировки. А при каждой последующей продаже порции пива из этой кеги в фискальном чеке достаточно указывать только GTIN этой продукции. Это значительно упрощает автоматизацию, так как не требует хранения и передачи уникального кода для каждой проданной кружки.
Для розничных магазинов, продающих пиво на розлив в потребительскую тару, правила могут отличаться, поэтому всегда сверяйтесь с актуальными требованиями регулятора.
Если вы уверены, что порядок тегов корректен, статус товара правильный и десятичный разделитель — точка, но ошибка 148 все равно появляется, причина может быть в самой кассе. Проблемы с поддержкой ФФД 1.2 и работой с маркированными товарами часто исправляются производителем в новых версиях:
В заключение, ошибка программирования реквизита 1023 при продаже разливного пива — это почти всегда проблема логики взаимодействия с ККТ. Ключ к решению — сначала "объяснить" кассе, что товар мерный (через теги 2108 и 2110), и только потом передавать его дробное количество (тег 1023). При необходимости можно воспользоваться инструментом для независимой печати чеков на ККМ АТОЛ напрямую через драйвер.