В процессе эксплуатации контрольно-кассовой техники (ККТ) АТОЛ часто возникает необходимость повторной печати документа. Это может быть связано с замятием бумаги, требованием клиента или внутренними нуждами организации. Однако при попытке программно отправить команду на печать копии чека разработчики часто сталкиваются с ошибкой 218: «В ФН нет запрошенных данных». В этой статье мы разберем, почему возникает эта ошибка, в чем разница между номером чека и номером фискального документа, и как реализовать печать копии в 1С и через драйвер АТОЛ.
Проанализируем типичную ситуацию: программист пытается отправить низкоуровневую команду через ДТО (Драйвер торгового оборудования), передавая номер смены и номер чека. Например, для смены №99 и чека №3 используется HEX-команда AB 00 99 00 03. Касса возвращает ошибку, хотя чек с таким номером точно существует в этой смене.
Выясним причину: фискальный накопитель (ФН) — это «сердце» кассы, которое хранит данные в строгом хронологическом порядке. Для ФН не существует понятия «номер чека в смене» как первичного идентификатора. Каждый документ, который записывается в память накопителя, получает свой уникальный, сквозной номер фискального документа (ФД). Нумерация начинается с единицы в момент активации ФН и идет непрерывно до заполнения памяти или истечения срока действия ключа.
В сквозную нумерацию ФД попадают абсолютно все операции:
Таким образом, если в смене №99 был пробит чек №3, его реальный номер ФД может быть, например, 1254. Именно этот номер ожидает касса в командах печати копии. Если вы передаете «3», касса ищет ФД с номером 3 (который, скорее всего, был создан еще год назад при регистрации кассы) и не находит его среди текущих активных данных или сталкивается с несоответствием параметров поиска.
Разберем способы получения заветного номера ФД, без которого печать копии невозможна.
Способ 1: Из информационной базы 1С. Если чек пробивался из 1С, то при успешной фискализации драйвер возвращает номер ФД. В типовых конфигурациях этот номер записывается в реквизиты документа или в специальные регистры сведений (например, «Фискальные операции»). Перед тем как пытаться печатать копию, нам нужно программно прочитать этот номер из базы.
Способ 2: Математический расчет (не рекомендуется). Можно попытаться вычислить номер ФД, зная номер ФД открытия смены и количество чеков, но это ненадежно, так как в смене могли быть технические отчеты или коррекции, которые также увеличивают счетчик ФД.
Способ 3: Через личный кабинет ОФД. Если номер ФД неизвестен, его всегда можно посмотреть в личном кабинете Оператора Фискальных Данных, найдя нужный чек по дате и времени.
Рассмотрим, как это дело внедрить во внешнюю обработку или конфигурацию. В современной библиотеке подключаемого оборудования (БПО) 1С предусмотрены высокоуровневые методы, которые избавляют нас от необходимости работать с HEX-кодами.
Для печати копии чека используется метод НапечататьКопиюЧека. Посмотрим на пример вызова:
// Пример вызова метода через БПО
ПараметрыКоманды = Новый Структура();
ПараметрыКоманды.Вставить("НомерФискальногоДокумента", НомерФД); // Тот самый сквозной номер
Результат = МенеджерОборудования.ВыполнитьКоманду(Идустройства,
"НапечататьКопиюЧека",
ПараметрыКоманды);
Если же вы работаете напрямую с драйвером АТОЛ 10-й версии (ДТО 10), процесс выглядит иначе. Мы используем объект драйвера и метод reportDocument. Проанализируем пример кода на языке 1С для ДТО 10:
// Работа с ДТО 10 напрямую
Драйвер.setParam(Драйвер.LIBFP_PARAM_REPORT_TYPE, Драйвер.LIBFP_RT_CLOSE_SHIFT_COPY); // Пример для копии отчета
// Или для конкретного ФД:
Драйвер.setParam(65536, НомерФД); // Установка номера ФД через ID параметра
Драйвер.reportDocument();
Если вы все же решили использовать низкоуровневый протокол (как в Сообщении 1 темы), то команда должна содержать именно номер ФД. Команда AB в протоколе АТОЛ действительно отвечает за печать копии, но параметры в ней жестко привязаны к внутренней структуре памяти ФН.
Рассмотрим структуру команды более детально:
Как мы выяснили в ходе обсуждения, пользователь успешно нашел решение, когда вычислил, что чеку с номером 3 в смене 99 соответствовал глобальный номер ФД 1254. После передачи корректного номера ФД касса распечатала документ без ошибок.
Важно понимать разницу между «Копией» и «Дубликатом». Согласно 54-ФЗ, кассовый чек должен содержать QR-код и фискальный признак. Современные прошивки АТОЛ при печати копии через драйвер автоматически добавляют надпись «ПОВТОР ДОКУМЕНТА» или «КОПИЯ». Это делается для того, чтобы кассир не смог выдать копию за новый чек и тем самым скрыть выручку или совершить иную махинацию.
Посмотрим на альтернативный вариант. Если клиенту просто нужен чек, часто эффективнее отправить ему электронный чек. В 1С это реализуется через передачу признака отправки SMS или Email в параметрах фискализации. Электронный чек из ОФД имеет ту же юридическую силу, что и бумажный, и его можно распечатать в любой момент из почты.
Подведем итоги нашего исследования:
Проанализировав ситуацию, мы видим, что решение большинства проблем с ККТ АТОЛ кроется в понимании логики работы фискального накопителя. Надеемся, что этот разбор поможет вам быстро реализовать функционал печати копий чеков в ваших программных продуктах.