Как программно получить номер смены ККМ в 1С:Предприятие

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

При автоматизации розничной торговли часто возникает необходимость программно узнать номер текущей смены ККМ (фискального регистратора). Это требуется для заполнения отчетов, сверки данных с информационной базой 1С или контроля работы кассиров. Разберем подробно, как решить эту задачу в различных конфигурациях 1С и для разных моделей контрольно-кассовой техники (ККТ).

В чем сложность: разница между родными драйверами и прокладками 1С

Очень часто разработчики сталкиваются с ошибкой "Метод объекта не обнаружен" при попытке вызвать стандартные команды кассы, такие как ПолучитьСостояниеККМ() или FNGetCurrentSessionParams(). Выясним причину этой проблемы.

Дело в том, что в системе могут использоваться два разных типа внешних компонент:

  1. Интеграционная компонента 1С (например, AddIn.DrvFR1C). Это специализированная "прокладка", разработанная под требования стандартов 1С. У нее усеченный набор методов, предназначенный только для выполнения стандартных операций (пробитие чека, открытие/закрытие смены). Низкоуровневых команд работы с регистрами кассы в ней попросту нет.
  2. Родной драйвер производителя (например, AddIn.DrvFR для Штрих-М). Это полнофункциональный COM/ActiveX-объект, предоставляющий прямой доступ ко всем аппаратным возможностям кассового аппарата. Именно через него нужно получать технологические параметры ККТ напрямую.

Решение 1. Прямое обращение к ККТ Штрих-М через COM-объект (для обычных форм)

Если вы работаете в исторической конфигурации на обычных формах (например, 1С:Управление производственным предприятием 1.3, 1С:Управление торговлей 10.3 или 1С:Комплексная автоматизация 1.1), наиболее надежным и быстрым способом будет прямое подключение к драйверу "Штрих-М".

После введения онлайн-касс (54-ФЗ) и фискальных накопителей (ФН) вместо старого метода GetECRStatus() (ПолучитьСостояниеККМ) рекомендуется использовать метод FNGetCurrentSessionParams(). Он обращается напрямую к фискальному накопителю ККТ.

Рассмотрим по шагам программный код для реализации этой задачи:


// Функция инициализирует подключение к ККМ Штрих-М и возвращает структуру с параметрами смены
Функция ПолучитьПараметрыСменыШтрихМ() Экспорт
    
    Результат = Новый Структура("Успех, НомерСмены, СтатусСмены, ОписаниеОшибки", Ложь, 0, 0, "");
    
    // 1. Попытка загрузить внешнюю компоненту драйвера
    Попытка
        ПодключитьВнешнююКомпоненту("AddIn.DrvFR");
        ФР = Новый COMОбъект("AddIn.DrvFR");
    Исключение
        Результат.ОписаниеОшибки = "Не удалось загрузить драйвер AddIn.DrvFR. Проверьте установку ПО Штрих-М.";
        Возврат Результат;
    КонецПопытки;
    
    // 2. Установка параметров связи и подключение
    // Пароль системного администратора по умолчанию обычно равен 30
    ФР.Password = 30; 
    ФР.Connect();
    
    Если ФР.ResultCode <> 0 Тогда
        Результат.ОписаниеОшибки = "Ошибка подключения: " + ФР.ResultCodeDescription;
        Возврат Результат;
    КонецЕсли;
    
    // 3. Запрос параметров текущей сессии фискального накопителя
    КодРезультата = ФР.FNGetCurrentSessionParams();
    
    Если КодРезультата = 0 Тогда
        Результат.Успех = Истина;
        // SessionNumber возвращает номер текущей открытой смены (или последней закрытой, если смена закрыта)
        Результат.НомерСмены = ФР.SessionNumber; 
        // FNSessionState: 1 - смена закрыта, 2 - смена открыта, 3 - смена истекла (более 24 часов)
        Результат.СтатусСмены = ФР.FNSessionState; 
    Иначе
        Результат.ОписаниеОшибки = "Ошибка получения параметров ФН: " + ФР.ResultCodeDescription;
    КонецЕсли;
    
    // 4. Обязательно отключаемся от оборудования, освобождая COM-порт
    ФР.Disconnect();
    
    Возврат Результат;
КонецФункции

Проанализируем этот код: мы используем объект AddIn.DrvFR, подключаемся к кассе, передаем пароль администратора (по умолчанию 30), запрашиваем параметры методом FNGetCurrentSessionParams() и считываем свойство SessionNumber. В конце обязательно вызываем метод Disconnect(), чтобы не заблокировать порт для других приложений или сессий 1С.


