Почему в РМК 1С:УТ 11.5 не печатается последний слип-чек и как это исправить?

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

При оформлении продаж в рабочем месте кассира (РМК) конфигурации «1С:Управление торговлей 11.5» нередко возникает неприятная ситуация: оплата по карте успешно проходит, чек пробивается, однако при попытке вызвать штатную команду «Печать последнего слип-чека» система выдает предупреждение: «Слип-чек отсутствует. Возможно для данного сеанса еще не выполнялась эквайринговая операция». Разберем, почему возникает эта ошибка в типовом коде, какие нюансы работы с оборудованием влияют на хранение чека и как программно решить проблему через расширение конфигурации.

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

Проанализируем архитектуру работы подсистемы подключаемого оборудования (БПО) в РМК. Ошибка чаще всего кроется в одном из следующих факторов:

  1. Ошибка инициализации и проверки буфера в типовом релизе. В некоторых релизах УТ 11.5 обработчик команды формы РМК обращается к внутренним переменным формы или отправляет запрос к драйверу эквайринга, вместо того чтобы прочитать уже полученный и сохраненный в контексте сеанса текст чека. При этом сам текст слипа успешно возвращается терминалом при оплате и сохраняется в переменной общего клиентского модуля ОборудованиеПлатежныеСистемыКлиент, но форма его «не видит».
  2. Особенности настроек формирования чека. Если в параметрах торгового оборудования или розничных продаж включен режим короткого слип-чека (когда банковские реквизиты встраиваются прямо в тело фискального чека ККТ), отдельный буфер полного слипа может очищаться сразу после завершения печати документа.
  3. Печать чека силами самого POS-терминала. Если эквайринговый терминал настроен на автономную печать чеков собственным встроенным принтером, драйвер не передает полный текст слипа в «1С», соответственно, повторно напечатать его на фискальном регистраторе система не может.
  4. Ограничения интеграционного драйвера. Типовой алгоритм может пытаться запросить повторную печать аппаратным методом терминала. Если прошивка устройства или драйвер (например, определенные версии драйверов Сбербанка или INPAS) не поддерживают эту команду через внешнюю компоненту, операция завершается ошибкой.

Программное решение: переопределение команды через расширение

Выясним причину успешной работы альтернативного кода: в подсистеме подключаемого оборудования есть общий клиентский модуль ОборудованиеПлатежныеСистемыКлиент, содержащий функцию ПоследнийСлипЧек(). Данная функция возвращает строку с текстом последней эквайринговой операции, которая сохраняется в оперативной памяти сеанса 1С.

Чтобы обойти ошибку типовой логики формы, перехватим обработчик команды формы РМК в расширении и организуем прямую нефискальную печать сохраненного текста через чекопечатающее устройство.

Посмотрим на пример реализации обработчика в модуле формы РМК:


&НаКлиенте
Процедура реплНапечататьПоследнийСлипЧекЗавершение(РезультатВыполнения, Параметры) Экспорт
    
    ЭтотОбъект.Доступность = Истина;
    Если НЕ РезультатВыполнения.Результат Тогда  
        ЗаголовокИнформации = НСтр("ru = 'Печать последнего слип чека'");
        ОбщегоНазначенияКлиент.СообщитьПользователю(ЗаголовокИнформации);
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура реплНапечататьПоследнийСлипЧекПосле(Команда) 
    
    ОчиститьСообщения();
    
    Если Не ИспользоватьПодключаемоеОборудование Тогда
        ТекстЗаголовка = НСтр("ru = 'Слип-чек не может быть напечатан.'");
        ТекстСообщения = НСтр("ru = 'Подключаемое оборудование не используется.'");
        ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
        Возврат;
    КонецЕсли;
    
    ПоследнийСлипЧек = ОборудованиеПлатежныеСистемыКлиент.ПоследнийСлипЧек();
    Если Не ПустаяСтрока(ПоследнийСлипЧек) Тогда
        ЭтотОбъект.Доступность = Ложь;
        Оповещение = Новый ОписаниеОповещения("реплНапечататьПоследнийСлипЧекЗавершение", ЭтотОбъект);
        ПараметрыОперации = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПечатиТекста(ПоследнийСлипЧек);
        ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьПечатьТекста(
            Оповещение, УникальныйИдентификатор, , ПараметрыОперации);
    Иначе
        ТекстСообщения = НСтр("ru = 'Нет последнего слип-чека.'");
        ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
    КонецЕсли;
    
КонецПроцедуры

Разберем по шагам, как работает этот алгоритм:

  1. Проверяем флаг ИспользоватьПодключаемоеОборудование. Если работа с торговым оборудованием отключена, выводим соответствующее предупреждение.
  2. Напрямую запрашиваем сохраненный текст чека вызовом ОборудованиеПлатежныеСистемыКлиент.ПоследнийСлипЧек().
  3. Если строка не пуста, блокируем доступность элементов формы на время взаимодействия с принтером (ЭтотОбъект.Доступность = Ложь).
  4. Формируем структуру настроек вызовом ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПечатиТекста(ПоследнийСлипЧек).
  5. Асинхронно отправляем команду вывода произвольного текста на ККТ или принтер чеков методом ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьПечатьТекста(), передав созданное ОписаниеОповещения.
  6. В процедуре завершения реплНапечататьПоследнийСлипЧекЗавершение восстанавливаем доступность интерфейса кассира и информируем об ошибке, если печать не удалась.

Проверка настроек торгового оборудования

Прежде чем внедрять доработку или в дополнение к ней, проверим настройки подключаемого оборудования:

  1. В настройках параметров эквайрингового терминала в «1С» убедимся, что способ печати слип-чеков установлен на фискальный регистратор, а не на встроенный принтер терминала.
  2. В настройках РМК и правилах печати проверим, чтобы для эквайринговых операций был активен режим «Печатать отдельный полный слип-чек».
  3. Проверим версию установленного драйвера эквайринга в разделе подключаемого оборудования. При необходимости обновим интеграционную компоненту до актуальной версии из свежей БПО.

Важные ограничения механизма

Рассмотрим архитектурные особенности, о которых необходимо помнить при эксплуатации данного функционала:

  1. Хранение чека только в оперативной памяти сеанса. Переменная в модуле ОборудованиеПлатежныеСистемыКлиент существует исключительно в текущем запущенном клиенте «1С». Если кассир перезапустил программу, сменил пользователя или произошел сбой соединения, получить слип-чек через «1С» уже невозможно. Полный текст чека не сохраняется в базу данных.
  2. Глубина истории равна одной транзакции. Механизм хранит ровно один последний слип. Если после успешной оплаты кассир запустил повторную операцию, отмену или сверку итогов, буфер перезаписывается новыми данными.

Что делать кассиру, если через 1С напечатать слип не удается

Если чек в программе утерян, кассир может воспользоваться альтернативными вариантами:

  1. Печать дубликата с банковского терминала. Большинство моделей POS-терминалов позволяют напечатать копию последней транзакции через сервисное меню кассира (пункты «Повтор чека», «Печать последнего чека» или меню администратора).
  2. Данные фискального чека и ОФД. Если оплата зафиксирована на ККТ, основные банковские реквизиты (RRN-код, код авторизации, маска карты) уже попали в фискальный документ. Кассир может просмотреть реквизиты в личном кабинете ОФД или через утилиту фискального накопителя.
  3. Сверка итогов. Для подтверждения успешности транзакции можно снять краткий отчет или выполнить сверку итогов на самом терминале — операция выведет список прошедших оплат за текущую смену.
← На главную