При переходе на онлайн-кассы в среде 1С:Предприятие 7.7 (особенно в конфигурации «Торговля и Склад 9.2») системные администраторы и программисты часто сталкиваются с аппаратными задержками. Типичная ситуация: внедрена программа лояльности (например, «Спасибо от Сбербанка»), и при оплате картой касса должна последовательно выдать три документа: чек с бонусами, банковский слип-чек и фискальный кассовый чек. Однако на втором этапе система выдает ошибку «ФР, ошибка при печати чека, нет связи», хотя первый чек вышел успешно.
В этой статье мы подробно разберем, почему модернизированные кассовые аппараты ведут себя подобным образом, и рассмотрим несколько способов решения проблемы — от простых «костылей» до профессиональной настройки драйверов и кода 1С.
Проанализируем техническую сторону вопроса. Старые модели фискальных регистраторов (например, Штрих-М-ФР-К), прошедшие модернизацию до онлайн-версий, начинают работать через виртуальный COM-порт (VCOM) по USB-кабелю или через протокол RNDIS. В отличие от классического интерфейса RS-232, новые протоколы обмена данными и необходимость взаимодействия с Фискальным Накопителем (ФН) создают микропаузы в работе устройства.
Когда 1С отправляет команду на печать нефискального текста (бонусы), касса отрабатывает её. Но сразу после завершения печати драйверу требуется время, чтобы переинициализировать порт или завершить запись логов в ФН. Если 1С отправляет следующую команду (печать банковского чека) мгновенно, драйвер еще считает устройство «занятым» или «недоступным», что и вызывает ошибку связи.
Самый быстрый способ решить проблему, найденный участниками обсуждения, — это добавление принудительного ожидания между вызовами функций печати. Рассмотрим, как это реализовано в коде конфигурации.
Допустим, у нас есть последовательные вызовы функций ПечЧекСпасибо() и ПечБанкЧеки(). Между ними необходимо вставить цикл, который создаст временную задержку, достаточную для «освобождения» кассового аппарата.
Пример реализации простой задержки:
// Вызов печати бонусов
Если ПечЧекСпасибо(ТекстБонусов) = 1 Тогда
// Вставляем пустой цикл для ожидания готовности ККТ
// Значение 50000 подбирается опытным путем в зависимости от мощности ПК
Для й = 1 По 50000 Цикл
// Пустая итерация
КонецЦикла;
// Теперь вызываем печать банковского чека
ПечБанкЧеки(ТекстСлипа);
КонецЕсли;
Важное замечание: Использование пустого цикла Для...Цикл является крайне нестабильным решением, так как скорость его выполнения напрямую зависит от частоты процессора. На современном быстром компьютере этот цикл пролетит за доли миллисекунды, и ошибка вернется. На старом ПК он может создать паузу в несколько секунд.
Рассмотрим более надежный и профессиональный метод — опрос состояния кассового аппарата. Вместо «слепого» ожидания мы будем спрашивать у драйвера, готово ли устройство к приему новой команды. В драйверах Штрих-М для этого используется метод GetECRStatus() (или ПолучитьСостояниеККМ).
Проанализируем правильный алгоритм ожидания:
Функция ОжидатьГотовностиФР(ОбъектФР)
Перем СостояниеФР, Описание;
// Пытаемся получить статус устройства в цикле
Для Попытка = 1 По 20 Цикл
// Вызываем метод получения состояния (зависит от версии обработки)
ОбъектФР.GetECRStatus();
// ECRMode - это текущий режим ККТ.
// Если он позволяет печать (обычно режим 0 или 4), выходим из цикла.
Если ОбъектФР.ResultCode = 0 Тогда
Возврат 1; // Устройство ответило и готово
КонецЕсли;
// Если устройство занято, делаем микропаузу через Состояние
Состояние("Ожидание готовности кассы... Попытка " + Попытка);
КонецЦикла;
Возврат 0;
КонецФункции
Такой подход гарантирует, что 1С не отправит следующую порцию данных, пока драйвер не подтвердит успешное завершение предыдущей операции.
Часто проблему можно решить без изменения кода 1С, просто отрегулировав параметры самого драйвера. Разберем, как это сделать:
DrvrFR.exe).Увеличение таймаута позволяет драйверу дольше ждать ответа от ККТ, прежде чем сообщить в 1С об ошибке «Нет связи».
В ходе обсуждения упоминалось использование драйвера версии 4.10. Выясним причину, почему это может быть критично. Версия 4.10 разрабатывалась задолго до массового введения требований 54-ФЗ и протоколов работы с ОФД. Для корректной работы модернизированных устройств рекомендуется использовать драйверы версии 4.13, 4.14 или выше.
В новых версиях драйверов оптимизирована работа с очередью печати и исправлены ошибки обработки прерываний при обмене данными. Также стоит обратить внимание на режим подключения:
Если проблема возникает именно при печати чеков «Спасибо» или банковских слипов, стоит заглянуть в конфигурацию эквайринга. При работе с sbrf.dll (компонента Сбербанка) терминал генерирует текстовый файл, который 1С затем передает в кассу построчно или целиком.
Посмотрим на параметр PrinterEnd в файле pinpad.ini. Если установить PrinterEnd=01, терминал будет добавлять управляющий символ в конце чека, что может спровоцировать кассу на корректное завершение документа и отрезку бумаги до того, как 1С начнет следующую операцию. Это создает естественную технологическую паузу.
Мы проанализировали ситуацию и выяснили, что ошибка «Нет связи» в 1С 7.7 при работе с модернизированными кассами — это результат «спешки» программы, которая не учитывает возросшее время отклика новых устройств.
Рациональный план действий:
GetECRStatus).Соблюдение этих рекомендаций позволит добиться стабильной работы печати даже на старых конфигурациях 1С 7.7 с современным кассовым оборудованием.