При сопровождении крупных корпоративных систем на базе «1С:Предприятие» специалисты часто сталкиваются с непредвиденными сбоями торгового оборудования после плановых обновлений конфигураций. Типичный пример такой проблемы — внезапный отказ ККТ (например, АТОЛ-30Ф или других моделей АТОЛ) печатать чеки после обновления «1С:Управление производственным предприятием» (УПП) с релиза 1.3.134.1 на 1.3.137.2. Касса выдает критическую ошибку: «ERROR [1C] [48] Тип чека не поддерживается».
В этой статье мы подробно разберем, почему возникает этот сбой, проанализируем внутренние механизмы взаимодействия платформы с драйверами торгового оборудования и предложим пошаговые варианты решения проблемы.
Для того чтобы понять природу ошибки, рассмотрим, как именно программа 1С передает данные на кассовый аппарат через БПО (Библиотеку подключаемого оборудования). Перед отправкой команды фискализации система собирает информацию о товарах, ценах, ставках НДС и типах оплаты во внутренний объект платформы — структуру или таблицу значений, которая называется ДанныеЧека.
Драйвер ККТ (в данном случае АТОЛ ДТО 10) работает по строгому стандарту интеграции 1С. Он не может напрямую прочитать внутренний объект платформы. Драйвер ожидает получить на вход текстовую XML-строку, содержащую все параметры чека. Для этого в общем модуле 1С выполняется сериализация структуры данных в формат XML, а результат помещается в переменную ПараметрыФискализации.ДанныеЧекаXML.
В ошибочном релизе УПП 1.3.137.2 разработчики допустили опечатку. При вызове метода драйвера ККТ СформироватьЧек вместо текстовой XML-строки была передана исходная несериализованная структура ДанныеЧека. Драйвер АТОЛ, получив неопределенный для него тип данных вместо XML-документа, не смог его обработать. Из-за отсутствия структуры тегов драйвер не обнаружил обязательных параметров (таких как тип чека, признак расчета и ставки налога) и вернул стандартную ошибку драйвера с кодом 48 — «Тип чека не поддерживается».
Данная проблема носит массовый характер и официально зарегистрирована в базе ошибок фирмы 1С:
Если у вас есть возможность оперативно обновить конфигурацию до версии 1.3.138.1 или выше, это полностью решит проблему. Если же конфигурация сильно кастомизирована и быстрое обновление невозможно, разберем пошаговые варианты локального исправления.
Выясним причину ошибки на уровне исходного кода и устраним ее вручную через режим «Конфигуратор». Этот способ наиболее безопасен и эффективен, так как не затрагивает другие механизмы системы.
Выполним следующие шаги:
ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ФискализацияЧека (в стандартной конфигурации проблемный участок находится ориентировочно на строке 1608).
// Версия 1.3.137.2 (код с ошибкой)
Если ПараметрыФискализации.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
Результат = ОбъектДрайвера.СформироватьЧек(ПараметрыПодключения.ИДУстройства, ПараметрыФискализации.Электронно, ДанныеЧека, ПараметрыФискализации.РезультатОперацииXML);
ИначеЕсли ПараметрыФискализации.РевизияИнтерфейса > 2001 Тогда // Версия стандарта 2.2 и выше (ОФД 1.0.5)
Результат = ОбъектДрайвера.СформироватьЧек(ПараметрыПодключения.ИДУстройства, ПараметрыФискализации.Электронно, ДанныеЧека, ПараметрыФискализации.НомерЧекаККТ, ПараметрыФискализации.НомерСменыККТ, ПараметрыФискализации.ФискальныйПризнак, ПараметрыФискализации.АдресСайтаПроверки);
КонецЕсли;
Обратите внимание на третий параметр метода СформироватьЧек. В кодовой базе ошибочно передается локальная переменная ДанныеЧека.
Для исправления ошибки заменим этот параметр во всех ветках условий на корректную переменную, содержащую XML-строку. Измените код на следующий вариант:
// Исправленный вариант кода
Если ПараметрыФискализации.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
Результат = ОбъектДрайвера.СформироватьЧек(ПараметрыПодключения.ИДУстройства, ПараметрыФискализации.Электронно, ПараметрыФискализации.ДанныеЧекаXML, ПараметрыФискализации.РезультатОперацииXML);
ИначеЕсли ПараметрыФискализации.РевизияИнтерфейса > 2001 Тогда // Версия стандарта 2.2 и выше (ОФД 1.0.5)
Результат = ОбъектДрайвера.СформироватьЧек(ПараметрыПодключения.ИДУстройства, ПараметрыФискализации.Электронно, ПараметрыФискализации.ДанныеЧекаXML, ПараметрыФискализации.НомерЧекаККТ, ПараметрыФискализации.НомерСменыККТ, ПараметрыФискализации.ФискальныйПризнак, ПараметрыФискализации.АдресСайтаПроверки);
КонецЕсли;
Сохраните изменения в конфигурации базы данных (клавиша F7) и обновите конфигурацию базы данных. После этого перезапустите сеанс пользователя 1С и повторите попытку печати чека. Ошибка будет устранена.
Если вы не хотите вносить изменения в код вручную, можно откатить изменения подсистемы торгового оборудования до состояния стабильного релиза 1.3.134.1. Этот способ требует аккуратности при сравнении и объединении конфигураций.
Разберем по шагам, какие именно объекты необходимо вернуть к предыдущей версии:
ПодключаемоеОборудованиеУниверсальныйДрайверКлиент (в нем содержится процедура ФискализацияЧека).ATOLkkt (верните версию обработки, поставляемую с релизом 1.3.134.1).ТОСервер, если по ней также зафиксированы расхождения при сравнении.После завершения объединения сохраните изменения и проверьте работоспособность фискализации.
Рассмотрим ситуации, когда программный код в общем модуле исправлен и написан верно, но ККТ все равно возвращает ошибку с кодом 48. Выясним, какие еще факторы могут влиять на этот сбой:
Применяя данные рекомендации и своевременно анализируя структуру передаваемых XML-данных, вы сможете быстро и безболезненно решать любые проблемы, возникающие при фискализации чеков в решениях на платформе 1С.