При автоматизации розничной торговли часто возникает необходимость программно узнать номер текущей смены ККМ (фискального регистратора). Это требуется для заполнения отчетов, сверки данных с информационной базой 1С или контроля работы кассиров. Разберем подробно, как решить эту задачу в различных конфигурациях 1С и для разных моделей контрольно-кассовой техники (ККТ).
Очень часто разработчики сталкиваются с ошибкой "Метод объекта не обнаружен" при попытке вызвать стандартные команды кассы, такие как ПолучитьСостояниеККМ() или FNGetCurrentSessionParams(). Выясним причину этой проблемы.
Дело в том, что в системе могут использоваться два разных типа внешних компонент:
AddIn.DrvFR1C). Это специализированная "прокладка", разработанная под требования стандартов 1С. У нее усеченный набор методов, предназначенный только для выполнения стандартных операций (пробитие чека, открытие/закрытие смены). Низкоуровневых команд работы с регистрами кассы в ней попросту нет.AddIn.DrvFR для Штрих-М). Это полнофункциональный COM/ActiveX-объект, предоставляющий прямой доступ ко всем аппаратным возможностям кассового аппарата. Именно через него нужно получать технологические параметры ККТ напрямую.Если вы работаете в исторической конфигурации на обычных формах (например, 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С.
Если вы работаете в современных конфигурациях на управляемых формах (ERP 2, Комплексная автоматизация 2, УТ 11, Розница 3, Бухгалтерия предприятия 3), использовать прямые COM-объекты крайне нежелательно. Это может вызвать проблемы с правами доступа, разрядностью платформы (32/64-бит) и полностью исключит работу в веб-клиенте или под управлением Linux.
В современных конфигурациях используется Библиотека подключаемого оборудования (БПО). Мы можем обратиться к менеджеру оборудования для получения параметров ККТ в универсальном виде, независимо от того, подключен у вас Штрих-М, АТОЛ или касса другого производителя.
Разберем пример кода для получения параметров ККТ через механизмы БПО:
&НаКлиенте
Процедура ПолучитьНомерСменыБПО()
// Получаем список подключенного фискального оборудования
МассивОборудования = ПолучитьСписокПодключенногоОборудования();
Если МассивОборудования.Количество() = 0 Тогда
Предупреждение("Нет подключенного оборудования типа 'Фискальный регистратор'.");
Возврат;
КонецЕсли;
ИдентификаторУстройства = МассивОборудования[0]; // Берем первое активное устройство
// Подготавливаем параметры для выполнения команды драйвера
ПараметрыКоманды = Новый Массив;
РезультатВыполнения = Неопределено;
// Выполняем стандартную команду получения параметров ККТ
Отказ = МенеджерОборудованияКлиент.ВыполнитьКоманду(
ИдентификаторУстройства,
"GetDeviceParameters",
ПараметрыКоманды,
РезультатВыполнения
);
Если Не Отказ И РезультатВыполнения <> Неопределено Тогда
// РезультатВыполнения.ВыходныеПараметры возвращает массив с данными от ККТ.
// Структура массива зависит от конкретной версии БПО, обычно номер смены доступен в свойствах.
Попытка
НомерСмены = РезультатВыполнения.ВыходныеПараметры[0];
Сообщить("Успешно получен номер смены ККТ: " + НомерСмены);
Исключение
Сообщить("Не удалось прочитать номер смены из выходных параметров устройства.");
КонецПопытки;
Иначе
Сообщить("Не удалось выполнить команду на ККТ.");
КонецЕсли;
КонецПроцедуры
Данный подход гарантирует стабильную кроссплатформенную работу и избавляет разработчика от необходимости знать низкоуровневые команды каждого отдельного производителя кассовой техники.
Для полноты картины рассмотрим, как получить номер смены у другого популярного производителя ККТ — компании АТОЛ, используя актуальную версию драйвера ДТО 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 — истекла).
Подводя итог, выделим ключевые правила работы с получением параметров смены ККТ:
AddIn.DrvFR и используйте современный метод работы с фискальным накопителем FNGetCurrentSessionParams().ВыполнитьКоманду() у менеджера оборудования, передавая команду GetDeviceParameters.Попытка ... Исключение, так как касса может быть выключена, отключена от ПК, либо порт может быть занят другим процессом.