В процессе эксплуатации контрольно-кассовой техники (ККТ) после плановой замены фискального накопителя (ФН) или обновления прошивки пользователи часто сталкиваются с ситуацией, когда касса внезапно перестает пробивать чеки. При этом на экран выводится сообщение об ошибке: «Недопустимое значение. Скидки не поддерживаются» (или аналогичное: «Ошибка реквизита: При передаче скидки для печати запрещена регистрация скидки»). Самое удивительное в этой ситуации то, что в самом документе «1С» никаких скидок и наценок не указано.
В данной статье мы подробно разберем, почему возникает эта ошибка, как новые требования законодательства (ФФД 1.05 и 1.2) влияют на работу ККТ, в каких модулях «1С» искать проблему и как решить ее раз и навсегда как организационными, так и программными методами.
Для начала проанализируем физику процесса. Ранее, при использовании старого формата фискальных данных (ФФД 1.0), драйвер кассы и сама ККТ позволяли передавать скидку отдельным параметром на уровне товарной строки или всего чека. Алгоритм внутри кассы самостоятельно производил математические расчеты, вычитал скидку из общей суммы и печатал корректный чек.
С переходом на современные форматы фискальных данных (ФФД 1.05 и ФФД 1.2) правила жестко изменились:
DiscountValue или DiscountSum) теперь запрещена на уровне протокола работы ККТ.Если учетная система пытается передать в кассу ненулевое значение скидки, современная прошивка ККТ или драйвер Атол мгновенно блокируют операцию и возвращают ошибку.
Выясним причину, почему касса «видит» скидку там, где ее нет. Это происходит из-за простого математического расхождения в строках документа «1С»:
Цена * Количество != Сумма
Рассмотрим стандартный сценарий:
Скидка = (Цена * Количество) - Сумма.Если вы столкнулись с этой проблемой, нам необходимо локализовать место в коде конфигурации, где формируются данные для отправки на ККТ. Рассмотрим этот процесс на примере конфигурации «1С:Управление торговлей 10.3»:
ЧекККМ сосредоточена в модуле объекта документа. Перейдем в процедуру ПровестиИРаспечататьЧек().ПечатьЧекаНаФР() (или ПечатьЧека).Если в коде обработки обслуживания вы обнаружите строки, передающие в свойства драйвера Атол параметры скидки, их необходимо скорректировать.
Разобравшись в причинах, рассмотрим несколько способов решения этой проблемы — от простых организационных до надежных программных алгоритмов.
Самое простое решение, не требующее вмешательства программиста — это жесткий контроль за вводом данных. Необходимо донести до пользователей следующее правило: категорически запрещено вручную редактировать колонку «Сумма» в документах!
Если требуется предоставить скидку или изменить стоимость:
Для проверки этого правила достаточно открыть проблемный документ, пересчитать каждую строку на калькуляторе (умножить количество на цену) и сравнить с суммой. Если есть расхождение — перевыберите цену или количество, чтобы математическое равенство восстановилось. После этого чек будет пробит без ошибок.
Чтобы исключить влияние человеческого фактора, мы можем программно скорректировать передаваемые в ККТ данные. Для этого в процедуре подготовки строки чека обработки обслуживания (или общего модуля интеграции с ККТ) необходимо принудительно пересчитывать цену, исходя из фактической суммы, и полностью обнулять передаваемую скидку.
Проанализируем пример кода, который решает эту задачу:
// Перед отправкой строки в драйвер ККТ пересчитываем цену по факту
ФактическаяСумма = СтрокаТаблицы.Сумма;
ФактическоеКоличество = СтрокаТаблицы.Количество;
Если ФактическоеКоличество > 0 Тогда
// Рассчитываем реальную цену с учетом всех ручных корректировок
НоваяЦена = Окр(ФактическаяСумма / ФактическоеКоличество, 2);
// Передаем в параметры ККТ скорректированную цену
ОбъектДрайвера.Цена = НоваяЦена;
ОбъектДрайвера.Сумма = ФактическаяСумма;
// Принудительно обнуляем скидки, чтобы драйвер не ругался
ОбъектДрайвера.Скидка = 0;
ОбъектДрайвера.ПроцентСкидки = 0;
КонецЕсли;
Этот простой костыль позволяет "обмануть" драйвер, передавая ему чистую цену без скидок, которая математически идеально сходится с итоговой суммой.
Иногда при делении суммы на количество возникает бесконечная дробь. Например, мы продаем 3 единицы товара на общую сумму 100 рублей.
Математически: 100 / 3 = 33.333333...
Если мы округлим цену до 2 знаков (33.33 руб.), то при умножении на 3 получим 99.99 руб. Возникает расхождение в 1 копейку. ККТ откажется принимать такую строку, так как 33.33 * 3 = 99.99, а мы передаем сумму 100.00.
Для решения этой проблемы применим алгоритм разбиения строки на две позиции. Посмотрим на пример реализации такого алгоритма в «1С»:
// Алгоритм разбиения строки чека при наличии остатка от округления
СуммаСтроки = СтрокаТаблицы.Сумма;
КоличествоСтроки = СтрокаТаблицы.Количество;
ЦенаОкругленная = Окр(СуммаСтроки / КоличествоСтроки, 2);
РасчетнаяСумма = ЦенаОкругленная * КоличествоСтроки;
Расхождение = СуммаСтроки - РасчетнаяСумма;
Если Расхождение = 0 Тогда
// Все сошлось идеально, регистрируем одну строку
РегистрироватьПозицию(СтрокаТаблицы.Номенклатура, КоличествоСтроки, ЦенаОкругленная, СуммаСтроки);
Иначе
// Есть расхождение в копейках. Разбиваем на две строки
// 1. Первая строка: количество минус 1 штука по округленной цене
КоличествоПервойСтроки = КоличествоСтроки - 1;
СуммаПервойСтроки = КоличествоПервойСтроки * ЦенаОкругленная;
Если КоличествоПервойСтроки > 0 Тогда
РегистрироватьПозицию(СтрокаТаблицы.Номенклатура, КоличествоПервойСтроки, ЦенаОкругленная, СуммаПервойСтроки);
КонецЕсли;
// 2. Вторая строка: ровно 1 штука по скорректированной цене (с учетом копейки расхождения)
ЦенаВторойСтроки = ЦенаОкругленная + Расхождение;
СуммаВторойСтроки = ЦенаВторойСтроки * 1;
РегистрироватьПозицию(СтрокаТаблицы.Номенклатура, 1, ЦенаВторойСтроки, СуммаВторойСтроки);
КонецЕсли;
При использовании этого алгоритма в ОФД уйдет чек, состоящий из двух строк (например: 2 шт. по цене 33.33 руб. и 1 шт. по цене 33.34 руб.). Сумма чека сойдется идеально до копейки, требования ФФД 1.05 не будут нарушены, а касса не вернет никаких ошибок.
Если ваша конфигурация «1С» позволяет выполнить обновление, наиболее правильным и долгосрочным решением будет уход от устаревших драйверов Атол 8-й или 9-й версии (DTO 8 / DTO 9) и переход на актуальный драйвер Атол 10-й версии (DTO 10) с одновременным обновлением Библиотеки подключаемого оборудования (БПО) в «1С».
Современные версии БПО от компании «1С» содержат встроенные, протестированные механизмы автоматического распределения скидок, расчета копеечных расхождений и корректного формирования XML-пакетов под любые требования ФФД (включая ФФД 1.2 для маркированных товаров). Переход на БПО полностью освобождает разработчика от необходимости писать собственные алгоритмы округления и разбиения строк.