Как исправить ошибку «Указан неверный НДС» при печати чека на кассе Атол 30Ф в 1С:Управление торговлей 11.1?

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

При работе в устаревших редакциях конфигураций 1С, таких как «Управление торговлей», редакция 11.1 (УТ 11.1), пользователи часто сталкиваются с техническими сложностями при подключении современного торгового оборудования. Типичный пример такой проблемы — невозможность пробить чек из документа «Приходный кассовый ордер» (ПКО) или «Эквайринговая операция», если документ привязан к заказу клиента со ставкой НДС 20%. При попытке фискализации чека на ККТ Атол 30Ф (и других моделях Атол) система выдает ошибку:

«При выполнении операции произошла ошибка: Указан неверный НДС. Чек не напечатан на фискальном устройстве».

При этом, если убрать привязку к заказу, чек может распечататься нормально, но без детализации по номенклатурным позициям (одной строкой на общую сумму), что нарушает требования Федерального закона № 54-ФЗ. В данной статье мы подробно разберем, почему возникает эта ошибка, как функционирует механизм взаимодействия 1С с кассовым сервером Атол и как решить проблему с помощью точечной доработки кода без необходимости глобального обновления всей конфигурации.

Выясняем причину: почему возникает ошибка «Неверный НДС»?

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

  1. Устаревшая интеграционная компонента 1С. В УТ 11.1 используется старая БПО. Внутрь конфигурации встроена DLL-библиотека (внешняя компонента), которая отвечает за подготовку XML-пакета перед его отправкой в драйвер кассы. Эта компонента была разработана еще до изменения законодательства и перехода на НДС 20%. Она жестко валидирует передаваемый XML-код и «не знает» о существовании ставки «20%» или «20/120%». Как только она видит эти значения в XML-структуре, она сразу же прерывает операцию и возвращает ошибку.
  2. Ограничения драйвера Атол серии 8.х. Драйверы Атол линейки 8 (например, популярный 8.16.05) используют фиксированные таблицы налогов. Передача ставки напрямую в виде текста «20» ими не поддерживается в старых версиях интеграционных файлов.
  3. Логика работы обновленной прошивки ККТ. Производители касс Атол предусмотрели режим обратной совместимости. На уровне прошивки кассового аппарата (поддерживающей ФФД 1.05 и НДС 20%) заложена автоматическая подмена налоговых ставок по их индексам. В таблице налогов кассы индекс 1 исторически соответствовал ставке 18%. После обновления прошивки под НДС 20% кассовый аппарат, получая от драйвера команду применить «налог №1» (18%), физически рассчитывает и печатает на чеке законные 20%. Аналогично расчетная ставка 18/118% (индекс 5) автоматически преобразуется кассой в 20/120%.

Таким образом, чтобы касса успешно напечатала чек с честными 20% НДС через старый драйвер, программа 1С должна передать в XML-пакет старое обозначение ставки — «18» (или «18/118»). Но так как в базе УТ 11.1 во всех заказах и справочниках уже заведена и используется актуальная ставка 20%, 1С передает значение «20», вызывая сбой валидации.

Разбираем решение по шагам: доработка кода формирования XML

Для устранения ошибки нам необходимо скорректировать XML-пакет, который формируется в 1С перед отправкой на кассу. Наша задача — перехватить значение ставки НДС «20» (или «20/120») и подменить его строковым значением «18» (или «18/118») непосредственно в момент записи атрибута в XML. Физический кассовый аппарат сам преобразует эти 18% обратно в 20% при печати на бумаге и отправке данных в ОФД.

Выполним отладку и внесем изменения в общий модуль конфигурации:

Шаг 1. Откроем базу УТ 11.1 в режиме «Конфигуратор».

Шаг 2. Найдем общий модуль, отвечающий за формирование XML-пакета для фискализации оборудования. Обычно это модуль МенеджерОборудованияВызовСервера или специализированный модуль интеграции БПО. Нам нужна функция с именем, аналогичным ПолучитьXMLПакетДляФискализацияЧека (или ПолучитьXMLПакетДляФискализацияЧека_ТО).

Шаг 3. Проанализируем код функции. Найдем фрагмент, где происходит обход товарных позиций чека (цикл по массиву ОбщиеПараметры.ПозицииЧека) и запись параметров фискальной строки FiscalString.

Обычно этот участок кода выглядит следующим образом:


Если НЕ ПустаяСтрока(ТекущаяПозиция.СтавкаНДС) Тогда 
    ЗаписьXML.ЗаписатьАтрибут("Tax"   , XMLСтрока(ТекущаяПозиция.СтавкаНДС));
Иначе
    ЗаписьXML.ЗаписатьАтрибут("Tax"   , "none");