Решение 2. Современный универсальный подход через БПО (для управляемых форм)

Если вы работаете в современных конфигурациях на управляемых формах (ERP 2, Комплексная автоматизация 2, УТ 11, Розница 3, Бухгалтерия предприятия 3), использовать прямые COM-объекты крайне нежелательно. Это может вызвать проблемы с правами доступа, разрядностью платформы (32/64-бит) и полностью исключит работу в веб-клиенте или под управлением Linux.

В современных конфигурациях используется Библиотека подключаемого оборудования (БПО). Мы можем обратиться к менеджеру оборудования для получения параметров ККТ в универсальном виде, независимо от того, подключен у вас Штрих-М, АТОЛ или касса другого производителя.

Разберем пример кода для получения параметров ККТ через механизмы БПО:


&НаКлиенте
Процедура ПолучитьНомерСменыБПО()
    
    // Получаем список подключенного фискального оборудования
    МассивОборудования = ПолучитьСписокПодключенногоОборудования();
    Если МассивОборудования.Количество() = 0 Тогда
        Предупреждение("Нет подключенного оборудования типа 'Фискальный регистратор'.");
        Возврат;
    КонецЕсли;
    
    ИдентификаторУстройства = МассивОборудования[0]; // Берем первое активное устройство
    
    // Подготавливаем параметры для выполнения команды драйвера
    ПараметрыКоманды = Новый Массив;
    РезультатВыполнения = Неопределено;
    
    // Выполняем стандартную команду получения параметров ККТ
    Отказ = МенеджерОборудованияКлиент.ВыполнитьКоманду(
        ИдентификаторУстройства, 
        "GetDeviceParameters", 
        ПараметрыКоманды, 
        РезультатВыполнения
    );
    
    Если Не Отказ И РезультатВыполнения <> Неопределено Тогда
        // РезультатВыполнения.ВыходныеПараметры возвращает массив с данными от ККТ.
        // Структура массива зависит от конкретной версии БПО, обычно номер смены доступен в свойствах.
        Попытка
            НомерСмены = РезультатВыполнения.ВыходныеПараметры[0];
            Сообщить("Успешно получен номер смены ККТ: " + НомерСмены);
        Исключение
            Сообщить("Не удалось прочитать номер смены из выходных параметров устройства.");
        КонецПопытки;
    Иначе
        Сообщить("Не удалось выполнить команду на ККТ.");
    КонецЕсли;
    
КонецПроцедуры

Данный подход гарантирует стабильную кроссплатформенную работу и избавляет разработчика от необходимости знать низкоуровневые команды каждого отдельного производителя кассовой техники.


Решение 3. Прямое обращение к ККТ АТОЛ через ДТО 10

Для полноты картины рассмотрим, как получить номер смены у другого популярного производителя ККТ — компании АТОЛ, используя актуальную версию драйвера ДТО 10 напрямую через COM-объект AddIn.Fptr10:


Функция ПолучитьНомерСменыАтол() Экспорт
    
    Попытка
        Драйвер = Новый COMОбъект("AddIn.Fptr10");
    Исключение
        Сообщить("Драйвер АТОЛ 10 не установлен в системе.");
        Возврат Неопределено;
    КонецПопытки;
    
    // Открываем соединение с кассой по настройкам по умолчанию драйвера
    Драйвер.open();
    
    Если Не Драйвер.isOpened() Тогда
        Сообщить("Не удалось открыть соединение с ККТ АТОЛ.");
        Возврат Неопределено;
    КонецЕсли;
    
    // Задаем параметр запроса - состояние смены
    Драйвер.setParam(Драйвер.LIBFPTR_PARAM_DATA_TYPE, Драйвер.LIBFPTR_DT_SHIFT_STATE);
    Драйвер.queryData();
    
    // Извлекаем параметры из ответа кассы
    НомерСмены = Драйвер.getParamInt(Драйвер.LIBFPTR_PARAM_SHIFT_NUMBER);
    СтатусСмены = Драйвер.getParamInt(Драйвер.LIBFPTR_PARAM_SHIFT_STATE);
    
    // Закрываем соединение
    Драйвер.close();
    
    Возврат Новый Структура("НомерСмены, СтатусСмены", НомерСмены, СтатусСмены);
    
КонецФункции

В этом примере мы используем структуру ДТО 10. Метод queryData() отправляет запрос к ККТ, после чего с помощью getParamInt() мы забираем целочисленные значения номера смены и ее состояния (где 1 — закрыта, 2 — открыта, 3 — истекла).

Резюме для разработчика

Подводя итог, выделим ключевые правила работы с получением параметров смены ККТ:

← На главную