Что происходит с данными в ФН, если при печати чека закончилась лента?

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

В процессе работы с контрольно-кассовой техникой (ККТ) нередко возникают ситуации, когда в самый ответственный момент — при пробитии чека — заканчивается кассовая лента. Это вызывает массу вопросов у пользователей и разработчиков: попали ли данные в фискальный накопитель (ФН)? Почему сумма не отображается в X-отчете? Нужно ли пробивать чек повторно? В данной статье мы подробно разберем внутреннюю логику работы ККТ, выясним момент записи данных в ФН и определим правильный алгоритм действий для программ на базе 1С.

Технический процесс фискализации чека

Для начала проанализируем, как именно происходит регистрация чека внутри кассового аппарата. Процесс фискализации не является одномоментным, он состоит из последовательности команд, которые касса выполняет на аппаратном уровне. Рассмотрим основные этапы:

  1. Формирование состава чека: Кассовая программа (например, 1С) передает в ККТ данные о товарах, ценах и налогах. На этом этапе ККТ лишь накапливает информацию в буфере.
  2. Команда закрытия чека: Программа посылает команду ЗакрытиеЧека (или CloseCheck). Именно в этот момент начинается магия фискализации.
  3. Запись в ФН: ККТ передает итоговые данные чека в фискальный накопитель. ФН обрабатывает их, формирует уникальный фискальный признак документа (ФПД) и записывает транзакцию в свою энергонезависимую память. С этого мгновения чек юридически считается пробитым.
  4. Печать фискальных данных: Только после того, как ФН вернул кассе номер документа и фискальный признак, принтер начинает печатать «подвал» чека, где указываются эти реквизиты, а также QR-код.

Разберем ситуацию со сбоем печати. Если бумага закончилась на этапе печати позиций (до команды закрытия), ККТ аннулирует чек. Но если лента закончилась после записи в ФН, но до завершения печати подвала, касса выдаст ошибку «Нет бумаги», хотя в памяти ФН документ уже зафиксирован.

Разрыв между регистрами ККТ и памятью ФН

Часто возникает вопрос: почему в X-отчете или Z-отчете суммы не сходятся с ФН? Выясним причину этого явления. В современных онлайн-кассах (особенно это характерно для моделей АТОЛ) существует разделение памяти:

При критической ошибке принтера алгоритм обновления внутренних регистров ККТ может прерваться. В итоге: в ФН чек записан, в ОФД данные ушли, а во внутренние счетчики кассы сумма не попала. Именно поэтому X-отчет может показывать сумму меньше реальной. Важно помнить: первичными и юридически значимыми являются данные именно из ФН.

Программный алгоритм обработки ошибки в 1С

Чтобы избежать дублирования чеков или потери данных в учетной системе, мы должны предусмотреть в коде 1С обработку подобных ситуаций. Проанализируем надежный способ проверки состояния последнего документа. Перед вызовом метода закрытия чека нам необходимо запомнить текущее состояние счетчиков ФН, а после возникновения ошибки — сравнить его с новым состоянием.

Рассмотрим пример логики, которую можно внедрить в обработку печати чека:


// Псевдокод обработки фискализации
НомерДоЗаписи = ККТ.ПолучитьПараметрыККТ().НомерПоследнегоФД;

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

Этот метод позволяет точно определить, произошло ли инкрементирование номера фискального документа (ФД). Если номер увеличился — продажа прошла. В 1С в таком случае нужно провести документ без повторного обращения к кассе, чтобы не пробить дубль.

Как проверить состояние чека без доступа к ОФД?

Если у вас нет возможности оперативно зайти в личный кабинет ОФД, воспользуйтесь «Тестом драйвера ККТ» (обычно это утилита от производителя кассы). Проанализируем шаги:

  1. Запустите Тест драйвера и установите связь с кассой.
  2. Перейдите в раздел «Запросы» или «Отчеты».
  3. Запросите «Данные последнего фискального документа».
  4. Сравните сумму, дату и время последнего документа с тем, что вы пытались пробить. Если данные совпадают — чек в ФН.

В драйверах АТОЛ 10-й версии предусмотрен метод getFiscalDocument. С его помощью можно вычитать содержимое последнего записанного документа в ФН. Это позволяет убедиться, что состав чека верный, даже если бумажная копия отсутствует.

Режим «Без печати чека»

Рассмотрим, как работает режим без печати чека. В этом случае ККТ вообще не задействует механизм принтера для формирования бумажной ленты. Данные передаются в ФН, он возвращает фискальный признак, и документ закрывается мгновенно. Если вы используете этот режим, риск «зависания» чека из-за отсутствия бумаги сводится к нулю. Однако, если изначально был инициирован режим «с печатью», и принтер выдал ошибку в процессе, касса может остаться в промежуточном состоянии, которое потребует программного подтверждения или ручного вмешательства.

Рекомендации по исправлению расхождений

Если вы обнаружили, что чек в ФН есть, а в 1С продажа не отражена, выполните следующие действия:

Таким образом, мы выяснили, что момент записи в ФН является критической точкой. Знание того, что чек считается действительным сразу после получения ФПД, позволяет правильно обрабатывать ошибки печати и избегать нарушений кассовой дисциплины.

← На главную