При пробитии чеков из документов 1С (например, из документа ПриходныйКассовыйОрдер или ЧекККМ) пользователи могут столкнуться с критической ошибкой: "Метод объекта не найден (ФискализироватьЧек)" или "Значение не является значением объектного типа (ФискализироватьЧек)". Данный сбой чаще всего возникает при работе с фискальными регистраторами и ККТ (в частности, оборудования АТОЛ или ШТРИХ-М) в типовых или доработанных конфигурациях (таких как 1С:Управление торговлей 10.3).
Рассмотрим подробнее, почему возникают подобные сбои в работе с торговым оборудованием и как по шагам устранить эту проблему.
Проанализируем ситуацию на уровне исполнения программного кода 1С. Ошибка возникает в момент обращения к методу фискализации:
ОшибкаТО = ОбработкаОбслуживания.ФискализироватьЧек(ОбъектДрайвера, ПараметрыЧека);
Если к моменту выполнения этой строки переменная ОбработкаОбслуживания не инициализирована и содержит значение Неопределено (или пустую строку), платформа 1С выдает сообщение о том, что вызываемый метод объекта не найден.
Разберем основные факторы, из-за которых переменная торгового оборудования теряет объект драйвера:
.dll / .ocx) приводят к невозможности создания объекта драйвера в памяти.Разберем по шагам, как локализовать место сбоя в конфигураторе. Пройдем отладчиком цепь вызовов, отвечающих за инициализацию торгового оборудования.
В типовых решениях инициализация драйвера выполняется через модуль обслуживания торгового оборудования:
ОбъектДрайвера = Неопределено;
ОбработкаОбслуживания = Неопределено;
ПолучитьСерверТО().ПолучитьОбъектДрайвера(ФУ, ОбработкаОбслуживания, ОбъектДрайвера);
Если функция ПолучитьОбъектДрайвера не находит подключенное устройство в глобальных переменных сервера торгового оборудования, ОбработкаОбслуживания остается равной Неопределено.
В свою очередь, при вызове внутренней функции хранения данных сервера торгового оборудования ПолучитьПараметрСервераТО:
Функция ПолучитьПараметрСервераТО(ИмяПараметра, ТипПараметра)
Если мДанныеСервера = Неопределено Тогда
мДанныеСервера = Новый Структура;
КонецЕсли;
Результат = Неопределено;
мДанныеСервера.Свойство(ИмяПараметра, Результат);
Если Результат = Неопределено Тогда
Результат = Новый(Тип(ТипПараметра));
мДанныеСервера.Вставить(ИмяПараметра, Результат);
КонецЕсли;
Возврат Результат;
КонецФункции
Если таблица подключенного оборудования оказывается пустой, последующий вызов свойства фискализации вызывает исключение. Также возможна ошибка вида Метод объекта не обнаружен (Свойство) в случае, если вместо структуры параметров драйвер возвращает некорректный тип данных (например, пустую строку).
Если ошибка возникла после обновления драйверов ККТ, необходимо проверить их совместимость с доработанной конфигурацией. В частности, интеграция с новыми версиями драйверов АТОЛ (KKT 8.15.x и выше) в нетиповых конфигурациях 1С 8.2 часто требует коррекции обработок обслуживания.
Если ККТ отключается только после паузы в работе (например, через 2–3 часа простоя), причиной является автоматическое отключение питания USB-портов операционной системой.
Корневого USB-концентратора и Generic USB Hub.Для исключения сбоев локального кэша клиентского приложения выполните очистку временных файлов:
%LocalAppData%\1C\1Cv82
%AppData%\1C\1Cv82Посмотрим на программный способ предотвращения ошибки. В коде документа (например, ФормаДокумента у ПриходныйКассовыйОрдер) перед вызовом функции печати чека рекомендуется добавить явную проверку состояния объекта оборудования:
Если ОбработкаОбслуживания = Неопределено Или ОбъектДрайвера = Неопределено Тогда
// Повторно инициализируем и подключаем устройство
СтруктураПодключения = ПолучитьСерверТО().ПодключитьОборудование(КассаККМ);
Если СтруктураПодключения.Результат Тогда
ОбработкаОбслуживания = СтруктураПодключения.ОбработкаОбслуживания;
ОбъектДрайвера = СтруктураПодключения.ОбъектДрайвера;
Иначе
Предупреждение("Не удалось подключить торговое оборудование!");
Возврат;
КонецЕсли;
КонецЕсли;
ОшибкаТО = ОбработкаОбслуживания.ФискализироватьЧек(ОбъектДрайвера, ПараметрыЧека);
Такой подход гарантирует, что даже при временном разрыве связи или сбросе сеансовых переменных торговое оборудование будет повторно инициализировано перед отправкой команды на печать чека.