КонецЕсли;

Шаг 4. Модернизируем этот участок кода. Добавим условие, которое проверяет значение переменной ТекущаяПозиция.СтавкаНДС. Если там передается новая ставка, мы заменим ее строковым литералом, совместимым со старой БПО и драйвером 8.х:


Если НЕ ПустаяСтрока(ТекущаяПозиция.СтавкаНДС) Тогда 
    // Задаем переменную для преобразованной ставки
    ЗначениеСтавкаНДС = СокрЛП(ТекущаяПозиция.СтавкаНДС);
    
    // Выполняем подмену для корректной работы старой интеграционной компоненты
    Если ЗначениеСтавкаНДС = "20" Или ЗначениеСтавкаНДС = "20%" Тогда
        ЗначениеСтавкаНДС = "18";
    ИначеЕсли ЗначениеСтавкаНДС = "20/120" Тогда
        ЗначениеСтавкаНДС = "18/118";
    КонецЕсли;
    
    ЗаписьXML.ЗаписатьАтрибут("Tax", XMLСтрока(ЗначениеСтавкаНДС));
Иначе
    ЗаписьXML.ЗаписатьАтрибут("Tax", "none");
КонецЕсли;

Шаг 5. Сохраним изменения в конфигураторе и обновим базу данных (клавиша F7).

Альтернативный вариант доработки (на примере УПП и схожих БПО)

В некоторых версиях библиотек оборудование ожидает ставки НДС в виде числовых кодов или специфических текстовых выражений (например, когда ставка преобразуется во внутренние перечисления БПО). Рассмотрим пример аналогичного исправления, которое часто применяется в конфигурациях «Управление производственным предприятием» (УПП) или старых версиях «Комплексной автоматизации»:


Если НЕ ПустаяСтрока(ТекущаяПозиция.СтавкаНДС) Тогда 
    // В некоторых БПО ставки приходят в числовом формате (например, 120 для 20/120)
    Если ТекущаяПозиция.СтавкаНДС = 120 Или ТекущаяПозиция.СтавкаНДС = "120" Тогда
        ЗначениеСтавкаНДС = "18/118";
    ИначеЕсли ТекущаяПозиция.СтавкаНДС = 110 Или ТекущаяПозиция.СтавкаНДС = "110" Тогда
        ЗначениеСтавкаНДС = "10/110";
    ИначеЕсли ТекущаяПозиция.СтавкаНДС = 20 Или ТекущаяПозиция.СтавкаНДС = "20" Тогда
        ЗначениеСтавкаНДС = "18";
    Иначе
        ЗначениеСтавкаНДС = ТекущаяПозиция.СтавкаНДС;
    КонецЕсли;
Иначе
    ЗначениеСтавкаНДС = "none";
КонецЕсли;

Такой подход гарантирует, что даже если в структуру данных БПО попадают числовые идентификаторы ставок, они будут корректно приведены к строковому формату "18/118" или "18", что позволит избежать падения внешней компоненты драйвера с критической ошибкой.

Можно ли решить проблему без изменения кода конфигурации?

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

Дело в том, что код обработки драйвером XML-пакетов содержится внутри ZIP-архива внешней компоненты, которая загружается в систему через справочник «Драйверы оборудования». Чтобы обновить только компоненту:

  1. Скачайте официальный дистрибутив старого драйвера Атол версии 8.16.3 или 8.16.5 (последние версии 8-й серии, выпущенные разработчиками).
  2. Найдите в каталоге установленного драйвера архив интеграции с 1С (обычно файл называется FR-ATOL_54FZ.zip или ATOL_KKT_8.zip).
  3. В режиме «1С:Предприятие» перейдите в меню «Администрирование» — «Подключаемое оборудование» — «Драйверы оборудования».
  4. Выберите в списке драйвер «АТOL:ККТ с передачей данных в ОФД (54-ФЗ)» и нажмите кнопку «Обновить из файла», указав путь к новому архиву.

В последних релизах интеграционных компонент серии 8.16 разработчики Атол реализовали встроенную логику трансляции: новая компонента сама «на лету» перехватывает теги со ставкой 20% и переводит их в понятный кассе Атол формат, предотвращая возникновение ошибки «Неверный НДС».

Перспективы использования драйверов 8.х и переход на 10.х

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

Для того чтобы перевести старую конфигурацию УТ 11.1 на работу с современным 10-м драйвером Атол без глобального обновления всей базы, вам потребуется приобрести или разработать внешнюю обработку обслуживания (так называемую обработку ККТ), адаптированную под интеграцию старой БПО и методов API ДТО 10. Это позволит кассе стабильно работать по современным стандартам маркировки и ФФД 1.2.

← На главную