При интеграции эквайринговых терминалов с 1С часто возникает ситуация, когда фискальные чеки, X- и Z-отчеты пробиваются без нареканий, но при попытке распечатать банковский слип-чек контрольно-кассовая техника (ККТ) намертво зависает. Касса перестает отвечать на команды из 1С, и восстановить ее работоспособность удается только полным выключением и повторным включением питания. Разберем детально, почему это происходит и какими способами можно устранить эту ошибку.
Проанализируем техническую сторону взаимодействия 1С, банковской библиотеки эквайринга и драйвера ККТ. Зависание при печати нефискального документа (слипа) обычно вызвано следующими факторами:
sbrfcom.dll) могут возвращать в теле чека спецсимволы разметки (управляющие байты с кодами меньше 32, последовательности вида ~S, Символ(1) и др.), предназначенные для встроенных принтеров самих терминалов. Драйвер ККТ или прошивка кассового аппарата при встрече неизвестного управляющего байта может выдать аппаратный сбой.Рассмотрим, как обработать текст слипа перед его передачей на фискальный регистратор. Первым делом исключим управляющие символы и разобьем текст на массив строк с контролем длины.
Посмотрим на пример функции очистки и подготовки строк слип-чека в 1С:
Функция ПодготовитьТекстСлипа(ИсходныйТекст, МаксШиринаСтроки = 32)
// Удаляем специфические символы разметки терминалов
ОбработанныйТекст = СтрЗаменить(ИсходныйТекст, Символ(1), "");
ОбработанныйТекст = СтрЗаменить(ОбработанныйТекст, "~S", "");
ОбработанныйТекст = СтрЗаменить(ОбработанныйТекст, Символ(12), ""); // Сброс страницы
// Фильтруем прочие непечатные служебные символы ASCII (кроме переноса строк)
Для КодСимвола = 0 По 31 Цикл
Если КодСимвола <> 10 И КодСимвола <> 13 Тогда
ОбработанныйТекст = СтрЗаменить(ОбработанныйТекст, Символ(КодСимвола), "");
КонецЕсли;
КонецЦикла;
МассивРезультат = Новый Массив;
КоличествоСтрок = СтрЧислоСтрок(ОбработанныйТекст);
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ТекущаяСтрока = СтрПолучитьСтроку(ОбработанныйТекст, НомерСтроки);
// Разбиваем слишком длинные строки по ширине ленты ККТ
Пока СтрДлина(ТекущаяСтрока) > МаксШиринаСтроки Цикл
МассивРезультат.Добавить(Лев(ТекущаяСтрока, МаксШиринаСтроки));
ТекущаяСтрока = Сред(ТекущаяСтрока, МаксШиринаСтроки + 1);
КонецЦикла;
МассивРезультат.Добавить(ТекущаяСтрока);
КонецЦикла;
Возврат МассивРезультат;
КонецФункции
Вместо отправки нефискального документа единым блоком переведем алгоритм на пошаговую построчную печать. Это исключает переполнение буфера устройства.
Разберем пример реализации вывода строк через прямой вызов драйвера или БПО:
Процедура НапечататьСлипПострочно(ОбъектДрайвера, ТекстСлипа)
МассивСтрок = ПодготовитьТекстСлипа(ТекстСлипа, 32);
Для Каждого Стр Из МассивСтрок Цикл
// Передаем строку в буфер печати драйвера
ОбъектДрайвера.StringForPrinting = Стр;
// Вызываем команду печати строки
Если ОбъектДрайвера.PrintString() <> 0 Тогда
// Обработка ошибки печати при необходимости
Прервать;
КонецЕсли;
КонецЦикла;
// Завершаем документ протяжкой ленты и отрезкой
ОбъектДрайвера.FeedDocument();
ОбъектДрайвера.CutCheck();
КонецПроцедуры
Если онлайн-касса подключена по USB в режиме эмуляции COM-порта, стабильность работы с буфером зависит от задержек виртуального порта в операционной системе Windows. Выполним настройку по шагам:
115200 бод как в свойствах порта, так и в таблицах ККТ через утилиту «Тест драйвера ККТ».В ранних версиях драйверов 4.13.x обработка нефискальных документов содержала ошибки буферизации. Рекомендуется:
Если банковский терминал оборудован собственным встроенным принтером (например, автономные модели Ingenico или Verifone), самым надежным способом разгрузить ККТ является переключение печати слипов на сам пин-пад.
В файле настроек банковского ПО pinpad.ini можно отключить передачу текста слипа в 1С или выставить параметр ширины строки LineLength, соответствующий физической ширине используемой кассовой ленты.