Почему ККТ Атол выдает ошибку «Недопустимое значение. Скидки не поддерживаются» в 1С и как это исправить?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе эксплуатации контрольно-кассовой техники (ККТ) после плановой замены фискального накопителя (ФН) или обновления прошивки пользователи часто сталкиваются с ситуацией, когда касса внезапно перестает пробивать чеки. При этом на экран выводится сообщение об ошибке: «Недопустимое значение. Скидки не поддерживаются» (или аналогичное: «Ошибка реквизита: При передаче скидки для печати запрещена регистрация скидки»). Самое удивительное в этой ситуации то, что в самом документе «1С» никаких скидок и наценок не указано.

В данной статье мы подробно разберем, почему возникает эта ошибка, как новые требования законодательства (ФФД 1.05 и 1.2) влияют на работу ККТ, в каких модулях «1С» искать проблему и как решить ее раз и навсегда как организационными, так и программными методами.

Почему возникает ошибка: теория и требования ФФД 1.05

Для начала проанализируем физику процесса. Ранее, при использовании старого формата фискальных данных (ФФД 1.0), драйвер кассы и сама ККТ позволяли передавать скидку отдельным параметром на уровне товарной строки или всего чека. Алгоритм внутри кассы самостоятельно производил математические расчеты, вычитал скидку из общей суммы и печатал корректный чек.

С переходом на современные форматы фискальных данных (ФФД 1.05 и ФФД 1.2) правила жестко изменились:

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

Скрытые скидки: почему ошибка возникает при отсутствии явных скидок?

Выясним причину, почему касса «видит» скидку там, где ее нет. Это происходит из-за простого математического расхождения в строках документа «1С»:

Цена * Количество != Сумма

Рассмотрим стандартный сценарий:

  1. Оператор или менеджер вручную скорректировал итоговую сумму в строке табличной части документа (например, округлил копейки до целого рубля или подогнал итоговую сумму под бюджет покупателя). При этом цена и количество остались неизменными.
  2. Старые типовые механизмы «1С» (особенно в конфигурациях на обычных формах, таких как «Управление торговлей 10.3», «УПП 1.3» или «Розница 1.0») при формировании XML-пакета для ККТ видят расхождение между произведением цены на количество и итоговой суммой строки.
  3. Программа автоматически рассчитывает эту разницу как скрытую (неявную) скидку по формуле:
    Скидка = (Цена * Количество) - Сумма.
  4. Эта расчетная «скидка» передается в драйвер ККТ. Поскольку касса работает по ФФД 1.05, драйвер отвергает документ с ошибкой недопустимого значения скидки.

Где в коде «1С» происходит проверка и передача данных?

Если вы столкнулись с этой проблемой, нам необходимо локализовать место в коде конфигурации, где формируются данные для отправки на ККТ. Рассмотрим этот процесс на примере конфигурации «1С:Управление торговлей 10.3»:

  1. Основная логика печати чека из документа ЧекККМ сосредоточена в модуле объекта документа. Перейдем в процедуру ПровестиИРаспечататьЧек().
  2. Далее управление передается в общий модуль или в обработку обслуживания ККТ, где вызывается процедура ПечатьЧекаНаФР() (или ПечатьЧека).
  3. Именно внутри обработки обслуживания происходит обход строк табличной части документа и заполнение структуры для драйвера. Там рассчитываются параметры строки чека.

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

Варианты решения проблемы

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

Способ 1. Организационный (быстрое решение на стороне пользователя)

Самое простое решение, не требующее вмешательства программиста — это жесткий контроль за вводом данных. Необходимо донести до пользователей следующее правило: категорически запрещено вручную редактировать колонку «Сумма» в документах!

Если требуется предоставить скидку или изменить стоимость:

Для проверки этого правила достаточно открыть проблемный документ, пересчитать каждую строку на калькуляторе (умножить количество на цену) и сравнить с суммой. Если есть расхождение — перевыберите цену или количество, чтобы математическое равенство восстановилось. После этого чек будет пробит без ошибок.

Способ 2. Программный пересчет цены в модуле «1С»

Чтобы исключить влияние человеческого фактора, мы можем программно скорректировать передаваемые в ККТ данные. Для этого в процедуре подготовки строки чека обработки обслуживания (или общего модуля интеграции с ККТ) необходимо принудительно пересчитывать цену, исходя из фактической суммы, и полностью обнулять передаваемую скидку.

Проанализируем пример кода, который решает эту задачу:


// Перед отправкой строки в драйвер ККТ пересчитываем цену по факту
ФактическаяСумма = СтрокаТаблицы.Сумма;
ФактическоеКоличество = СтрокаТаблицы.Количество;

Если ФактическоеКоличество > 0 Тогда
    // Рассчитываем реальную цену с учетом всех ручных корректировок
    НоваяЦена = Окр(ФактическаяСумма / ФактическоеКоличество, 2);
    
    // Передаем в параметры ККТ скорректированную цену
    ОбъектДрайвера.Цена = НоваяЦена;
    ОбъектДрайвера.Сумма = ФактическаяСумма;
    
    // Принудительно обнуляем скидки, чтобы драйвер не ругался
    ОбъектДрайвера.Скидка = 0;
    ОбъектДрайвера.ПроцентСкидки = 0;
КонецЕсли;

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

Способ 3. Решение проблемы «копеечного расхождения» (разбиение строк)

Иногда при делении суммы на количество возникает бесконечная дробь. Например, мы продаем 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 не будут нарушены, а касса не вернет никаких ошибок.

Способ 4. Переход на ДТО 10 и современную БПО

Если ваша конфигурация «1С» позволяет выполнить обновление, наиболее правильным и долгосрочным решением будет уход от устаревших драйверов Атол 8-й или 9-й версии (DTO 8 / DTO 9) и переход на актуальный драйвер Атол 10-й версии (DTO 10) с одновременным обновлением Библиотеки подключаемого оборудования (БПО) в «1С».

Современные версии БПО от компании «1С» содержат встроенные, протестированные механизмы автоматического распределения скидок, расчета копеечных расхождений и корректного формирования XML-пакетов под любые требования ФФД (включая ФФД 1.2 для маркированных товаров). Переход на БПО полностью освобождает разработчика от необходимости писать собственные алгоритмы округления и разбиения строк.

← На главную