При работе с модернизированными онлайн-кассами семейства «Штрих-М» (в частности, популярными моделями Штрих-Лайт-01Ф и Штрих-Лайт-02Ф) специалисты часто сталкиваются со следующей проблемой: при печати сложных, комбинированных чеков (например, когда идет оплата бонусами «Спасибо» от Сбербанка + доплата наличными или картой) ККТ неожиданно выдает ошибку «Ошибка при печати чека, нет связи, чек ККМ не пробит».
Особенно ярко эта проблема проявляется на кассах, которые прошли модернизацию (переделку из старых версий ККМ в онлайн-кассы с фискальным накопителем). До смены прошивки и установки ФН устройство могло работать годами без единого сбоя, но после обновления протоколы обмена стали жестче, а требования к таймингам — выше. Выясним детально причины возникновения этой ошибки и разберем по шагам все возможные варианты ее программного и аппаратного решения.
Основная причина кроется во взаимодействии драйвера кассы, операционной системы и самого фискального устройства. При оплате бонусами банковский терминал сначала отправляет на ККТ команду печати нефискального документа (слип-чека о списании бонусов). Как только печать этого документа завершается, 1С мгновенно инициирует открытие и печать основного фискального чека.
В этот микроскопический промежуток времени процессор ККТ еще занят завершением предыдущей операции (отрезка бумаги, запись логов, отправка данных в ФН). Касса физически не успевает переключить свой внутренний режим и ответить на новый запрос от 1С. Драйвер, не получив мгновенного ответа по COM-порту, считает, что связь потеряна, и возвращает в программу ошибку тайм-аута. Ниже мы подробно рассмотрим, как правильно настроить программные задержки и параметры оборудования для стабильной работы.
Самый простой и эффективный способ, который помогает в 90% случаев без изменения программного кода 1С — это корректировка времени ожидания (таймаута) в самом драйвере кассы. По умолчанию там может быть установлено слишком маленькое значение (например, от 100 до 300 мс), которого модернизированной плате попросту не хватает для "пробуждения" после завершения печати предыдущего слипа.
Выполним настройку по шагам:
Важное замечание: Не стоит устанавливать слишком большой таймаут (например, 3000 мс и более) без крайней необходимости. При завышенном значении кассиры начнут жаловаться, что чеки выходят слишком медленно — касса будет делать видимые паузы между печатью различных блоков документов. Значение в пределах 1000–1500 мс является оптимальным балансом между стабильностью связи и скоростью работы.
Многие разработчики пытаются решить проблему "занятости" кассы добавлением пустых циклов задержки в коде 1С, например:
Для й = 1 По 50000 Цикл
// Пустой цикл ожидания
КонецЦикла;
Проанализируем эту ситуацию. Настоятельно рекомендуем никогда не использовать пустые циклы для создания задержек по следующим причинам:
Для корректного ожидания окончания печати в драйвере ККТ «Штрих-М» реализован штатный метод WaitForPrinting(). Этот метод заставляет систему приостановить отправку следующих команд до тех пор, пока касса полностью не завершит печать предыдущего документа и не освободит порт.
Посмотрим на пример правильного вызова этого метода в коде 1С при последовательной печати банковского слипа и фискального чека:
// Печать банковского нефискального слипа (информация о бонусах)
ККМ.StringForPrinting = "Начислено бонусов Спасибо: 150";
ККМ.PrintString();
// Обязательно вызываем метод ожидания перед началом следующего документа
ККМ.WaitForPrinting();
// Теперь касса гарантированно готова. Переходим к открытию фискального чека
ККМ.CheckType = 1; // Продажа
ККМ.OpenCheck();
Применение метода WaitForPrinting() полностью исключает отправку команд "вдогонку" и гарантирует, что порт кассы будет свободен для начала нового документа.
Если по каким-то причинам метод WaitForPrinting() не поддерживается вашей версией драйвера или вы хотите полностью контролировать процесс обмена, можно реализовать функцию циклического опроса состояния кассы с ограничением по времени и безопасной паузой.
Для создания паузы в старых версиях платформы (например, 1С 7.7) можно использовать внешние компоненты (например, метод Уснуть() из ВК "1С++") либо штатную задержку через системный счетчик производительности _GetPerformanceCounter().
Рассмотрим пример реализации функции проверки готовности кассы:
// Функция выполняет паузу на заданное количество миллисекунд
Процедура ПаузаМс(Знач Миллисекунды)
НачалоСчетчика = _GetPerformanceCounter();
Пока 1 = 1 Цикл
Если (_GetPerformanceCounter() - НачалоСчетчика) >= Миллисекунды Тогда
Возврат;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Функция проверяет, готова ли ККМ к приему команд
Функция ККМГотоваКРаботе(ОбъектККМ)
Перем Итератор, ТекущийРежим;
Для Итератор = 1 По 20 Цикл // Делаем максимум 20 попыток опроса
// Запрашиваем короткий статус ККМ
ОбъектККМ.GetECRStatus();
ТекущийРежим = ОбъектККМ.ECRAdvancedMode;
// Значение ECRAdvancedMode = 0 означает, что касса свободна и готова
Если ТекущийРежим = 0 Тогда
Возврат 1; // Успешно, касса готова
КонецЕсли;
// Если касса занята, делаем паузу 200 миллисекунд перед следующим опросом
ПаузаМс(200);
КонецЦикла;
// Если за несколько секунд касса так и не освободилась
Предупреждение("Внимание! Порт ККМ занят или касса не отвечает!");
Возврат 0;
КонецФункции
Этот алгоритм позволяет избежать зависания программы и не нагружает центральный процессор бессмысленными вычислениями, давая кассе время на корректное завершение внутренних операций.
Очень часто за программной ошибкой "Нет связи" скрывается банальная аппаратная неисправность, связанная с электропитанием. Модернизированные кассы (платы "УМ") потребляют значительно больше энергии в моменты пиковых нагрузок.
Разберем основные физические причины сбоев питания:
Если ККМ подключена к компьютеру по USB-кабелю (с использованием эмуляции виртуального COM-порта или через RNDIS), операционная система Windows может принудительно отключать питание порта для экономии энергии.
Это происходит так: пока кассир обслуживает покупателя, сканирует товары или ждет, пока клиент введет пин-код на терминале, касса "молчит". Windows переводит USB-порт в спящий режим. Когда 1С пытается отправить команду на печать чека, порт не успевает мгновенно инициализироваться («проснуться»), что приводит к ошибке «нет связи».
Для исправления этого поведения выполним настройку операционной системы:
При использовании интерфейса USB кассы Штрих-М часто настраивают для работы в режиме RNDIS (сетевой адаптер для передачи данных в ОФД). В этой схеме на одном USB-кабеле поднимается и сетевое подключение к интернету, и эмуляция COM-порта для связи с 1С.
Если на рабочем месте кассира используется беспроводной интернет (например, 4G-модем в виде USB-свистка или Wi-Fi адаптер), сетевой мост RNDIS кассы может начать конфликтовать по IP-адресам с основным сетевым адаптером (особенно если используются пересекающиеся подсети, например 192.168.137.xxx).
Рекомендации по сетевой стабильности:
Резюмируя все вышесказанное: для полного устранения периодической ошибки "нет связи" на кассах Штрих-Лайт-01Ф (02Ф) необходимо действовать комплексно. Начните с простого увеличения таймаута связи в свойствах драйвера до 1500 мс и добавления вызова метода WaitForPrinting() в код 1С перед открытием чеков. Если это не решит проблему полностью — проверьте мощность блока питания ККТ и отключите функции энергосбережения USB-портов в диспетчере устройств Windows.