Как распечатать копию кассового чека на ККТ АТОЛ: разбираемся с номерами ФД и командами драйвера

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

В процессе эксплуатации контрольно-кассовой техники (ККТ) АТОЛ часто возникает необходимость повторной печати документа. Это может быть связано с замятием бумаги, требованием клиента или внутренними нуждами организации. Однако при попытке программно отправить команду на печать копии чека разработчики часто сталкиваются с ошибкой 218: «В ФН нет запрошенных данных». В этой статье мы разберем, почему возникает эта ошибка, в чем разница между номером чека и номером фискального документа, и как реализовать печать копии в 1С и через драйвер АТОЛ.

Почему не печатается копия по номеру чека? Разберем причину ошибки

Проанализируем типичную ситуацию: программист пытается отправить низкоуровневую команду через ДТО (Драйвер торгового оборудования), передавая номер смены и номер чека. Например, для смены №99 и чека №3 используется HEX-команда AB 00 99 00 03. Касса возвращает ошибку, хотя чек с таким номером точно существует в этой смене.

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

В сквозную нумерацию ФД попадают абсолютно все операции:

  1. Отчет о регистрации ККТ (ФД №1).
  2. Отчет об открытии смены.
  3. Кассовые чеки (приход, возврат прихода и т.д.).
  4. Отчеты о текущем состоянии расчетов.
  5. Отчет о закрытии смены.

Таким образом, если в смене №99 был пробит чек №3, его реальный номер ФД может быть, например, 1254. Именно этот номер ожидает касса в командах печати копии. Если вы передаете «3», касса ищет ФД с номером 3 (который, скорее всего, был создан еще год назад при регистрации кассы) и не находит его среди текущих активных данных или сталкивается с несоответствием параметров поиска.

Как найти номер ФД для печати копии

Разберем способы получения заветного номера ФД, без которого печать копии невозможна.

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

Способ 2: Математический расчет (не рекомендуется). Можно попытаться вычислить номер ФД, зная номер ФД открытия смены и количество чеков, но это ненадежно, так как в смене могли быть технические отчеты или коррекции, которые также увеличивают счетчик ФД.

Способ 3: Через личный кабинет ОФД. Если номер ФД неизвестен, его всегда можно посмотреть в личном кабинете Оператора Фискальных Данных, найдя нужный чек по дате и времени.

Программная реализация в 1С через БПО

Рассмотрим, как это дело внедрить во внешнюю обработку или конфигурацию. В современной библиотеке подключаемого оборудования (БПО) 1С предусмотрены высокоуровневые методы, которые избавляют нас от необходимости работать с HEX-кодами.

Для печати копии чека используется метод НапечататьКопиюЧека. Посмотрим на пример вызова:


// Пример вызова метода через БПО
ПараметрыКоманды = Новый Структура();
ПараметрыКоманды.Вставить("НомерФискальногоДокумента", НомерФД); // Тот самый сквозной номер

Результат = МенеджерОборудования.ВыполнитьКоманду(Идустройства, 
    "НапечататьКопиюЧека", 
    ПараметрыКоманды);

Если же вы работаете напрямую с драйвером АТОЛ 10-й версии (ДТО 10), процесс выглядит иначе. Мы используем объект драйвера и метод reportDocument. Проанализируем пример кода на языке 1С для ДТО 10:


// Работа с ДТО 10 напрямую
Драйвер.setParam(Драйвер.LIBFP_PARAM_REPORT_TYPE, Драйвер.LIBFP_RT_CLOSE_SHIFT_COPY); // Пример для копии отчета
// Или для конкретного ФД:
Драйвер.setParam(65536, НомерФД); // Установка номера ФД через ID параметра
Драйвер.reportDocument();

Низкоуровневые команды (для ДТО 8 и продвинутых задач)

Если вы все же решили использовать низкоуровневый протокол (как в Сообщении 1 темы), то команда должна содержать именно номер ФД. Команда AB в протоколе АТОЛ действительно отвечает за печать копии, но параметры в ней жестко привязаны к внутренней структуре памяти ФН.

Рассмотрим структуру команды более детально:

Как мы выяснили в ходе обсуждения, пользователь успешно нашел решение, когда вычислил, что чеку с номером 3 в смене 99 соответствовал глобальный номер ФД 1254. После передачи корректного номера ФД касса распечатала документ без ошибок.

Юридические аспекты и современные стандарты

Важно понимать разницу между «Копией» и «Дубликатом». Согласно 54-ФЗ, кассовый чек должен содержать QR-код и фискальный признак. Современные прошивки АТОЛ при печати копии через драйвер автоматически добавляют надпись «ПОВТОР ДОКУМЕНТА» или «КОПИЯ». Это делается для того, чтобы кассир не смог выдать копию за новый чек и тем самым скрыть выручку или совершить иную махинацию.

Посмотрим на альтернативный вариант. Если клиенту просто нужен чек, часто эффективнее отправить ему электронный чек. В 1С это реализуется через передачу признака отправки SMS или Email в параметрах фискализации. Электронный чек из ОФД имеет ту же юридическую силу, что и бумажный, и его можно распечатать в любой момент из почты.

Итоги и рекомендации

Подведем итоги нашего исследования:

  1. Ошибка 218 чаще всего означает, что вы пытаетесь передать локальный номер чека вместо глобального номера ФД.
  2. Всегда сохраняйте номер ФД в базе 1С после пробития чека. Это критически важно для последующей печати копий или оформления возвратов без оригинала чека.
  3. Для новых проектов используйте ДТО 10 и стандартные методы БПО 1С. Работа с нижним уровнем (HEX-команды) оправдана только в очень специфических случаях на старом оборудовании.
  4. Помните, что печать копии возможна только для документов, хранящихся в текущем установленном ФН. Если память ФН была закрыта и установлен новый, распечатать старые чеки через кассу не получится — в этом случае поможет только личный кабинет ОФД.

Проанализировав ситуацию, мы видим, что решение большинства проблем с ККТ АТОЛ кроется в понимании логики работы фискального накопителя. Надеемся, что этот разбор поможет вам быстро реализовать функционал печати копий чеков в ваших программных продуктах.

← На главную