При программной работе с фискальными регистраторами Штрих-М через низкоуровневый COM-объект библиотеки DrvFR.dll разработчики нередко сталкиваются с ситуацией, когда печать чека продажи проходит успешно, а операция возврата чека продажи завершается ошибкой «Команда не поддерживается в данном режиме» или драйвер сообщает о невозможности выполнения операции. Разберем по шагам, почему возникает эта проблема и как правильно реализовать операцию возврата из кода 1С.
Проанализируем основные факторы, которые приводят к отказу оборудования при попытке пробить чек возврата:
OpenCheck() со свойством CheckType = 2 и последующей попытки зарегистрировать позицию устаревшим методом ReturnSale(). В такой ситуации касса уже находится в подрежиме открытого чека возврата, и повторная команда начала операции вызывает ошибку подрежима.ReturnSale) аппаратно заблокирован или ограничен прошивкой. Фискализация позиций возврата в онлайн-кассах выполняется по протоколу фискального накопителя.30).Рассмотрим корректную последовательность низкоуровневых вызовов драйвера. Если чек открывается универсальным методом OpenCheck(), тип операции определяется значением свойства CheckType (для продажи используется 0, для возврата продажи — 2).
Посмотрим на пример установки типа документа и открытия чека:
Если ЭтоВозврат Тогда
ОбъектДрайвер.CheckType = 2; // Чек возврата продажи
Иначе
ОбъектДрайвер.CheckType = 0; // Чек продажи
КонецЕсли;
ОбъектДрайвер.Password = 30;
ОбъектДрайвер.OpenCheck();
После открытия чека позиции регистрируются стандартными методами добавления строк (с передачей цены, количества и наименования), а завершается процедура вызовом метода закрытия чека с передачей типа и суммы оплаты.
Если в коде конфигурации используется отдельный специализированный метод ReturnSale(), выясним особенности его вызова. Данный метод предназначен для прямой фискализации операции возврата без предварительного вызова OpenCheck() с типом возврата. Обратите внимание на обязательные свойства объекта перед вызовом команды:
Процедура ВозвратПродажи(НомерПоз, Цена, Количество, Название) Экспорт
ФискальныйРегистраторОбъект.Password = 30;
ФискальныйРегистраторОбъект.Quantity = Количество;
ФискальныйРегистраторОбъект.Price = Цена;
ФискальныйРегистраторОбъект.StringForPrinting = Строка(НомерПоз) + ". " + Название;
// Вызов метода регистрации возврата продажи
ФискальныйРегистраторОбъект.ReturnSale();
ОтветДрайвера();
КонецПроцедуры
Важно помнить, что метод ReturnSale() регистрирует позицию возврата. После регистрации всех позиций необходимо вызвать процедуру закрытия чека (например, CloseCheck()) с указанием типа оплаты.
Чтобы исключить аппаратные блокировки кассового аппарата и проверить права доступа, выполним проверку через утилиту «Тест драйвера ККТ»:
30) и нажмем кнопку «Возврат продажи».Прямое управление через низкоуровневую библиотеку DrvFR.dll требует ручного контроля всех фискальных реквизитов (теги ФФД 1.05/1.2, ставки НДС, признаки предмета и способа расчета). Рекомендуется перейти на использование компоненты DrFR1C.dll или типовой механизм «Библиотеки подключаемого оборудования» (БПО).
При работе через стандартный интерфейс БПО 1С формирует унифицированный XML-пакет операции (ProcessCheck), где для возврата указывается тип операции ВозвратПрихода. Драйвер самостоятельно определяет правильную последовательность внутренних команд ФН и исключает ошибки несовместимости версий.