Как пробить чек на ККТ Штрих-М при наличии цен с четырьмя знаками после запятой в 1С

Программист 1С v7.7 Торговля и дистрибуция
← На главную

При расчете сложных скидок или пропорциональном распределении сумм в учетной системе цена за единицу товара нередко получается дробной — с тремя или четырьмя знаками после запятой (например, 12 бутылок на сумму 488,58 руб. дают расчетную цену 40,715 руб.).

При попытке передать такие данные в фискальный регистратор через драйвер Штрих-М (DrvFR) возникает конфликт. В чеке ККТ регистрируется одна итоговая сумма, а из учетной программы на закрытие чека передается другая. В результате фискальный регистратор возвращает ошибку: «Сумма всех типов оплаты меньше итога чека», и печать чека блокируется. Разберем причины возникновения этой ошибки и проверенные способы ее устранения.

Почему возникает ошибка расхождения сумм

Проанализируем технические и законодательные ограничения, действующие при работе с контрольно-кассовой техникой:

  1. Требования форматов фискальных документов (ФФД): Согласно стандартам ФФД (1.05, 1.1, 1.2), тег 1079 (цена за единицу) и тег 1043 (стоимость позиции) могут содержать значения исключительно с точностью до 2 знаков после запятой (в копейках). Фискальный накопитель не принимает тысячные доли копеек.
  2. Внутреннее округление прошивки ККТ: Драйвер и прошивка кассы принудительно округляют переданную цену до 2 знаков, после чего умножают ее на количество. Из-за этого образуется невязка между суммой строк в кассе и суммой документа в 1С.
  3. Несоответствие оплаты и подытога: Когда вызывается метод закрытия чека с передачей суммы оплаты из документа 1С, касса сравнивает ее со своим внутренним регистром итога. Если кассовый итог хотя бы на 1 копейку превышает переданную сумму оплаты, фискализация отменяется.

Способ 1. Программное расщепление строки чека

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

Посмотрим на пример: необходимо продать 20 единиц товара на общую сумму 0,30 руб. (средняя цена 0,015 руб.). Программно формируются две строки:

  1. Строка 1: Товар — 10 шт. по цене 0,01 руб. (Сумма = 0,10 руб.)
  2. Строка 2: Товар — 10 шт. по цене 0,02 руб. (Сумма = 0,20 руб.)

Итоговое количество составляет 20 шт., а сумма — ровно 0,30 руб. При этом касса получает абсолютно корректные цены с двумя знаками после запятой.

Разберем алгоритм такого расщепления на встроенном языке 1С:


// Входные параметры позиции
ВсегоКоличество = 12;
ВсегоСумма = 488.58;

// Вычисляем базовую округленную цену вниз (до копеек)
БазоваяЦена = Окр(ВсегоСумма / ВсегоКоличество - 0.005, 2);
ПовышеннаяЦена = БазоваяЦена + 0.01;

// Определяем количество для строки с повышенной ценой
КоличествоПовышенное = Окр((ВсегоСумма - БазоваяЦена * ВсегоКоличество) / 0.01, 0);
КоличествоБазовое = ВсегоКоличество - КоличествоПовышенное;

Если КоличествоПовышенное = 0 Тогда
    // Расщепление не требуется, цена делится нацело
    ПечатьСтрокиККТ(Наименование, ВсегоКоличество, БазоваяЦена);
Иначе
    // Передаем две позиции с корректными ценами
    Если КоличествоБазовое > 0 Тогда
        ПечатьСтрокиККТ(Наименование, КоличествоБазовое, БазоваяЦена);
    КонецЕсли;
    ПечатьСтрокиККТ(Наименование, КоличествоПовышенное, ПовышеннаяЦена);
КонецЕсли;

Способ 2. Укрупнение единиц измерения номенклатуры

Если специфика учета позволяет продавать товар не поштучно, а упаковками, можно изменить единицу измерения предмета расчета. Например, вместо передачи позиции «Бутылка — 12 шт. по 40,715 руб.» в ККТ передается «Упаковка (12 шт.) — 1 шт. по цене 488,58 руб.».

В этом случае количество равно целому числу (1 шт.), а цена точно равна итоговой стоимости, что полностью исключает возникновение погрешностей при умножении.

Способ 3. Синхронизация суммы оплаты с подытогом кассы

Если копеечные расхождения возникают на этапе закрытия чека из-за особенностей расчета скидок самим драйвером, необходимо перед оплатой считывать фактическую сумму, накопленную внутри кассы.

Разберем порядок действий при взаимодействии с драйвером Штрих-М:

  1. Зарегистрировать все позиции чека.
  2. Вызвать команду снятия подытога (например, CheckSubTotal()) или прочитать свойство итоговой суммы чека из драйвера (Summ).
  3. Подставить полученную из ККТ сумму в параметры закрытия чека (передать в свойства оплаты наличными или безналичными).

Такой подход гарантирует, что сумма переданных типов оплат будет в точности совпадать с расчетом фискального регистратора, предотвращая ошибку блокировки печати.

← На главную