При интеграции кассового оборудования Штрих-М в нетиповые конфигурации или при доработке механизмов «1С:Библиотеки подключаемого оборудования» (БПО) разработчики нередко сталкиваются с парадоксальной ситуацией. Тест драйвера отрабатывает без нареканий, смена на ККТ открывается и закрывается штатно, отчет без гашения (X-отчет) печатается, однако при попытке фискализации чека операция прерывается с ошибкой: «При выполнении операции произошла ошибка: 00h, Ошибок нет».
Выясним причину такого поведения внешних компонент драйвера и разберем по шагам, как локализовать и устранить сбой.
Код состояния 00h формируется самим фискальным накопителем или прошивкой онлайн-кассы и буквально означает: на аппаратном уровне контрольно-кассовая техника работает штатно и никаких внутренних сбоев не зафиксировано.
Почему же тогда в 1С выводится ошибка? Проанализируем цепочку вызовов при фискализации:
МенеджерОборудованияКлиент или ПодключаемоеОборудованиеУниверсальныйДрайверКлиент).Результат = ОбъектДрайвера.СформироватьЧек(...).Ложь, вообще не отправляя фискальные команды в устройство.Ложь, и сразу обращается к объекту драйвера за описанием последней ошибки устройства. Но поскольку в кассу никакая ошибочная команда не передавалась, драйвер транслирует последний ответ от ККТ: «00h, Ошибок нет».Таким образом, эта ошибка всегда указывает на некорректность переданных параметров на стороне 1С до момента физической печати чека.
Внешние компоненты драйверов ККТ разработаны на C/C++ и требуют строгого соответствия типов данных платформы 1С и типов аргументов COM/AddIn-интерфейса. Платформа 1С позволяет использовать динамическую типизацию, но внешняя библиотека не способна неявно преобразовать ссылочный тип данных конфигурации в строку.
Наиболее распространенная ошибка — передача в структуру параметров чека реквизита Кассир (или Пользователь) в виде ссылки на справочник СправочникСсылка.Пользователи или СправочникСсылка.ФизическиеЛица вместо строки.
Посмотрим на пример ошибочного заполнения данных:
// ОШИБКА: передача ссылки на справочник
ПараметрыЧека.Вставить("Кассир", ПараметрыСеанса.ТекущийПользователь);
ПараметрыЧека.Вставить("КассирИНН", ПараметрыСеанса.ТекущийПользователь.ИНН);
Внутри внешней компоненты парсер ожидает стандартный тип VT_BSTR (строку). Получая внутренний COM-указатель или сериализованную ссылку 1С, валидатор отклоняет пакет данных.
Исправим ситуацию, выполнив явное приведение типов:
// ПРАВИЛЬНО: строгая передача строкового представления
ПараметрыЧека.Вставить("Кассир", СокрЛП(ПараметрыСеанса.ТекущийПользователь.Наименование));
// Либо через функцию Строка():
// ПараметрыЧека.Вставить("Кассир", Строка(ПараметрыСеанса.ТекущийПользователь));
Если ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь.ИНН) Тогда
ПараметрыЧека.Вставить("КассирИНН", СокрЛП(ПараметрыСеанса.ТекущийПользователь.ИНН));
КонецЕсли;
Если проверка поля кассира не помогла, разберем остальные реквизиты, отклонение которых внешней компонентой вызывает ту же ошибку:
Булево (строго Истина или Ложь). Передача числовых флагов 0/1 или строк "Да"/"Нет" приводит к сбою валидации.&, <, >, " должны быть экранированы, иначе XML-документ становится невалидным (Not Well-Formed).Разберем по шагам, как быстро обнаружить ошибку, если визуальный просмотр кода не дает результата:
Validation error: invalid type for attribute 'Cashier'.ФискализацияЧека перехватите входные параметры в обеих базах и сравните типы значений каждого свойства через панель вычисления выражений с помощью функции ТипЗнч().СформироватьЧек до обращения к аппарату.