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