Почему номер чека ККМ в 1С не совпадает с номером на чеке покупателя в кассах АТОЛ?

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

При интеграции кассовых аппаратов АТОЛ с конфигурациями 1С по стандарту 54-ФЗ разработчики часто сталкиваются с ситуацией, когда номер документа, возвращаемый драйвером после пробития чека, существенно отличается от номера, напечатанного на бумажном чеке. Например, функция драйвера возвращает значение 110, которое записывается в реквизит НомерЧекаККМ, а на бумажной ленте покупатель видит номер 4. Разберем по шагам, почему так происходит, какие счетчики существуют в ККТ и как правильно получать нужные данные.

Разбираем природу счетчиков в кассовых аппаратах по 54-ФЗ

В соответствии с форматами фискальных данных (ФФД) контрольно-кассовая техника ведет несколько независимых счетчиков операций. Путаница возникает из-за смешивания следующих понятий:

  1. Номер фискального документа (ФД, тег 1040) — глобальный сквозной номер, который увеличивается на единицу при регистрации любой фискальной операции в фискальном накопителе (ФН). К фискальным операциям относятся не только чеки прихода и возврата, но также отчеты об открытии и закрытии смены, чеки коррекции и отчеты о перерегистрации.
  2. Номер чека за смену (тег 1038) — локальный порядковый номер чека внутри текущей кассовой смены. При каждом открытии новой смены данный счетчик сбрасывается и отсчет снова начинается с 1. Именно этот номер по умолчанию печатается в шапке бумажного чека на многих моделях касс.
  3. Сквозной номер документа ККТ — общий счетчик всех документов аппарата, включая нефискальные (внесения, выемки, сервисные X-отчеты и аварийные документы).

Таким образом, значение 110 — это сквозной номер фискального документа (ФД), зарегистрированного в ФН с момента его активации, а значение 4 — это номер чека в рамках текущей открытой смены.

Особенности работы методов драйвера 1С

Проанализируем поведение типовых методов интеграционной компоненты ATOL_KKM_1C82_54FZ или универсального драйвера БПО:

Метод ПолучитьТекущееСостояние не предназначен для вычисления номера следующего чека. В структуре параметров состояния возвращаются сведения о буфере неотправленных в ОФД документов:

  1. BacklogDocumentsCounter — количество непереданных документов;
  2. BacklogDocumentFirstNumber — номер первого непереданного документа в очереди;
  3. BacklogDocumentFirstDateTime — дата и время первого непереданного документа.

Метод СформироватьЧек по стандарту подключаемого оборудования 1С возвращает фискальные реквизиты, ключевым из которых является именно номер фискального документа (ФД), а также номер смены и фискальный признак (ФПД). Локальный номер за смену через типовой интерфейс БПО обычно не передается, так как он не является главным идентификатором по требованиям 54-ФЗ.

Варианты решения проблемы

В зависимости от поставленной задачи выберем подходящий способ синхронизации данных.

Вариант 1. Использование методологии учета 1С по 54-ФЗ (рекомендуемый)

По правилам 54-ФЗ для однозначной идентификации чека (например, при проверке на сайте ОФД или в мобильном приложении ФНС) используются три реквизита: Заводской номер ФН, Номер ФД и ФПД. Номер чека за смену не гарантирует уникальности, так как каждый день повторяется.

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

Вариант 2. Прямое обращение к нативному драйверу АТОЛ

Если для бизнес-процессов компании обязательно требуется сохранять именно номер чека за смену, стандартной компоненты 1С будет недостаточно. Потребуется прямое обращение к методам нативного COM-объекта или Native API драйвера АТОЛ (DTO 8 / DTO 9 / DTO 10).

При использовании прямого драйвера можно запросить регистры ККТ или прочитать параметры закрытого чека:


// Пример получения параметров операции через нативный драйвер DTO 10
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_DATA_TYPE, Драйвер.LIBFPTR_DT_RECEIPT_STATE);
Драйвер.queryData();

НомерЧекаЗаСмену = Драйвер.getParamInt(Драйвер.LIBFPTR_PARAM_RECEIPT_NUMBER);
НомерФД = Драйвер.getParamInt(Драйвер.LIBFPTR_PARAM_DOCUMENT_NUMBER);

В старых версиях драйверов (DTO 8) номер чека за смену можно определить по счетчику чеков в соответствующем регистре ККТ перед или сразу после выполнения команды закрытия чека.

← На главную