Почему онлайн-касса Штрих-М зависает при печати банковских слипов и как это исправить?

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

При интеграции эквайринговых терминалов с 1С часто возникает ситуация, когда фискальные чеки, X- и Z-отчеты пробиваются без нареканий, но при попытке распечатать банковский слип-чек контрольно-кассовая техника (ККТ) намертво зависает. Касса перестает отвечать на команды из 1С, и восстановить ее работоспособность удается только полным выключением и повторным включением питания. Разберем детально, почему это происходит и какими способами можно устранить эту ошибку.

Причины зависания кассы при печати нефискального текста

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

  1. Переполнение входного буфера ККТ. При передаче длинного нефискального текста единым пакетом (одной строкой или единым вызовом метода печати документа) данные поступают в порт быстрее, чем печатающий механизм успевает наносить символы на термоленту. Если в прошивке или драйвере нарушен контроль переполнения буфера, микроконтроллер кассы уходит в циклическую блокировку.
  2. Служебные и непечатные символы в ответе банка. Библиотеки банковского эквайринга (например, sbrfcom.dll) могут возвращать в теле чека спецсимволы разметки (управляющие байты с кодами меньше 32, последовательности вида ~S, Символ(1) и др.), предназначенные для встроенных принтеров самих терминалов. Драйвер ККТ или прошивка кассового аппарата при встрече неизвестного управляющего байта может выдать аппаратный сбой.
  3. Превышение максимальной ширины строки. Если банковский модуль формирует строку шире, чем поддерживаемое количество символов на чековой ленте (например, 40 символов при допустимой ширине шрифта 32), автоматический перенос строк на некоторых версиях драйверов вызывает ошибку обработки буфера.
  4. Отсутствие контроля состояния устройства перед печатью. Если отправка строк слипа начинается до того, как ККТ завершила предыдущую операцию (протяжку, отрезку или закрытие чека), возникает конфликт протокола обмена.

Способ 1. Очистка непечатных символов и нормализация текста слипа

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

Посмотрим на пример функции очистки и подготовки строк слип-чека в 1С:


Функция ПодготовитьТекстСлипа(ИсходныйТекст, МаксШиринаСтроки = 32)
    
    // Удаляем специфические символы разметки терминалов
    ОбработанныйТекст = СтрЗаменить(ИсходныйТекст, Символ(1), "");
    ОбработанныйТекст = СтрЗаменить(ОбработанныйТекст, "~S", "");
    ОбработанныйТекст = СтрЗаменить(ОбработанныйТекст, Символ(12), ""); // Сброс страницы
    
    // Фильтруем прочие непечатные служебные символы ASCII (кроме переноса строк)
    Для КодСимвола = 0 По 31 Цикл
        Если КодСимвола <> 10 И КодСимвола <> 13 Тогда
            ОбработанныйТекст = СтрЗаменить(ОбработанныйТекст, Символ(КодСимвола), "");
        КонецЕсли;
    КонецЦикла;
    
    МассивРезультат = Новый Массив;
    КоличествоСтрок = СтрЧислоСтрок(ОбработанныйТекст);
    
    Для НомерСтроки = 1 По КоличествоСтрок Цикл
        ТекущаяСтрока = СтрПолучитьСтроку(ОбработанныйТекст, НомерСтроки);
        
        // Разбиваем слишком длинные строки по ширине ленты ККТ
        Пока СтрДлина(ТекущаяСтрока) > МаксШиринаСтроки Цикл
            МассивРезультат.Добавить(Лев(ТекущаяСтрока, МаксШиринаСтроки));
            ТекущаяСтрока = Сред(ТекущаяСтрока, МаксШиринаСтроки + 1);
        КонецЦикла;
        
        МассивРезультат.Добавить(ТекущаяСтрока);
    КонецЦикла;
    
    Возврат МассивРезультат;

КонецФункции

Способ 2. Построчная печать с контролем состояния ККТ

Вместо отправки нефискального документа единым блоком переведем алгоритм на пошаговую построчную печать. Это исключает переполнение буфера устройства.

Разберем пример реализации вывода строк через прямой вызов драйвера или БПО:


Процедура НапечататьСлипПострочно(ОбъектДрайвера, ТекстСлипа)
    
    МассивСтрок = ПодготовитьТекстСлипа(ТекстСлипа, 32);
    
    Для Каждого Стр Из МассивСтрок Цикл
        
        // Передаем строку в буфер печати драйвера
        ОбъектДрайвера.StringForPrinting = Стр;
        
        // Вызываем команду печати строки
        Если ОбъектДрайвера.PrintString() <> 0 Тогда
            // Обработка ошибки печати при необходимости
            Прервать;
        КонецЕсли;
        
    КонецЦикла;
    
    // Завершаем документ протяжкой ленты и отрезкой
    ОбъектДрайвера.FeedDocument();
    ОбъектДрайвера.CutCheck();

КонецПроцедуры

Способ 3. Настройка параметров виртуального COM-порта

Если онлайн-касса подключена по USB в режиме эмуляции COM-порта, стабильность работы с буфером зависит от задержек виртуального порта в операционной системе Windows. Выполним настройку по шагам:

  1. Откроем Диспетчер устройств Windows.
  2. Развернем ветку Порты (COM и LPT) и найдем виртуальный порт кассы (например, STMicroelectronics Virtual COM Port или VCP).
  3. Нажмем правой кнопкой мыши и выберем Свойства → вкладка Параметры порта → кнопка Дополнительно.
  4. Найдем параметр Время задержки (Latency Timer) и уменьшим значение по умолчанию (16 мс) до 1–2 мс.
  5. Установим фиксированную скорость порта 115200 бод как в свойствах порта, так и в таблицах ККТ через утилиту «Тест драйвера ККТ».

Способ 4. Обновление прошивки ККТ и драйвера

В ранних версиях драйверов 4.13.x обработка нефискальных документов содержала ошибки буферизации. Рекомендуется:

  1. Обновить микропрограмму (прошивку) ККТ Штрих-М до актуальной версии с поддержкой ФФД 1.05/1.2.
  2. Обновить драйвер кассы в 1С до актуальных версий 4.14, 4.15 или 5.x, где устранены утечки памяти и некорректная обработка длинных текстовых пакетов.

Способ 5. Настройка эквайринга на автономную печать

Если банковский терминал оборудован собственным встроенным принтером (например, автономные модели Ingenico или Verifone), самым надежным способом разгрузить ККТ является переключение печати слипов на сам пин-пад.

В файле настроек банковского ПО pinpad.ini можно отключить передачу текста слипа в 1С или выставить параметр ширины строки LineLength, соответствующий физической ширине используемой кассовой ленты.

← На главную