В процессе торговой деятельности розничные магазины часто сталкиваются с аппаратными сбоями при печати чеков. Одной из наиболее запутанных проблем является внезапный отказ ККТ печатать чек при наличии ручной или автоматической скидки. На экране пользователя в 1С при этом возникает пугающее сообщение: ResultCode = -4048 ResultDescription = "Ошибка реквизита: Неизвестная ошибка ФН".
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем лог работы драйвера ККТ и рассмотрим три эффективных способа решения проблемы, включая как быструю настройку без изменения кода, так и профессиональную доработку системы.
---
Давайте вместе посмотрим на лог драйвера ККТ, который предоставлен в исходном обращении, и детально проанализируем последовательность команд:
16.05.2018 14:14:44.918 0000000000 Driver.Set_Quantity 1
16.05.2018 14:14:44.918 0000000000 Driver.Set_Price 490
16.05.2018 14:14:44.918 0000000000 Driver.Set_Department 1
16.05.2018 14:14:44.918 0000000000 Driver.Set_DiscountValue 24,5
16.05.2018 14:14:44.918 0000000000 Driver.Set_TaxTypeNumber 4
16.05.2018 14:14:44.918 0000000000 Driver.EndItem
Мы видим, что учетная система (в данном случае 1С:Управление торговлей 11) пытается зарегистрировать товарную позицию со следующими параметрами:
Quantity) — 1 шт.Price) — 490 рублей.DiscountValue) — 24,5 рубля.TaxTypeNumber) — тип 4.Математически итоговая стоимость позиции должна составить 465,5 рублей (490 - 24,5). Однако сразу после отправки пакета закрытия позиции Driver.EndItem фискальный накопитель (ФН) отвергает операцию:
16.05.2018 14:14:45.887 0000000969 AsyncResult: STATUS_AsyncError
16.05.2018 14:14:45.887 0000000000 Received async err answer: 55 EE 00
...
16.05.2018 14:14:47.143 0000002219 Ошибка! ResultCode = -4048 ResultDescription = "Ошибка реквизита: Неизвестная ошибка ФН"
После получения этой критической ошибки драйвер вынужден отменить формирование чека командой Driver.CancelCheck.
---
Почему же ФН выдает ошибку на корректную, казалось бы, скидку? Причина кроется в переходе на формат фискальных данных ФФД 1.05 и выше.
В соответствии с требованиями ФФД 1.05 математический подсчет скидок внутри самой кассы больше не поддерживается. Кассовое программное обеспечение (в нашем случае 1С) обязано передавать в кассовый аппарат позицию с ценой, в которую скидка уже заложена (то есть конечную цену со скидкой). Сама скидка на ККТ может выводиться исключительно в информационных целях в виде текстовой строки для покупателя.
Когда мы используем устаревший драйвер (в логе фигурирует ДТО АТОЛ версии 8.16), он пытается отправить прямую команду регистрации скидки Driver.Set_DiscountValue 24.5. Современная прошивка кассового аппарата блокирует это действие. На уровне протокола ККТ возвращает код ошибки 0x0109 (или расширенный код E165-265), что означает: «При передаче скидки для печати запрещена регистрация скидки».
Так как старый драйвер АТОЛ 8.16 не умеет корректно расшифровывать новые коды ошибок ФФД 1.05, он выдает общую ошибку нижнего уровня EEh, транслируя её пользователю как "Неизвестная ошибка ФН".
---
Рассмотрим по шагам три альтернативных метода устранения данной неисправности, от простых организационных мер до программных изменений.
Самый надежный и правильный путь — обновить драйвер АТОЛ. Переход на ДТО 9.х или, что еще лучше, на современный ДТО 10.х полностью решает эту проблему.
Выполним следующие действия:
Если на рабочем месте установлена старая операционная система (например, Windows XP) и обновить драйвер до 10-й версии физически невозможно, можно решить проблему силами настроек 1С.
Для этого выполним регулировку параметров ФЛК (форматно-логического контроля):
После этого 1С перестанет передавать скидку отдельным реквизитом, а сразу отправит в кассу конечные рассчитанные цены. Чек со скидкой начнет пробиваться без ошибок даже на 8-м драйвере.
Если вы используете сильно измененную (нетиповую) конфигурацию, где обновление драйверов или типовых настроек затруднено, проблему можно решить на уровне кода 1С. Нам необходимо принудительно исключить передачу параметров скидки в XML-пакет, отправляемый на фискализацию.
Рассмотрим пример программного изменения структуры чека в общем модуле, отвечающем за интеграцию с ККТ (обычно это функция ПолучитьXMLПакетДляФискализацииЧека или аналогичная):
// Пример модификации структуры позиции чека перед отправкой на ККТ
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
// Рассчитываем конечную цену со скидкой на стороне 1С
ЦенаСоСкидкой = СтрокаТовара.Сумма / СтрокаТовара.Количество;
// Передаем в ККТ цену, в которую скидка уже включена
СтрокаТовара.Цена = ЦенаСоСкидкой;
// Принудительно обнуляем сумму скидки для ФС, чтобы избежать ошибки реквизита
СтрокаТовара.СуммаСкидки = 0;
СтрокаТовара.ПроцентСкидки = 0;
КонецЦикла;
При таком подходе кассовый аппарат получит "чистый" товар с ценой 465,5 рублей за единицу, не пытаясь зарегистрировать скидку как отдельную операцию. Фискальный накопитель примет этот пакет без каких-либо ошибок и успешно напечатает чек.
---
Мы выяснили, что ошибка реквизита ФН при скидках — это следствие несовместимости старых алгоритмов ДТО 8.16 с требованиями формата ФФД 1.05. Рекомендуемым решением является переход на драйверы 10-го семейства. В качестве временной альтернативы вы можете использовать перенастройку правил форматно-логического контроля в 1С или простую доработку кода формирования чека.