В процессе эксплуатации кассовой техники «Штрих-М» программисты и системные администраторы часто сталкиваются с неприятной ситуацией: во время печати чека заканчивается кассовая лента, и после её замены устройство переходит в «зависшее» состояние. ККТ сообщает о Режиме 8: «Открытый документ», при этом Подрежим 0: «Бумага присутствует». Обычная команда продолжения печати в этом случае часто не помогает, и чек остается «висеть» в памяти кассы, не позволяя ни закрыть его, ни пробить новый.
В данной статье мы подробно разберем причины возникновения такого состояния и проанализируем программные и аппаратные способы выхода из него, основываясь на опыте разработчиков 1С 7.7 и особенностях драйверов «Штрих-М». Для организации взаимодействия с кассой и вызова необходимых команд пригодится набор готовых функций для подключения онлайн-кассы «Штрих-М» к 1С 7.7.
Проанализируем ситуацию с технической точки зрения. Когда датчик бумаги фиксирует её отсутствие, ККТ переходит в Подрежим 3 (ожидание заправки бумаги). После того как оператор вставляет новый рулон, касса переходит в Подрежим 0 (полная готовность), но остается в Режиме 8 (документ открыт). Логическая проблема заключается в том, что для драйвера и внутреннего процессора ККТ операция печати считается прерванной на критическом этапе.
Если бумага закончилась в момент формирования фискального признака (в современных онлайн-кассах с ФН), ситуация усложняется. Фискальный накопитель может уже зафиксировать операцию, а печатающее устройство еще не успело вывести итог на ленту. В этом случае команда ContinuePrint игнорируется, так как логика ФН и логика принтера расходятся. Рассмотрим основные способы решения этой задачи.
Одним из наиболее надежных (хотя и радикальных) методов является принудительная отмена чека на уровне системного администратора. Рассмотрим пример кода на языке 1С 7.7, который позволяет автоматизировать процесс «реанимации» кассы при возникновении ошибки печати.
Функция ПродолжитьПечать(Объект, Пароль)
Рез = 0;
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = "устройство не подключено";
ИначеЕсли ПодключитьсяКФР(Объект, Пароль) = 1 Тогда
// Устанавливаем пароль администратора (обычно "30")
Объект.Password = Пароль;
Объект.Connect();
// Получаем текущее состояние расширенного режима
Подрежим = Объект.ECRAdvancedMode;
// Если касса ждет бумагу (Подрежим 3)
Если Подрежим = 3 тогда
Объект.ContinuePrint();
Объект.CheckConnection();
// Ждем завершения операции печати
Подрежим = Объект.ECRAdvancedMode;
Пока Подрежим <> 0 цикл
Подрежим = Объект.ECRAdvancedMode;
Объект.CheckConnection();
КонецЦикла;
// Если после допечатки касса все еще в режиме 8 (документ открыт)
// и подрежим 0 (бумага есть), то закрыть чек обычно нельзя
Если (Объект.ECRMode = 8) и (Подрежим = 0) тогда
// Выполняем административную отмену чека
Объект.SysAdminCancelCheck();
Сообщить("Выполнена административная отмена чека.");
КонецЕсли;
Иначе
Сообщить("Устройство не находится в режиме ожидания печати!");
Рез = -1;
КонецЕсли;
КонецЕсли;
Возврат Рез;
КонецФункции
Важный нюанс: метод SysAdminCancelCheck требует прав администратора (по умолчанию пароль «30»). После выполнения этой команды чек в кассе будет аннулирован, и его необходимо будет пробить заново в учетной системе. Выясним причину, по которой ContinuePrint работает не всегда: в ряде прошивок Штрих-М при обрыве связи на этапе закрытия чека буфер данных очищается, и допечатывать кассе просто нечего. Для устранения системных сбоев на уровне встроенного ПО подойдёт инструкция по обновлению прошивки ККТ «Штрих-М».
Если программный метод не помогает или вы хотите вручную проверить состояние устройства, воспользуемся утилитой «Тест драйвера». Разберем последовательность действий по шагам:
DrvrFR.exe).ECRMode изменился на 2 (Смена открыта, 24 часа не превышены).Посмотрим на практический опыт специалистов ЦТО: команда ContinuePrint (код 12h) стабильно работает только при печати текстовых строк (например, при печати слип-чеков банковских терминалов). В случае полноценного фискального чека переход в Режим 8 при отсутствии бумаги почти всегда требует аннулирования транзакции.
В современных условиях работы по 54-ФЗ важно понимать, пробился ли чек в фискальном накопителе. Если касса «зависла» в Режиме 8, Подрежим 0, выполните следующие действия:
Проанализируем свойство Tag501 (номер последнего документа в ФН). Сравните его с номером чека в вашей учетной системе. Если сумма в ФН совпала с суммой чека, который вы пытались пробить, значит, чек фактически пробит, но лента закончилась в момент отрезки. В этом случае отменять чек нельзя, иначе возникнет расхождение выручки. Вам нужно просто принудительно закрыть документ в 1С, не отправляя повторных команд на ККТ.
Чтобы минимизировать возникновение подобных ситуаций, рассмотрим несколько практических советов по настройке взаимодействия 1С 7.7 и ККТ:
Timeout) установите значение не менее 150-200 мс. При работе через USB-эмуляторы COM-портов низкий тайм-аут приводит к тому, что 1С «бросает» ожидание ответа от кассы раньше, чем та успеет сообщить об окончании бумаги.OpenCheck или Sale рекомендуется вызывать метод GetStatus и проверять флаг IsPaperOut. Если бумаги мало (или она закончилась), лучше выдать предупреждение пользователю до начала формирования чека.Подводя итог, отметим, что выход из состояния 8 «Открытый документ» при наличии бумаги (Подрежим 0) — это стандартная процедура восстановления после сбоя. Основным инструментом программиста здесь выступает метод SysAdminCancelCheck, предваряемый проверкой текущего состояния через ECRMode и ECRAdvancedMode.