При работе со старыми или нетиповыми конфигурациями 1С специалисты часто сталкиваются с крайне неприятным поведением кассовых аппаратов семейства Штрих-М (Штрих-М-ФР, Ритейл-01Ф и др.). Суть проблемы заключается в следующем: после обновления драйвера ККТ до версии 4.14.х или выше, либо при попытке перехода на новые ставки НДС, касса при открытии смены или пробитии первого чека сбрасывает вручную настроенную таблицу налоговых ставок. В результате этого 1С возвращает аппаратную ошибку FFFFFFF8h с текстом: "Смена открыта, программирование налогов невозможно". В этой статье мы подробно разберем природу этого явления и рассмотрим несколько надежных способов устранения проблемы.
Давайте разберем по шагам, что происходит на стыке платформы 1С и драйвера ККТ при инициализации оборудования. В устаревших версиях драйверов (серии 4.13) и старых интеграционных библиотеках (например, smDrvFR1CLib20.dll с ProgID "AddIn.SMDrvFR1C20") логика работы с налогами основывалась на постоянной перезаписи внутренней таблицы ККТ. Каждый раз при подключении кассового аппарата или при открытии смены 1С сверяла налоги в базе данных с Таблицей №6 ККТ ("Налоговые ставки"). Если выявлялось малейшее расхождение, 1С принудительно отправляла команду на перепрограммирование таблицы в ККТ.
Начиная с версий драйвера 4.14.х, производитель ужесточил требования к безопасности фискальных данных. Теперь при открытой смене любое прямое редактирование фискальных параметров (включая налоговые ставки в Таблице №6) заблокировано на уровне прошивки кассы и логики драйвера. Сценарий возникновения сбоя выглядит так:
Подключить() и сверяет налоги.FFFFFFF8h ("Смена открыта, программирование налогов невозможно"), так как смена на этот момент уже считается открытой в фискальном накопителе.Для решения этой проблемы необходимо либо полностью перестроить логику взаимодействия 1С с кассой, перейдя на новые стандарты передачи ставок непосредственно в XML-пакете чека, либо скорректировать внутренние настройки таблиц ККТ.
Если ваша конфигурация 1С глубоко доработана, и вы не имеете возможности оперативно обновить Библиотеку подключаемого оборудования (БПО) и переписать код, можно применить "ручной" метод блокировки автокоррекции непосредственно в памяти ККТ. Выполним этот процесс по шагам:
1). Принудительно установите значение этого поля в 0. Это запретит ККТ автоматически менять налоги при открытии смены.1800 (соответствует 18% или 20% в зависимости от прошивки)1000 (соответствует 10%)2000 (или 0% для старых конфигураций)0 (Без НДС)Дополнительно в настройках торгового оборудования внутри самой 1С настоятельно рекомендуется снять флаг "Закрывать смену для программирования налоговых ставок". Наличие этого флага заставляет систему совершать лишние и опасные операции с регистрами ККТ при каждой сессии связи.
Использование устаревших DLL-библиотек (таких как smDrvFR1CLib20.dll) обрекает систему на постоянные сбои при любых изменениях в законодательстве. Современный стандарт интеграции 1С с кассами Штрих-М предполагает передачу информации о налогах непосредственно в составе XML-чека (Тег 1102 "Ставка НДС") в виде конкретных кодов, вообще не затрагивая Таблицу №6 физического устройства.
Для правильной работы нам необходимо перевести систему на современную компоненту. Рассмотрим, как это сделать:
smDrvFR1CLib22.dll или smDrvFR1CLib24.dll (ProgID для подключения в коде изменится на "AddIn.SMDrvFR1C22" или "AddIn.SMDrvFR1C24" соответственно).ShtrihMkkt.epf).Новые версии компонент умеют корректно транслировать ставки НДС напрямую в фискальный документ, избавляя программиста от необходимости ручного сопоставления индексов налогов.
Если вы поддерживаете сильно измененную или полностью самописную конфигурацию, где подключение ККТ написано вручную через COM-объект драйвера, вам необходимо изменить подход к инициализации устройства. Проанализируем пример кода, который часто вызывает ошибку FFFFFFF8h:
// Устаревший опасный подход: принудительная инициализация свойств налогов при каждом подключении
ОбъектДрайвера.Tax1 = 18;
ОбъектДрайвера.Tax2 = 10;
ОбъектДрайвера.Tax3 = 20;
ОбъектДрайвера.Tax4 = 0;
// Попытка установить свойства в ККТ
Если ОбъектДрайвера.SetProperties() < 0 Тогда
Предупреждение("Ошибка программирования свойств ККТ: " + ОбъектДрайвера.ResultDescription);
КонецЕсли;
Чтобы избежать ошибки перепрограммирования налогов при открытой смене, необходимо обернуть вызов свойств в проверку текущего состояния смены ККТ. Проанализируем правильный шаблон инициализации:
// Безопасный подход с проверкой статуса смены ККТ Штрих-М
ОбъектДрайвера.GetECRStatus(); // Запрашиваем состояние кассы
// Проверяем режим работы ККТ
// Режим 2 - Смена открыта, менее 24 часов. Режим 3 - Смена открыта, более 24 часов.
СменаОткрыта = (ОбъектДрайвера.ECRMode = 2) Или (ОбъектДрайвера.ECRMode = 3);
Если Не СменаОткрыта Тогда
// Программирование таблиц налогов выполняем ТОЛЬКО при закрытой смене
ОбъектДрайвера.Tax1 = 18;
ОбъектДрайвера.Tax2 = 10;
ОбъектДрайвера.Tax3 = 20;
ОбъектДрайвера.Tax4 = 0;
ОбъектДрайвера.SetProperties();
Иначе
// Если смена уже открыта, просто подключаемся без попытки переписать налоги
ЗаписьЖурналаРегистрации("ПодключениеККТ", УровеньЖурналаРегистрации.Информация, , ,
"Подключение выполнено при открытой смене. Программирование таблиц пропущено во избежание блокировок.");
КонецЕсли;
При таком подходе касса никогда не выбросит исключение FFFFFFF8h посреди рабочего дня кассира, так как опасные команды изменения настроек будут выполняться строго во время регламентных процедур (например, в момент утреннего открытия кассовой смены до пробития первого фискального документа).