При автоматизации розничных точек часто возникает задача оперативного получения итоговых сумм смены (выручка, наличные, безналичные оплаты, внесения и выплаты) непосредственно из кассового аппарата (ККТ). Такая необходимость может появиться, если чеки пробиваются через внешнее кассовое ПО, а данные требуется загружать в учетную систему (например, в 1С:Управление торговлей 11 или 1С:Бухгалтерию предприятия 3.0) без ручного ввода с бумажного Z-отчета.
Разберем детально, как взаимодействовать с драйвером кассы напрямую, какие существуют особенности работы с COM-портами, как программно прочитать регистры ККТ и какие архитектурные альтернативы можно использовать.
Прежде чем отправлять команды к драйверу, проанализируем, как типовые конфигурации 1С работают с кассовым оборудованием:
ЧекККМ, ПриходныйКассовыйОрдер) порт ККТ занимается только на момент выполнения операции печати и сразу же освобождается. Это позволяет сторонним обработкам и тестам драйвера подключаться к аппарату в промежутках между пробитием документов.ПодключитьОбработчикОжидания).Рассмотрим пример программного снятия отчета с гашением (Z-отчета) через вызов низкоуровневых методов драйвера ККТ. Для взаимодействия с драйвером используется COM-объект:
Процедура СнятьОтчетСГашением()
// Инициализация объекта драйвера ККТ
ФР = СоздатьОбъект("AddIn.FprnM45");
// Занимаем порт устройства
ФР.DeviceEnabled = 1;
Если ФР.ResultCode <> 0 Тогда
Сообщить("Не удалось занять порт ККТ: " + ФР.ResultDescription, "!");
Возврат;
КонецЕсли;
// Проверяем, открыта ли смена
Если ФР.SessionOpened = 1 Тогда
// Вход в режим снятия отчетов с гашением (Mode = 3)
ФР.Mode = 3;
ФР.SetMode();
// Установка типа отчета (1 - Z-отчет с гашением)
ФР.ReportType = 1;
ФР.Report();
Сообщить("Смена успешно закрыта, Z-отчет распечатан.");
Иначе
Предупреждение("Кассовая смена не открыта!", 60);
КонецЕсли;
// Обязательно освобождаем порт после выполнения команд
ФР.DeviceEnabled = 0;
КонецПроцедуры
Чтобы зафиксировать выручку, суммы внесений и изъятий программно до или в момент закрытия смены, необходимо опросить внутренние регистры кассового аппарата. В фискальных регистраторах параметры смены и последнего чека доступны через метод GetRegister().
Посмотрим на пример извлечения информации из регистров оборудования:
// Подключаемся к устройству
ОбъектECR.DeviceEnabled = 1;
Если ОбъектECR.ResultCode = 0 Тогда
// Указываем номер целевого регистра ККТ
// Например, опрос регистра параметров фискального документа
ОбъектECR.RegisterNumber = 51;
ОбъектECR.GetRegister();
// Считываем значения параметров
НомерЧека = ОбъектECR.НомерДокумента;
НомерФД = ОбъектECR.ФискальныйПризнак;
СуммаЧека = ОбъектECR.Сумма;
// Освобождаем устройство
ОбъектECR.DeviceEnabled = 0;
КонецЕсли;
Обратите внимание: Номера регистров зависят от конкретной модели ККТ (Атол, Штрих-М) и версии прошивки. В современных онлайн-кассах с актуальными драйверами (ДТО 10) прямое чтение регистров заменяется специализированными методами запроса состояния смены и итоговых фискальных счетчиков, либо получением структуры закрытия смены в формате JSON.
Существует заблуждение, что после печати Z-отчета данные о выручке и видах оплаты полностью стираются и их невозможно восстановить из ККТ. Это не так. В онлайн-кассах формируется фискальный документ «Отчет о закрытии смены», который сохраняется в фискальном накопителе (ФН). Через драйвер всегда можно отправить команду чтения фискального документа по его номеру или номеру смены и получить итоговые суммы: наличные, безналичные (электронные), предоплаты и суммы налогов.
Если цель заключается в автоматической загрузке кассовых итогов в центральную базу (например, 1С:Бухгалтерия предприятия) с удаленных точек, прямое опрашивание COM-порта драйвера через регламентные задания может быть нестабильным. Рассмотрим более надежные альтернативы: