При адаптации старых и нетиповых конфигураций 1С для работы с современными онлайн-кассами (например, Атол 55Ф) разработчики часто сталкиваются с путаницей в API. Пытаясь найти документацию по методу вида ОбъектДрайвера.ЗакрытьСмену(...) в официальных руководствах интегратора от компании Атол, программисты не находят таких вызовов. Выясним причину этой проблемы, разберем архитектурные уровни взаимодействия 1С с кассовой техникой и рассмотрим правильные способы отправки команд на ККТ.
Проанализируем структуру взаимодействия 1С и кассового аппарата. Существуют два принципиально разных подхода к интеграции:
ЗакрытьСмену, а также ОткрытьСмену, СформироватьЧек и НапечататьОтчетБезГашения являются методами унифицированного программного интерфейса, разработанного фирмой 1С («Требования к разработке драйверов подключаемого оборудования»). В этом случае 1С обращается к внешней компоненте-обертке, которая транслирует высокоуровневые вызовы и XML-пакеты в низкоуровневые команды конкретного фискального регистратора.AddIn.Fptr10), в нем нет высокоуровневого метода ЗакрытьСмену с сигнатурой 1С. В зависимости от поколения драйвера управление сменой и печать отчетов выполняются либо вызовом специализированных методов (openShift, fnReport), либо передачей структурированных JSON-заданий через метод processJson.Рассмотрим случай, когда в конфигурации используется внешняя компонента, сертифицированная фирмой 1С. В таком стандарте сигнатура метода закрытия смены строго регламентирована и выглядит следующим образом:
Результат = ОбъектДрайвера.ЗакрытьСмену(ИДУстройства, Кассир, НомерСмены, НомерДокумента);
Разберем назначение передаваемых параметров:
ИДУстройства — строковый или числовой идентификатор подключенного экземпляра оборудования, полученный при открытии сессии с устройством.Кассир — строка с ФИО и должностью ответственного лица, выполняющего операцию закрытия смены (тег 1021).НомерСмены — выходной параметр, в который драйвер возвращает номер закрытой смены.НомерДокумента — выходной параметр, принимающий номер фискального документа (Z-отчета) из фискального накопителя.Посмотрим на практический пример вызова метода закрытия смены с обработкой результата:
НомерСмены = 0;
НомерДокумента = 0;
ИмяКассира = "Иванов И.И., Администратор";
Результат = ОбъектДрайвера.ЗакрытьСмену(ПараметрыПодключения.ИДУстройства, ИмяКассира, НомерСмены, НомерДокумента);
Если Результат Тогда
Сообщить("Смена успешно закрыта. Номер смены: " + Строка(НомерСмены) + ", Номер ФД: " + Строка(НомерДокумента));
Иначе
ОписаниеОшибки = "";
ОбъектДрайвера.ПолучитьОшибку(ОписаниеОшибки);
ВызватьИсключение "Ошибка закрытия смены: " + ОписаниеОшибки;
КонецЕсли;
Если старая конфигурация не содержит механизмов БПО и вы интегрируете кассу напрямую через драйвер Атол 10-й версии (ДТО 10), самым надежным и современным способом является передача заданий через метод processJson. Драйвер самостоятельно формирует реквизиты в соответствии с ФФД и управляет протоколом обмена с кассой.
Разберем пример прямого закрытия смены через объект AddIn.Fptr10:
Драйвер = Новый COMОбъект("AddIn.Fptr10");
// Устанавливаем соединение с кассой
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_MODEL, Строка(Драйвер.LIBFPTR_MODEL_ATOL_55F));
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_PORT, Строка(Драйвер.LIBFPTR_PORT_USB));
Драйвер.applySingleSettings();
Драйвер.open();
Если Драйвер.isOpened() Тогда
// Формируем JSON-задание на закрытие смены (Z-отчет)
ТекстJSON =
"{" +
" ""type"": ""closeShift""," +
" ""operator"": {" +
" ""name"": ""Иванов И.И.""," +
" ""vatin"": ""123456789012""" +
" }" +
"}";
// Передаем задание в метод драйвера
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_JSON_DATA, ТекстJSON);
Драйвер.processJson();
// Проверяем результат выполнения
Если Драйвер.errorCode() = 0 Тогда
Сообщить("Смена на ККТ Атол успешно закрыта.");
Иначе
Сообщить("Ошибка ККТ: " + Драйвер.errorDescription());
КонецЕсли;
Драйвер.close();
КонецЕсли;
Проанализируем ключевые моменты, на которые необходимо обратить внимание при доработке конфигурации:
ПодключитьВнешнююКомпоненту.