При интеграции торгового оборудования с платформой 1С программисты часто сталкиваются со специфическим поведением внешних компонент. Одной из крайне неприятных проблем при переходе на драйверы торгового оборудования АТОЛ версии 10.5.0.0 (компонента fptr10_1c_win32_10_5_0_0) стал баг, при котором свойство ShiftState (статус смены) всегда возвращало значение 1 (смена закрыта). Это происходило вне зависимости от реального состояния кассового аппарата — даже если смена на ККТ была открыта и по ней велись активные продажи.
Для торговых систем корректное определение статуса смены критически важно. К примеру, если 1С считает, что смена закрыта, она может заблокировать пробитие чека или попытаться инициировать процедуру открытия смены повторно, что приведет к ошибкам на стороне ККТ и остановке работы кассира. В рамках данной статьи мы подробно разберем, почему возникает эта ошибка и какие существуют практические способы ее решения.
Проанализируем архитектуру интеграции. В версии драйвера DTO 10.5.0.0 разработчики АТОЛ допустили внутреннюю ошибку при передаче параметров состояния смены через метод ПолучитьТекущееСостояние (GetCurrentStatus). Внешняя компонента для 1С принудительно возвращала флаг закрытой смены, полностью игнорируя реальный XML-отчет ККТ.
Помимо этого, в данной версии компоненты наблюдались сопутствующие проблемы:
ПолучитьОписание (GetDescription) вызывал аварийное завершение работы или выдавал ошибку, если на клиентском компьютере использовалась только библиотека интеграции 1С, но не был полностью установлен основной дистрибутив драйвера АТОЛ.Ниже рассмотрим три основных способа решения проблемы: от официального обновления до программных обходов.
Выясним наиболее надежный путь устранения неисправности. Разработчики АТОЛ оперативно признали данную проблему и исправили ее в следующем минорном релизе — DTO 10.5.1.0 (и выше). В официальном списке изменений этой версии было зафиксировано исправление работы метода ПолучитьТекущееСостояние.
Для исправления проблемы по официальному сценарию нам необходимо выполнить следующие шаги:
Рассмотрим ситуацию, когда быстро обновить конфигурацию 1С или версию БПО (Библиотеки подключаемого оборудования) невозможно. В период активного перехода на форматы фискальных данных ФФД 1.05 у многих пользователей оставались старые конфигурации на базе БПО 2.5. При этом новые требования обязывали передавать теги покупателя (1227, 1228 и др.), которые официально поддерживались только в БПО 3.1.
Для решения этого противоречия программист Андрей Карпов разработал кастомную сборку внешней компоненты под названием fptr10_1c_win32_0_0_0_237.dll. Эта компонента является своеобразным "мостом": она позволяет работать со старыми требованиями интеграции (БПО 2.5), но при этом корректно передавать новые теги на драйвере DTO 10.5.0.0 и правильно транслировать статус смены ShiftState.
Чтобы задействовать этот вариант, выполним следующие действия:
fptr10_1c_win32_0_0_0_237.dll.Посмотрим на пример адаптации кода при инициализации альтернативной компоненты:
// Пример подключения альтернативной ВК в коде 1С
ИмяФайлаКомпоненты = "ОбщийМакет.КомпонентаАтол10_Карпов";
РезультатПодключения = ПодключитьВнешнююКомпоненту(ИмяФайлаКомпоненты, "AtolDrivers10", ТипВнешнейКомпоненты.Native);
Если РезультатПодключения Тогда
ДрайверККТ = Новый ("AddIn.AtolDrivers10.Fptr10");
// Успешно инициализировано, переходим к настройке параметров связи
ДрайверККТ.УстановитьСвойство("Port", 3); // Принудительный выбор порта
ДрайверККТ.УстановитьСвойство("BaudRate", 115200);
ДрайверККТ.ОткрытьКод();
Иначе
Предупреждение("Не удалось загрузить альтернативную компоненту АТОЛ 10!");
КонецЕсли;
Проанализируем ситуацию, когда у вас нет возможности прямо сейчас менять компоненты или обновлять драйверы на рабочих местах (например, кассы находятся на удаленных торговых точках с плохим интернетом). В этом случае можно временно обойти ограничение программным путем непосредственно в коде 1С.
Суть метода заключается в том, чтобы отказаться от опроса физического состояния ККТ через метод ShiftState, а вместо этого анализировать данные информационной базы 1С. Мы можем проверять наличие и статус проведения документов открытия и закрытия кассовой смены за текущие сутки.
Рассмотрим пример реализации функции проверки статуса смены без обращения к ККТ:
Функция ПолучитьПрограммныйСтатусСмены(КассаККМ, РабочееМесто) Экспорт
// Инициализируем статус по умолчанию (1 - смена закрыта, 0 - смена открыта)
РезультатСтатуса = 1;
ТекущаяДата = ТекущаяДатаСеанса();
НачалоДня = НачалоДня(ТекущаяДата);
КонецДня = КонецДня(ТекущаяДата);
// Запрашиваем состояние кассовой смены из регистров или документов 1С
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КассоваяСмена.Статус КАК СтатусСмены,
| КассоваяСмена.ДатаОткрытия КАК ДатаОткрытия
|ИЗ
| Документ.КассоваяСмена КАК КассоваяСмена
|ГДЕ
| КассоваяСмена.КассаККМ = &КассаККМ
| И КассоваяСмена.РабочееМесто = &РабочееМесто
| И КассоваяСмена.Проведен = ИСТИНА
| И КассоваяСмена.ДатаОткрытия МЕЖДУ &НачалоДня И &КонецДня
|
|УПОРЯДОЧИТЬ ПО
| КассоваяСмена.ДатаОткрытия УБЫВ";
Запрос.УстановитьПараметр("КассаККМ", КассаККМ);
Запрос.УстановитьПараметр("РабочееМесто", РабочееМесто);
Запрос.УстановитьПараметр("НачалоДня", НачалоДня);
Запрос.УстановитьПараметр("КонецДня", КонецДня);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Если СодержитПредопределенныйСтатусОткрыта(Выборка.СтатусСмены) Тогда
// Если в базе 1С смена числится открытой
РезультатСтатуса = 0;
КонецЕсли;
КонецЕсли;
Возврат РезультатСтатуса;
КонецФункции
Функция СодержитПредопределенныйСтатусОткрыта(Статус)
// В зависимости от конфигурации (Розница, УТ, УНФ) статус может быть перечислением
Возврат Статус = Перечисления.СтатусыКассовыхСмен.Открыта;
КонецФункции
При использовании программного метода проверки обязательно учитывайте человеческий фактор: если кассир забыл закрыть смену вчера, реальное время работы ККТ превысит 24 часа. Физически касса заблокируется и откажется пробивать чеки, хотя программный статус в 1С на следующий день может показать, что "смена закрыта" (так как за новые сутки документов нет). Поэтому данный костыль рекомендуется применять только как временную меру до планового обновления драйверов.
Подводя итоги, отметим, что баг со значением ShiftState в компоненте АТОЛ 10.5.0.0 доставил немало трудностей разработчикам в 2019 году. Тем не менее, наиболее рациональным и долгосрочным решением сегодня является переход на стабильные релизы драйверов АТОЛ (начиная с версии 10.5.1.0 и старше, вплоть до актуальных версий линейки 10.10.x), где этот дефект был полностью устранен разработчиками платформы ДТО.