Пожалуй, можно. В обоих случаях провоцируется ошибка.
Но в lua два недостатка будет:
1. На экране кассира отобразить пользовательский текст ошибки невозможно (из-за ограниченной интеграции lua с УКМ);
2. если добить товар в чек и попытаться пробить его уже с товаром, то выругается ФР, (тестировалось на СП101ФР-К) всё равно будет аннулированный чек, вслед за котором будет пробит нормально завершённый.
Вот метод lua. В функции print_receipt_footer скрипта receipt.lua вместо фрагмента:
Код:
if __footer.result == ukm.footer.normal then
text = text .. ukm.center("СПАСИБО ЗА ПОКУПКУ!",width," ") .. "\n" .. "\n";
local receipt_type = __footer.receipt.header:receipt_type();
last_receipt_is_non_fiscal = (receipt_type == ukm.header.nonfiscal) and __footer.result == ukm.footer.normal
and __footer.receipt.type ~= ukm.core.copy and __footer.receipt.type ~= ukm.core.duplicate_ and __footer.receipt.type ~= ukm.core.restore_
and __footer.receipt.type ~= ukm.core.goods_receipt;
elseif __footer.result == ukm.footer.cancel then
Вставить фрагмент:
Код:
if __footer.result == ukm.footer.normal then
if __footer.receipt.subtotal.itemscount == 0 then
ukm.debug("Чек без товарных позиций должен быть аннулирован!");
local errr=ukm.currency("raiseerror");
else
text = text .. ukm.center("СПАСИБО ЗА ПОКУПКУ!",width," ") .. "\n" .. "\n";
local receipt_type = __footer.receipt.header:receipt_type();
last_receipt_is_non_fiscal = (receipt_type == ukm.header.nonfiscal) and __footer.result == ukm.footer.normal
and __footer.receipt.type ~= ukm.core.copy and __footer.receipt.type ~= ukm.core.duplicate_ and __footer.receipt.type ~= ukm.core.restore_
and __footer.receipt.type ~= ukm.core.goods_receipt;
end;
elseif __footer.result == ukm.footer.cancel then
ukm.debug позволит нам хоть по логам кассы понять, что произошло.
Вот метод триггера. Подключиться к БД ukmclient на кассе, выполнить запрос:
[ НЕЛЬЗЯ ТАК ДЕЛАТЬ ]
Плохой метод: мы предотвращаем таким образом запись в таблицу trm_out_receipt_footer, но не предотвращаем записи в другие таблицы (скидочные, например), поэтому при повторной попытке закрыть чек с нулевым товаром выскочит уже другая ошибка и ukmclient перезапустится.. А в БД будет некорректное состояние. Если уж делать триггер - то по уму, убирая записи в других таблицах, а это непросто: 1) надо понимать, в каких и 2) для каждой новой версии УКМ они могут меняться.. Короче, нельзя так делать.
Чек же на нулевую сумму вполне может быть пробит (скидка 100%), галкой "Запретить продажу товаров с нулевой ценой" в "Параметрах" -> "Параметрах" запрещается закрытие товарной позиции с нулевой ценой.