Как пробить чек коррекции на кассе АТОЛ 77Ф, если в 1С:УПП нет нужного функционала?

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

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

В этой статье мы подробно разберем, как решить эту проблему, проанализируем структуру обязательных тегов чека коррекции и рассмотрим несколько практических способов оформления операции: от использования сторонних баз 1С до программного формирования TLV-структуры через драйвер АТОЛ.

Почему возникает ошибка при пробитии чека коррекции?

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

  1. Тег 1173 (Тип коррекции): принимает простое числовое значение. Например, 0 — если коррекция выполняется самостоятельно (например, при обнаружении излишков или неучтенной выручки), или 1 — если процедура инициирована по предписанию налогового органа.
  2. Тег 1174 (Основание для коррекции): это сложный составной реквизит (структура типа TLV — Type-Length-Value). Его невозможно передать обычной строкой или числом, так как он сам состоит из нескольких вложенных тегов. К ним относятся:
    • Тег 1177 (Описание коррекции): текстовое поле, в котором указывается причина (например, «Акт самопроверки» или «Предписание ФНС»).
    • Тег 1178 (Дата документа основания): дата составления акта или предписания.
    • Тег 1179 (Номер документа основания): номер соответствующего документа.

Если мы попытаемся закрыть чек коррекции через драйвер ККТ без заполнения этих полей, касса вернет ошибку. Заполнение же тега 1174 вручную в старых версиях драйверов (например, в ДТО 9.х) вызывает огромные трудности, так как интерфейс не всегда позволяет корректно упаковать эти данные в структуру TLV.

Выясним, какие существуют надежные варианты обхода этой проблемы.

Способ 1. Пробитие чека через актуальную стороннюю базу 1С

Это самый простой, быстрый и безопасный способ, не требующий написания кода и изменения рабочей конфигурации УПП. Если вам нужно разово отбить чек коррекции, мы рекомендуем воспользоваться типовым механизмом современной конфигурации 1С.

Разберем этот процесс по шагам:

  1. Выгружаем или разворачиваем на компьютере чистую базу с актуальным релизом конфигурации, где гарантированно поддерживаются последние требования ФЗ-54 (например, «1С:Бухгалтерия предприятия 3.0» или «1С:Управление торговлей 11 / 10.3»).
  2. Подключаем физическую кассу АТОЛ 77Ф к этой временной базе через стандартный механизм «Подключаемое оборудование».
  3. В новой базе создаем документ «Чек коррекции». Современные конфигурации содержат удобные экранные формы, где все реквизиты (включая основание коррекции, тип, дату и номер документа) заполняются в понятном пользовательском интерфейсе. При формировании чека система сама правильно упакует все сложные теги.
  4. Пробиваем чек на кассе.
  5. После успешной печати чека коррекции отключаем кассу от временной базы и возвращаем ее к работе с основной базой УПП.

Этот метод исключает ошибки ручного программирования кассы и гарантирует, что чек будет сформирован в строгом соответствии с актуальным законодательством.

Способ 2. Использование утилиты «Тест драйвера ККТ» (ДТО 10)

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

  1. Скачиваем и устанавливаем последнюю стабильную версию ДТО 10.
  2. Закрываем программу 1С, чтобы освободить COM-порт, и запускаем утилиту «Тест драйвера ККТ».
  3. Устанавливаем флаг «Включено» для связи с ККТ АТОЛ 77Ф. Открываем смену, если она была закрыта.
  4. Переходим в раздел меню «Чек». В поле «Тип чека» выбираем значение Чек коррекции прихода (или расход, в зависимости от ситуации).
  5. Находим на форме и нажимаем кнопку «Основание коррекции». В открывшемся окне аккуратно заполняем все обязательные реквизиты:
    • В поле «Тип коррекции» указываем соответствующий тип (самостоятельно или по предписанию).
    • Заполняем дату документа-основания (тег 1178) и его номер (тег 1179). При самостоятельной коррекции номер документа может быть любым (например, «1»), но поле не должно быть пустым, если этого требует прошивка кассы.
    • Обязательно заполняем описание коррекции (тег 1177).
  6. Нажимаем кнопку «ОК» для сохранения структуры основания.
  7. Вносим позиции (товары или услуги) чека коррекции, указывая ставку НДС и тип оплаты.
  8. Нажимаем кнопку «Закрыть чек».

