При переходе на требования закона 54-ФЗ и форматы фискальных данных (ФФД 1.05, 1.1 и 1.2) многие пользователи и администраторы кассовых узлов под управлением конфигурации «Штрих-М: Кассир» версий 1.х и 2.х на платформе 1С 7.7 столкнулись с систематическими сбоями при печати фискальных чеков со скидками. Кассовый аппарат либо блокирует операцию с ошибкой несовпадения итоговой суммы, либо выдает ошибку превышения скидки над суммой позиции.
В этой статье мы подробно разберем, почему возникает данная проблема, как устроена математика чека по новым требованиям ФФД, почему изменение параметров в таблицах фискального регистратора не всегда спасает ситуацию и какие существуют практические пути решения проблемы.
---
Давайте проанализируем фундаментальные изменения в кассовом законодательстве, из-за которых старые алгоритмы расчета скидок перестали работать:
Количество × Цена = СтоимостьПозиции. Сумма всех строк позиций с учетом скидок обязана до копейки равняться итогу чека и сумме всех видов оплат.Режим исчисления скидок:
2 является обязательным требованием стандарта.0 на прошивках с ФФД 1.05+, касса вернет ошибку недопустимого режима работы или продолжит отвергать чеки с некорректно распределенными строками.---
Давайте выясним, почему проблему со скидками сложно исправить стандартными средствами конфигуратора 1С 7.7.
В линейках «Штрих-М: Кассир» версий 1.х и 2.х разработчики вынесли ключевые алгоритмы расчета чека, взаимодействия с оборудованием и вызова методов DrvFR.dll в закрытые скомпилированные библиотеки (компоненты PosEngine.dll, SMKassir.dll). В программном коде 1С 7.7 формируется только высокоуровневый список товаров, после чего управление передается во внешнюю компоненту, которая выполняет вызовы фискального регистратора по собственным зашитым алгоритмам.
Поскольку поддержка версий кассового ПО для 1С 7.7 производителем полностью прекращена, официальных обновлений с корректной математикой распределения копеек под ФФД 1.05/1.2 для этих конфигураций больше не выпускается.
---
Рассмотрим все доступные на практике способы преодоления данной ошибки — от организационных настроек до модификации логики работы кассового узла.
Самый быстрый и надежный способ избежать сбоев кассы без перепрограммирования закрытых библиотек — исключить возникновение дробных копеек при регистрации позиций:
---
Если в используемой редакции конфигурации часть логики расчета скидок доступна в модулях документов или глобальном модуле до передачи данных во внешнюю DLL, применим алгоритм пропорционального распределения с остатком на позицию с максимальной стоимостью.
Разберем пример реализации такого алгоритма на встроенном языке 1С 7.7:
// Процедура корректного распределения скидки по позициям чека
Процедура РаспределитьСкидкуНаЧек(СуммаСкидкиВсего)
Перем ВсегоСуммаБезСкидки, НакопленнаяСкидка, НомерСтрокиМакс, МаксСуммаСтроки;
Перем КолвоСтрок, ТекСкидка, ТекСумма;
ВсегоСуммаБезСкидки = 0;
МаксСуммаСтроки = 0;
НомерСтрокиМакс = 1;
КолвоСтрок = КоличествоСтрок();
// Шаг 1. Вычисляем общую сумму чека и находим позицию с максимальной суммой
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
ТекСумма = Окр(Количество * Цена, 2, 1);
ВсегоСуммаБезСкидки = ВсегоСуммаБезСкидки + ТекСумма;
Если ТекСумма > МаксСуммаСтроки Тогда
МаксСуммаСтроки = ТекСумма;
НомерСтрокиМакс = НомерСтроки;
КонецЕсли;
КонецЦикла;
Если ВсегоСуммаБезСкидки = 0 Тогда
Возврат;
КонецЕсли;
// Шаг 2. Пропорционально распределяем скидку по строкам чека
НакопленнаяСкидка = 0;
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
ТекСумма = Окр(Количество * Цена, 2, 1);
// Вычисляем скидку на строку с округлением до копеек
ТекСкидка = Окр((ТекСумма / ВсегоСуммаБезСкидки) * СуммаСкидкиВсего, 2, 1);
Скидка = ТекСкидка;
Сумма = ТекСумма - ТекСкидка;
НакопленнаяСкидка = НакопленнаяСкидка + ТекСкидка;
КонецЦикла;
// Шаг 3. Корректируем копеечную погрешность на строке с наибольшей стоимостью
Если НакопленнаяСкидка <> СуммаСкидкиВсего Тогда
Погрешность = СуммаСкидкиВсего - НакопленнаяСкидка;
ПолучитьСтрокуПоНомеру(НомерСтрокиМакс);
Скидка = Скидка + Погрешность;
Сумма = Сумма - Погрешность;
КонецЕсли;
КонецПроцедуры
Рассмотрим, как работает этот алгоритм:
---
Если изменить исходный код и поведение внутренних DLL невозможно, эффективным инженерным решением является использование промежуточных кассовых серверов (например, KKMServer или специализированных прокси-драйверов).
При таком подходе схема взаимодействия выглядит следующим образом:
Количество × Цена = Сумма.---
Платформа 1С 7.7 и конфигурация «Штрих-М: Кассир 1.х / 2.х» разрабатывались задолго до появления онлайн-касс, обязательной маркировки «Честный Знак», ФФД 1.2 и разрешительного режима продаж. Поддержание старых решений в рабочем состоянии требует постоянных доработок и сопряжено с рисками блокировки кассы в торговой точке.
Рекомендуемым долгосрочным решением является перевод кассового узла на современные специализированные решения (например, «Штрих-М: Кассир 5.х», «1С:Рабочее место кассира» или Frontol). При этом учетная система на базе 1С 7.7 может оставаться в качестве бэк-офиса, обмениваясь с кассой стандартными файлами выгрузки/загрузки товаров и продаж.