В процессе работы с контрольно-кассовой техникой (ККТ) нередко возникают ситуации, когда в самый ответственный момент — при пробитии чека — заканчивается кассовая лента. Это вызывает массу вопросов у пользователей и разработчиков: попали ли данные в фискальный накопитель (ФН)? Почему сумма не отображается в X-отчете? Нужно ли пробивать чек повторно? В данной статье мы подробно разберем внутреннюю логику работы ККТ, выясним момент записи данных в ФН и определим правильный алгоритм действий для программ на базе 1С.
Для начала проанализируем, как именно происходит регистрация чека внутри кассового аппарата. Процесс фискализации не является одномоментным, он состоит из последовательности команд, которые касса выполняет на аппаратном уровне. Рассмотрим основные этапы:
ЗакрытиеЧека (или CloseCheck). Именно в этот момент начинается магия фискализации.Разберем ситуацию со сбоем печати. Если бумага закончилась на этапе печати позиций (до команды закрытия), ККТ аннулирует чек. Но если лента закончилась после записи в ФН, но до завершения печати подвала, касса выдаст ошибку «Нет бумаги», хотя в памяти ФН документ уже зафиксирован.
Часто возникает вопрос: почему в X-отчете или Z-отчете суммы не сходятся с ФН? Выясним причину этого явления. В современных онлайн-кассах (особенно это характерно для моделей АТОЛ) существует разделение памяти:
При критической ошибке принтера алгоритм обновления внутренних регистров ККТ может прерваться. В итоге: в ФН чек записан, в ОФД данные ушли, а во внутренние счетчики кассы сумма не попала. Именно поэтому X-отчет может показывать сумму меньше реальной. Важно помнить: первичными и юридически значимыми являются данные именно из ФН.
Чтобы избежать дублирования чеков или потери данных в учетной системе, мы должны предусмотреть в коде 1С обработку подобных ситуаций. Проанализируем надежный способ проверки состояния последнего документа. Перед вызовом метода закрытия чека нам необходимо запомнить текущее состояние счетчиков ФН, а после возникновения ошибки — сравнить его с новым состоянием.
Рассмотрим пример логики, которую можно внедрить в обработку печати чека:
// Псевдокод обработки фискализации
НомерДоЗаписи = ККТ.ПолучитьПараметрыККТ().НомерПоследнегоФД;
Попытка
ККТ.ЗакрытьЧек();
Исключение
// Если возникла ошибка (например, "Нет бумаги")
ДанныеПослеОшибки = ККТ.ПолучитьПараметрыККТ();
НомерПослеЗаписи = ДанныеПослеОшибки.НомерПоследнегоФД;
Если НомерПослеЗаписи > НомерДоЗаписи Тогда
// Чек успешно записан в ФН, несмотря на ошибку печати!
// Регистрируем продажу в 1С как успешную
ЗафиксироватьУспешнуюПродажу();
Сообщить("Чек записан в ФН, но не напечатан из-за сбоя принтера.");
Иначе
// Чек действительно не пробился
ВызватьИсключение "Ошибка фискализации: чек не записан.";
КонецЕсли;
КонецПопытки;
Этот метод позволяет точно определить, произошло ли инкрементирование номера фискального документа (ФД). Если номер увеличился — продажа прошла. В 1С в таком случае нужно провести документ без повторного обращения к кассе, чтобы не пробить дубль.
Если у вас нет возможности оперативно зайти в личный кабинет ОФД, воспользуйтесь «Тестом драйвера ККТ» (обычно это утилита от производителя кассы). Проанализируем шаги:
В драйверах АТОЛ 10-й версии предусмотрен метод getFiscalDocument. С его помощью можно вычитать содержимое последнего записанного документа в ФН. Это позволяет убедиться, что состав чека верный, даже если бумажная копия отсутствует.
Рассмотрим, как работает режим без печати чека. В этом случае ККТ вообще не задействует механизм принтера для формирования бумажной ленты. Данные передаются в ФН, он возвращает фискальный признак, и документ закрывается мгновенно. Если вы используете этот режим, риск «зависания» чека из-за отсутствия бумаги сводится к нулю. Однако, если изначально был инициирован режим «с печатью», и принтер выдал ошибку в процессе, касса может остаться в промежуточном состоянии, которое потребует программного подтверждения или ручного вмешательства.
Если вы обнаружили, что чек в ФН есть, а в 1С продажа не отражена, выполните следующие действия:
Таким образом, мы выяснили, что момент записи в ФН является критической точкой. Знание того, что чек считается действительным сразу после получения ФПД, позволяет правильно обрабатывать ошибки печати и избегать нарушений кассовой дисциплины.