Как получить данные Z-отчета и сменной выручки напрямую через драйвер онлайн-кассы в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При автоматизации розничных точек часто возникает задача оперативного получения итоговых сумм смены (выручка, наличные, безналичные оплаты, внесения и выплаты) непосредственно из кассового аппарата (ККТ). Такая необходимость может появиться, если чеки пробиваются через внешнее кассовое ПО, а данные требуется загружать в учетную систему (например, в 1С:Управление торговлей 11 или 1С:Бухгалтерию предприятия 3.0) без ручного ввода с бумажного Z-отчета.

Разберем детально, как взаимодействовать с драйвером кассы напрямую, какие существуют особенности работы с COM-портами, как программно прочитать регистры ККТ и какие архитектурные альтернативы можно использовать.

Особенности блокировки COM-порта в 1С

Прежде чем отправлять команды к драйверу, проанализируем, как типовые конфигурации 1С работают с кассовым оборудованием:

  1. Работа через БПО (Библиотеку подключаемого оборудования): Начиная с версии БПО 2.0 при печати чеков или документов из обычных форм (документы ЧекККМ, ПриходныйКассовыйОрдер) порт ККТ занимается только на момент выполнения операции печати и сразу же освобождается. Это позволяет сторонним обработкам и тестам драйвера подключаться к аппарату в промежутках между пробитием документов.
  2. Режим РМК (Рабочее место кассира): Если на кассовом компьютере открыта форма РМК, типовая система удерживает монопольное соединение с COM-портом на все время работы формы. В этом случае прямое обращение из сторонней внешней обработки или параллельного сеанса завершится ошибкой доступа к порту.
  3. Выполнение в регламентных и фоновых заданиях: Важно помнить, что фоновые задания на стороне сервера 1С не имеют прямого доступа к локальным COM-портам и USB-устройствам клиентских ПК. Прямой опрос ККТ через фоновое задание возможен только тогда, когда касса подключена по локальной сети (Ethernet/Wi-Fi со статическим IP-адресом) либо опрос выполняется в контексте клиентского приложения (например, через обработчик ожидания ПодключитьОбработчикОжидания).

Программное закрытие смены и печать Z-отчета через драйвер

Рассмотрим пример программного снятия отчета с гашением (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-отчета?

Существует заблуждение, что после печати Z-отчета данные о выручке и видах оплаты полностью стираются и их невозможно восстановить из ККТ. Это не так. В онлайн-кассах формируется фискальный документ «Отчет о закрытии смены», который сохраняется в фискальном накопителе (ФН). Через драйвер всегда можно отправить команду чтения фискального документа по его номеру или номеру смены и получить итоговые суммы: наличные, безналичные (электронные), предоплаты и суммы налогов.

Альтернативные архитектурные решения

Если цель заключается в автоматической загрузке кассовых итогов в центральную базу (например, 1С:Бухгалтерия предприятия) с удаленных точек, прямое опрашивание COM-порта драйвера через регламентные задания может быть нестабильным. Рассмотрим более надежные альтернативы:

  1. Интеграция через REST API Оператора фискальных данных (ОФД): Поскольку все кассы передают чеки и отчеты о закрытии смен в ОФД, регламентное задание в 1С может по расписанию обращаться к облачному API вашего ОФД. По регистрационному номеру кассы забираются точные суммы закрытых смен без необходимости прямого подключения к физическому ПК.
  2. Локальный кассовый веб-сервер: Использование специализированных кассовых серверов (Web-сервер ККТ) позволяет организовать очередь запросов по протоколу HTTP/JSON. Это решает проблему монопольного захвата COM-порта между 1С и сторонними кассовыми программами.
  3. Обмен через файлы выгрузки: Если стороннее кассовое ПО формирует файл отчета о продажах при закрытии смены (JSON/XML), настраивается регламентный импорт этих файлов сетевым путем, исключая низкоуровневые вызовы драйвера.
← На главную