В процессе работы с контрольно-кассовой техникой (ККТ) по стандарту ФФД 1.05 и выше периодически возникает необходимость оформления чеков коррекции. Однако в старых или сильно доработанных конфигурациях, таких как «1С:Управление производственным предприятием» (УПП), этот функционал может отсутствовать либо работать некорректно. Попытки пробить такой чек напрямую через драйвер ККТ часто натыкаются на ошибки незаполненных обязательных реквизитов, в частности сложных тегов 1173 и 1174.
В этой статье мы подробно разберем, как решить эту проблему, проанализируем структуру обязательных тегов чека коррекции и рассмотрим несколько практических способов оформления операции: от использования сторонних баз 1С до программного формирования TLV-структуры через драйвер АТОЛ.
При оформлении чека коррекции требования налогового законодательства и ФФД обязывают передавать на кассу информацию о причинах и документах, послуживших основанием для исправления расчетов. За это отвечают два ключевых реквизита:
0 — если коррекция выполняется самостоятельно (например, при обнаружении излишков или неучтенной выручки), или 1 — если процедура инициирована по предписанию налогового органа.Если мы попытаемся закрыть чек коррекции через драйвер ККТ без заполнения этих полей, касса вернет ошибку. Заполнение же тега 1174 вручную в старых версиях драйверов (например, в ДТО 9.х) вызывает огромные трудности, так как интерфейс не всегда позволяет корректно упаковать эти данные в структуру TLV.
Выясним, какие существуют надежные варианты обхода этой проблемы.
Это самый простой, быстрый и безопасный способ, не требующий написания кода и изменения рабочей конфигурации УПП. Если вам нужно разово отбить чек коррекции, мы рекомендуем воспользоваться типовым механизмом современной конфигурации 1С.
Разберем этот процесс по шагам:
Этот метод исключает ошибки ручного программирования кассы и гарантирует, что чек будет сформирован в строгом соответствии с актуальным законодательством.
Если развернуть чистую базу 1С нет возможности, мы можем воспользоваться штатной сервисной утилитой АТОЛ. Обратите внимание, что использовать устаревший драйвер ветки 9.х (например, 9.12.3.6) крайне не рекомендуется из-за нестабильной работы со сложными тегами. Рассмотрим алгоритм действий для актуального драйвера ДТО 10:
Чек коррекции прихода (или расход, в зависимости от ситуации).Важное примечание: Если при закрытии чека вы получаете ошибку [148] Ошибка программирования реквизита 1174, проанализируйте версию установленного драйвера. В некоторых релизах ДТО 10 из графического интерфейса пропадало поле ввода описания коррекции (тег 1177), что приводило к ошибке формата. В таком случае рекомендуется откатиться на заведомо стабильную версию драйвера (например, 10.6.1.0) или обновиться до самого последнего релиза.
Для разработчиков, которым необходимо реализовать пробитие чека коррекции непосредственно из доработанной конфигурации УПП, рассмотрим программный метод работы с драйвером АТОЛ через 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-структур драйвером.
Для конфигураций с обычными формами (таких как УПП или старая УТ 10.3) существуют готовые внешние обработки обслуживания ККТ. На порталах сообщества разработчиков 1С представлены решения, которые добавляют полноценный интерфейс работы с новыми типами чеков для старых конфигураций.
Интеграция такой обработки позволяет операторам ККТ формировать чеки коррекции в привычной среде 1С без обновления всей конфигурации целиком и без привлечения программистов для написания низкоуровневых сценариев взаимодействия с COM-объектами драйвера.
Мы рассмотрели различные пути решения задачи пробития чека коррекции на кассе АТОЛ 77Ф в связке с устаревшей системой 1С:УПП. Подведем итоги:
utilFormTlv() драйвера АТОЛ для упаковки сложных структур тега 1174.