Важное примечание: Если при закрытии чека вы получаете ошибку [148] Ошибка программирования реквизита 1174, проанализируйте версию установленного драйвера. В некоторых релизах ДТО 10 из графического интерфейса пропадало поле ввода описания коррекции (тег 1177), что приводило к ошибке формата. В таком случае рекомендуется откатиться на заведомо стабильную версию драйвера (например, 10.6.1.0) или обновиться до самого последнего релиза.

Способ 3. Программное формирование TLV-структуры тега 1174 в 1С

Для разработчиков, которым необходимо реализовать пробитие чека коррекции непосредственно из доработанной конфигурации УПП, рассмотрим программный метод работы с драйвером АТОЛ через COM-объект.

Главная сложность заключается в правильной передаче тега 1174. Нам понадобится упаковать параметры 1177, 1178 и 1179 в один байтовый массив. Для этого в драйвере АТОЛ существует специальный метод utilFormTlv(). Проанализируем пример кода на языке 1С:


// Создаем объект драйвера ККТ
Драйвер = Новый COMОбъект("AddIn.Fptr10");

// Устанавливаем связь с кассой
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_MODEL, Строка(Драйвер.LIBFPTR_MODEL_ATOL_77F));
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_PORT, Строка(Драйвер.LIBFPTR_PORT_USB));
Драйвер.applySingleSettings();
Драйвер.open();

Если Не Драйвер.isOpened() Тогда
    Предупреждение("Не удалось подключить кассу!");
    Возврат;
КонецЕсли;

// Начинаем формирование чека коррекции
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_RECEIPT_TYPE, Драйвер.LIBFPTR_RT_SELL_CORRECTION);
Драйвер.openReceipt();

// Формируем составной тег 1174 (Основание коррекции)
// Задаем дату корректируемого расчета (тег 1178)
Драйвер.setParam(1178, ДатаДокументаОснования); 

// Задаем номер документа-основания (тег 1179)
Драйвер.setParam(1179, "Акт-1"); 

// Задаем текстовое описание коррекции (тег 1177)
Драйвер.setParam(1177, "Коррекция выручки при инвентаризации"); 

// Упаковываем вложенные теги во временный TLV-буфер драйвера
Драйвер.utilFormTlv();

// Получаем массив байт сформированной структуры
ДанныеТЛВ = Драйвер.getParamByteArray(Драйвер.LIBFPTR_PARAM_TAG_VALUE);

// Передаем упакованный тег 1174 в параметры чека
Драйвер.setParam(1174, ДанныеТЛВ);

// Устанавливаем тип коррекции (тег 1173): 0 - самостоятельно, 1 - по предписанию
Драйвер.setParam(1173, 0);

// Записываем параметры коррекции в чек
Драйвер.writeReceiptExtraRequisites();

// Регистрируем позицию (товар/услугу) в чеке коррекции
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_COMMODITY_NAME, "Корректировка расчета");
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PRICE, СуммаКоррекции);
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_QUANTITY, 1);
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_TAX_TYPE, Драйвер.LIBFPTR_TAX_NO); // Без НДС
Драйвер.registration();

// Описываем тип оплаты (например, наличные)
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_TYPE, Драйвер.LIBFPTR_PT_CASH);
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_SUM, СуммаКоррекции);
Драйвер.payment();

// Закрываем чек коррекции
Драйвер.closeReceipt();

// Закрываем соединение с ККТ
Драйвер.close();

Использование метода utilFormTlv() позволяет корректно передать низкоуровневые бинарные данные в прошивку кассового аппарата АТОЛ 77Ф, избегая ошибок разбора XML-структур драйвером.

Способ 4. Использование готовых внешних обработок

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

Интеграция такой обработки позволяет операторам ККТ формировать чеки коррекции в привычной среде 1С без обновления всей конфигурации целиком и без привлечения программистов для написания низкоуровневых сценариев взаимодействия с COM-объектами драйвера.

Рекомендации и выводы

Мы рассмотрели различные пути решения задачи пробития чека коррекции на кассе АТОЛ 77Ф в связке с устаревшей системой 1С:УПП. Подведем итоги:

← На главную