При работе в устаревших редакциях конфигураций 1С, таких как «Управление торговлей», редакция 11.1 (УТ 11.1), пользователи часто сталкиваются с техническими сложностями при подключении современного торгового оборудования. Типичный пример такой проблемы — невозможность пробить чек из документа «Приходный кассовый ордер» (ПКО) или «Эквайринговая операция», если документ привязан к заказу клиента со ставкой НДС 20%. При попытке фискализации чека на ККТ Атол 30Ф (и других моделях Атол) система выдает ошибку:
«При выполнении операции произошла ошибка: Указан неверный НДС. Чек не напечатан на фискальном устройстве».
При этом, если убрать привязку к заказу, чек может распечататься нормально, но без детализации по номенклатурным позициям (одной строкой на общую сумму), что нарушает требования Федерального закона № 54-ФЗ. В данной статье мы подробно разберем, почему возникает эта ошибка, как функционирует механизм взаимодействия 1С с кассовым сервером Атол и как решить проблему с помощью точечной доработки кода без необходимости глобального обновления всей конфигурации.
Для того чтобы понять природу ошибки, проанализируем архитектуру взаимодействия платформы 1С, Библиотеки подключаемого оборудования (БПО), драйвера ККТ и самой кассы. Проблема кроется в несовместимости версий программного обеспечения на разных этапах передачи данных:
Таким образом, чтобы касса успешно напечатала чек с честными 20% НДС через старый драйвер, программа 1С должна передать в XML-пакет старое обозначение ставки — «18» (или «18/118»). Но так как в базе УТ 11.1 во всех заказах и справочниках уже заведена и используется актуальная ставка 20%, 1С передает значение «20», вызывая сбой валидации.
Для устранения ошибки нам необходимо скорректировать 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-архива внешней компоненты, которая загружается в систему через справочник «Драйверы оборудования». Чтобы обновить только компоненту:
FR-ATOL_54FZ.zip или ATOL_KKT_8.zip).В последних релизах интеграционных компонент серии 8.16 разработчики Атол реализовали встроенную логику трансляции: новая компонента сама «на лету» перехватывает теги со ставкой 20% и переводит их в понятный кассе Атол формат, предотвращая возникновение ошибки «Неверный НДС».
Описанный в данной статье метод является отличным временным решением («костылем»), позволяющим быстро восстановить работоспособность кассы без дорогостоящего проекта по обновлению устаревшей конфигурации 1С. Однако важно понимать технические ограничения этого подхода:
Для того чтобы перевести старую конфигурацию УТ 11.1 на работу с современным 10-м драйвером Атол без глобального обновления всей базы, вам потребуется приобрести или разработать внешнюю обработку обслуживания (так называемую обработку ККТ), адаптированную под интеграцию старой БПО и методов API ДТО 10. Это позволит кассе стабильно работать по современным стандартам маркировки и ФФД 1.2.