Как исправить ошибку инкассации «Неверная цена (сумма)» при закрытии смены в Альфа-Авто 5 (касса АТОЛ)?

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

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

Выясним причину ошибки

Истинная причина подобного поведения кроется в особенностях работы драйверов АТОЛ (ошибка с кодом 16 или -3803/-3805). Драйверы контрольно-кассовой техники (ККТ) АТОЛ не поддерживают операцию выемки (инкассации) с нулевой суммой. Разработчики оборудования считают передачу значения «0» некорректной командой.

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

Рассмотрим ситуации, в которых сумма инкассации становится нулевой:

  1. За смену не было продаж за наличный расчет (все чеки были пробиты по банковской карте, эквайрингу или безналу). При этом кассир пытается закрыть смену, а наличных в денежном ящике для выемки попросту нет.
  2. В течение рабочей смены были проведены возвраты от покупателей наличными, которые полностью перекрыли сумму наличного прихода, сведя остаток в кассе к нулю.
  3. Возникло расхождение математики чека из-за особенностей округления в новых форматах фискальных данных (ФФД 1.2), где драйвер строго контролирует каждую копейку.

Проанализируем программный код

Если мы попытаемся отладить процесс, то столкнемся с вылетами платформы. Обратите внимание: ставить точку останова нужно не в компоненте лицензирования Рарус (иначе отладка завершится аварийно), а в форме обработки ТорговоеОборудование для оборудования АТОЛ.

Посмотрим на типичный проблемный кусок кода, который отвечает за формирование суммы выемки:


ПарольКассираЧека = ВходныеПараметры.GetValue(2,0);
Если (ТипЗнч(ТаблицаОплат)<>Тип("COMОбъект")) Тогда
    Возврат 22103;
КонецЕсли;

ТаблицаОплат.GetBounds(КолвоСтрок,КолвоСтолбцов);
Если (КолвоСтолбцов<>4) Тогда
    Возврат 22103;
КонецЕсли;

СуммаИнкассации = 0;
Попытка
    Для Сч = 0 По КолвоСтрок - 1 Цикл
        Если ТаблицаОплат.GetValue(Сч,0) = 0 Тогда // обрабатываем только наличные
            СуммаИнкассации = СуммаИнкассации + ТаблицаОплат.GetValue(Сч,2);
        КонецЕсли;
    КонецЦикла;
Исключение
    Возврат 22103;
КонецПопытки;

В этом коде метод ТаблицаОплат.GetValue(Сч,0) возвращает тип оплаты, где 0 означает наличные средства. Соответственно, ТаблицаОплат.GetValue(Сч,2) — это сумма оплаты. Если за смену не было наличных оплат, цикл отработает, но переменная СуммаИнкассации так и останется равной нулю. Именно этот ноль затем уходит в команду инкассации COM-объекта драйвера и вызывает критическую ошибку.

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

Чтобы навсегда избавиться от ошибки при закрытии смены, мы можем использовать несколько различных подходов, начиная от программных доработок и заканчивая настройками самого драйвера ККТ.

  1. Программный обход в коде 1С (Рекомендуется). Доработаем код обработки обслуживания ККТ в Конфигураторе. В блок, который мы рассматривали выше, необходимо добавить простое условие проверки итоговой суммы перед отправкой команды на оборудование. Если СуммаИнкассации равна нулю, то метод инкассации не должен вызываться вообще. Алгоритм должен просто пропустить этот шаг и перейти сразу к команде печати Z-отчета.
    
    Если СуммаИнкассации > 0 Тогда
        // Выполняем вызов команды инкассации драйвера
        ОбъектДрайвера.Инкассация(СуммаИнкассации);
    КонецЕсли;
    
  2. Отключение автоматической выемки. В параметрах торгового оборудования в самой 1С или в настройках драйвера АТОЛ (через сервисную утилиту «Тест драйвера ККТ») можно полностью отключить автоматическую инкассацию (обнуление наличности) при закрытии смены. Выемку можно будет делать отдельным документом ПКО или РКО только тогда, когда в кассе есть реальные наличные деньги.
  3. Аварийное закрытие смены (Временное решение). Если 1С постоянно выдает ошибку, а время кассовой смены подходит к критическим 24 часам (после чего фискальный накопитель заблокирует печать любых чеков), Z-отчет можно снять принудительно. Закройте 1С, откройте утилиту «Тест драйвера ККТ АТОЛ», установите галочку "Включено", перейдите в раздел "Отчеты" и снимите "Отчет о закрытии смены" напрямую, минуя товароучетную систему.

Проанализировав логику работы драйверов АТОЛ и внутренний код Альфа-Авто, мы видим, что проблема решается достаточно просто. Внедрение программной проверки на нулевую сумму или изменение логики работы с инкассацией позволит вам избежать остановки продаж в розничном магазине и сбережет нервы кассирам при вечернем закрытии смен.

← На главную