Многие пользователи конфигурации Альфа-Авто 5 на обычных формах при работе с фискальными регистраторами АТОЛ сталкиваются с неприятной ситуацией. При попытке закрыть кассовую смену процесс прерывается, и система выдает сообщение: «Ошибка при гашении фискальных регистраторов. Ошибка инкассации: Ошибка при выполнении Инкассации на ФРе ККТ FPrint... Неверная цена (сумма)». Кассовая смена остается незакрытой, что полностью парализует дальнейшую работу кассира. Разберем эту проблему по шагам и выясним причины ее возникновения.
Истинная причина подобного поведения кроется в особенностях работы драйверов АТОЛ (ошибка с кодом 16 или -3803/-3805). Драйверы контрольно-кассовой техники (ККТ) АТОЛ не поддерживают операцию выемки (инкассации) с нулевой суммой. Разработчики оборудования считают передачу значения «0» некорректной командой.
Конфигурация Альфа-Авто при автоматическом закрытии смены пытается провести инкассацию всей имеющейся наличности по данным учетной системы. Если сумма наличных к выемке оказывается равной нулю, система передает в драйвер ККТ сумму 0, и драйвер мгновенно блокирует операцию, прерывая весь процесс формирования Z-отчета.
Рассмотрим ситуации, в которых сумма инкассации становится нулевой:
Если мы попытаемся отладить процесс, то столкнемся с вылетами платформы. Обратите внимание: ставить точку останова нужно не в компоненте лицензирования Рарус (иначе отладка завершится аварийно), а в форме обработки ТорговоеОборудование для оборудования АТОЛ.
Посмотрим на типичный проблемный кусок кода, который отвечает за формирование суммы выемки:
ПарольКассираЧека = ВходныеПараметры.GetValue(2,0);
Если (ТипЗнч(ТаблицаОплат)<>Тип("COMОбъект")) Тогда
Возврат 22103;
КонецЕсли;
ТаблицаОплат.GetBounds(КолвоСтрок,КолвоСтолбцов);
Если (КолвоСтолбцов<>4) Тогда
Возврат 22103;
КонецЕсли;
СуммаИнкассации = 0;
Попытка
Для Сч = 0 По КолвоСтрок - 1 Цикл
Если ТаблицаОплат.GetValue(Сч,0) = 0 Тогда // обрабатываем только наличные
СуммаИнкассации = СуммаИнкассации + ТаблицаОплат.GetValue(Сч,2);
КонецЕсли;
КонецЦикла;
Исключение
Возврат 22103;
КонецПопытки;
В этом коде метод ТаблицаОплат.GetValue(Сч,0) возвращает тип оплаты, где 0 означает наличные средства. Соответственно, ТаблицаОплат.GetValue(Сч,2) — это сумма оплаты. Если за смену не было наличных оплат, цикл отработает, но переменная СуммаИнкассации так и останется равной нулю. Именно этот ноль затем уходит в команду инкассации COM-объекта драйвера и вызывает критическую ошибку.
Чтобы навсегда избавиться от ошибки при закрытии смены, мы можем использовать несколько различных подходов, начиная от программных доработок и заканчивая настройками самого драйвера ККТ.
СуммаИнкассации равна нулю, то метод инкассации не должен вызываться вообще. Алгоритм должен просто пропустить этот шаг и перейти сразу к команде печати Z-отчета.
Если СуммаИнкассации > 0 Тогда
// Выполняем вызов команды инкассации драйвера
ОбъектДрайвера.Инкассация(СуммаИнкассации);
КонецЕсли;
Проанализировав логику работы драйверов АТОЛ и внутренний код Альфа-Авто, мы видим, что проблема решается достаточно просто. Внедрение программной проверки на нулевую сумму или изменение логики работы с инкассацией позволит вам избежать остановки продаж в розничном магазине и сбережет нервы кассирам при вечернем закрытии смен.