Как сделать возврат чека продажи в 1С через драйвер Штрих-М DrvFR.dll?

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

При программной работе с фискальными регистраторами Штрих-М через низкоуровневый COM-объект библиотеки DrvFR.dll разработчики нередко сталкиваются с ситуацией, когда печать чека продажи проходит успешно, а операция возврата чека продажи завершается ошибкой «Команда не поддерживается в данном режиме» или драйвер сообщает о невозможности выполнения операции. Разберем по шагам, почему возникает эта проблема и как правильно реализовать операцию возврата из кода 1С.

Причины возникновения ошибки при возврате чека

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

  1. Конфликт методов и последовательности команд. Распространенная ошибка заключается в одновременном использовании двух разных механизмов: явного открытия чека возврата через метод OpenCheck() со свойством CheckType = 2 и последующей попытки зарегистрировать позицию устаревшим методом ReturnSale(). В такой ситуации касса уже находится в подрежиме открытого чека возврата, и повторная команда начала операции вызывает ошибку подрежима.
  2. Изменение протоколов в кассах с фискальным накопителем (54-ФЗ). В современных онлайн-ККТ старый стек команд прямой фискализации (включая ReturnSale) аппаратно заблокирован или ограничен прошивкой. Фискализация позиций возврата в онлайн-кассах выполняется по протоколу фискального накопителя.
  3. Недостаточный уровень прав или неверный пароль. По умолчанию в таблицах настроек фискального регистратора операция возврата может быть закрыта для пароля обычного кассира и требовать системный пароль администратора (обычно 30).
  4. Контроль наличности в денежном ящике. При возврате наличными касса проверяет наличие денег в смене. Если с момента открытия смены продаж не было и внесение наличных не выполнялось, ККТ заблокирует возврат из-за нехватки средств.

Решение 1: Правильное использование свойства CheckType

Рассмотрим корректную последовательность низкоуровневых вызовов драйвера. Если чек открывается универсальным методом OpenCheck(), тип операции определяется значением свойства CheckType (для продажи используется 0, для возврата продажи — 2).

Посмотрим на пример установки типа документа и открытия чека:


Если ЭтоВозврат Тогда
    ОбъектДрайвер.CheckType = 2; // Чек возврата продажи
Иначе
    ОбъектДрайвер.CheckType = 0; // Чек продажи
КонецЕсли;

ОбъектДрайвер.Password = 30;
ОбъектДрайвер.OpenCheck();

После открытия чека позиции регистрируются стандартными методами добавления строк (с передачей цены, количества и наименования), а завершается процедура вызовом метода закрытия чека с передачей типа и суммы оплаты.

Решение 2: Корректное использование метода ReturnSale

Если в коде конфигурации используется отдельный специализированный метод ReturnSale(), выясним особенности его вызова. Данный метод предназначен для прямой фискализации операции возврата без предварительного вызова OpenCheck() с типом возврата. Обратите внимание на обязательные свойства объекта перед вызовом команды:


Процедура ВозвратПродажи(НомерПоз, Цена, Количество, Название) Экспорт
    ФискальныйРегистраторОбъект.Password = 30;
    ФискальныйРегистраторОбъект.Quantity = Количество;
    ФискальныйРегистраторОбъект.Price = Цена;
    ФискальныйРегистраторОбъект.StringForPrinting = Строка(НомерПоз) + ". " + Название;
    
    // Вызов метода регистрации возврата продажи
    ФискальныйРегистраторОбъект.ReturnSale();
    
    ОтветДрайвера();
КонецПроцедуры

Важно помнить, что метод ReturnSale() регистрирует позицию возврата. После регистрации всех позиций необходимо вызвать процедуру закрытия чека (например, CloseCheck()) с указанием типа оплаты.

Диагностика в «Тесте драйвера»

Чтобы исключить аппаратные блокировки кассового аппарата и проверить права доступа, выполним проверку через утилиту «Тест драйвера ККТ»:

  1. Откроем утилиту «Тест драйвера» и установим связь с ККТ.
  2. Если касса работает в режиме онлайн (с фискальным накопителем), перейдем в раздел «ФН чеки» / «Операции ФН», выберем признак расчета «Возврат прихода» и попробуем провести тестовую операцию.
  3. Если используется классическая вкладка «Регистрация», проверим поле пароля (укажем 30) и нажмем кнопку «Возврат продажи».
  4. При возникновении ошибки проверим сумму наличности в кассе (вкладка «Отчеты без гашения» / «Денежный регистр»). При необходимости выполним операцию «Внесение» на требуемую сумму.

Альтернативный вариант: переход на библиотеку DrFR1C.dll (стандарт БПО)

Прямое управление через низкоуровневую библиотеку DrvFR.dll требует ручного контроля всех фискальных реквизитов (теги ФФД 1.05/1.2, ставки НДС, признаки предмета и способа расчета). Рекомендуется перейти на использование компоненты DrFR1C.dll или типовой механизм «Библиотеки подключаемого оборудования» (БПО).

При работе через стандартный интерфейс БПО 1С формирует унифицированный XML-пакет операции (ProcessCheck), где для возврата указывается тип операции ВозвратПрихода. Драйвер самостоятельно определяет правильную последовательность внутренних команд ФН и исключает ошибки несовместимости версий.

← На главную