При интеграции торгового оборудования с решениями на платформе 1С разработчики часто сталкиваются с необходимостью получить детальную информацию о подключенной ККТ (контрольно-кассовой технике). Информация о версии прошивки критически важна при переходе на новые форматы фискальных данных (например, ФФД 1.2), внедрении маркировки товаров или поддержке новых ставок НДС. Стандартные методы БСП (Библиотеки стандартных подсистем) зачастую возвращают лишь общую информацию, вроде версии используемой внешней компоненты или версии загрузчика (bootloader), упуская фактический номер серии прошивки кассового аппарата.
В этой статье мы подробно рассмотрим, как программно прочитать версию прошивки ККТ Атол из кода 1С. Мы разберем решения как для современного драйвера АТОЛ ДТО 10, так и для устаревшего, но все еще популярного драйвера АТОЛ ДТО 8. Также мы заглянем "под капот" интеграции и проанализируем низкоуровневые команды протокола работы с кассой.
Современные конфигурации 1С используют для связи с кассой десятую версию драйверов (ДТО 10). В этой архитектуре взаимодействие с устройством происходит через Native-компоненту AddIn.Fptr10. Для получения версии прошивки ККТ Атол используется универсальный метод запроса данных queryData().
Рассмотрим пошагово рабочий пример кода на языке 1С для ДТО 10:
// Инициализируем и подключаем внешнюю компоненту АТОЛ ДТО 10
Попытка
ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАтолККТ10", "Atolfptr10");
Драйвер = Новый ("AddIn.Atolfptr10.Fptr10");
Исключение
// Резервный вариант инициализации через COM-объект, если компонента зарегистрирована в Windows
Попытка
Драйвер = Новый COMОбъект("AddIn.Fptr10");
Исключение
ВызватьИсключение "Не удалось подключить внешнюю компоненту АТОЛ ДТО 10!";
КонецПопытки;
КонецПопытки;
// Настройки связи (порт, скорость и т.д.) предполагаются установленными ранее.
// Открываем соединение с кассой
Драйвер.open();
Если Драйвер.isOpened() Тогда
// Шаг 1. Задаем тип запрашиваемых данных.
// Значение 10 соответствует константе LIBFPTR_DT_UNIT_VERSION (версия модуля ККТ)
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_DATA_TYPE, 10);
// Шаг 2. Указываем тип модуля, версию которого хотим прочитать.
// Значение 0 соответствует константе LIBFPTR_UT_FIRMWARE (ПО самой ККТ / Прошивка)
// Дополнительно: значение 1 — версия конфигурации (для Платформы 5.0), значение 4 — версия загрузчика
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_UNIT_TYPE, 0);
// Шаг 3. Вызываем метод запроса данных у ККТ
Драйвер.queryData();
// Шаг 4. Читаем полученную строку с версией прошивки из буфера драйвера
ВерсияПрошивки = Драйвер.getParamString(Драйвер.LIBFPTR_PARAM_UNIT_VERSION);
Сообщить("Успешно получена версия прошивки ККТ Атол: " + ВерсияПрошивки);
// Закрываем соединение с кассой для освобождения порта
Драйвер.close();
Иначе
Сообщить("Ошибка: Не удалось установить связь с кассовым аппаратом!");
КонецЕсли;
В этом примере метод setParam() последовательно подготавливает параметры для внутреннего запроса драйвера. Метод queryData() отправляет низкоуровневый запрос в ККТ, а функция getParamString() извлекает результирующую строку. Использование предопределенных числовых констант (10 для типа данных и 0 для типа модуля) гарантирует совместимость кода даже при отсутствии доступа к объектной модели драйвера в режиме реального времени.
Если вы работаете в устаревшей конфигурации на обычных формах (например, Управление торговлей 10.3) или даже используете платформу 1С v7.7, у вас, скорее всего, установлен драйвер ДТО 8. Работа с ним строится по иной схеме через COM-объект AddIn.FPrnM45 или AddIn.FPrnM8.
Для считывания версии прошивки в ДТО 8 кассу необходимо предварительно перевести в специальный режим программирования, иначе устройство отклонит запрос. Разберем по шагам логику работы этого метода:
// Создаем объект драйвера АТОЛ ДТО 8
Попытка
ККТ = Новый COMОбъект("AddIn.FPrnM45");
Исключение
ВызватьИсключение "Драйвер АТОЛ ДТО 8 не зарегистрирован в системе!";
КонецПопытки;
// Включаем связь с ККТ
ККТ.DeviceEnabled = 1;
Если ККТ.ResultCode = 0 Тогда
// Шаг 1. Устанавливаем пароль системного администратора (по умолчанию "30")
ККТ.Password = "30";
// Шаг 2. Задаем режим ККТ. Значение 4 соответствует "Режиму программирования"
ККТ.Mode = 4;
ККТ.SetMode(); // Применяем выбранный режим
Если ККТ.ResultCode = 0 Тогда
// Шаг 3. Устанавливаем тип запрашиваемого модуля.
// Значение 91 (в шестнадцатеричной системе 5B) отвечает за версию программного обеспечения кассы
ККТ.UnitType = 91;
// Шаг 4. Вызываем метод чтения версии модуля ККТ
ККТ.GetUnitVersion();
// Шаг 5. Получаем номер сборки/прошивки из свойства Ubuild
НомерПрошивки = ККТ.Ubuild;
Сообщить("Версия прошивки (сборка) ККТ: " + НомерПрошивки);
Иначе
Сообщить("Не удалось перевести ККТ в режим программирования. Ошибка: " + ККТ.ResultDescription);
КонецЕсли;
// Отключаем устройство
ККТ.DeviceEnabled = 0;
Иначе
Сообщить("Ошибка подключения кассы: " + ККТ.ResultDescription);
КонецЕсли;
Важным нюансом в работе с ДТО 8 является обязательный сброс состояния ККТ после выполнения операций. Обязательно устанавливайте свойство DeviceEnabled = 0 в конце работы вашего алгоритма, чтобы не блокировать порт кассы для других кассовых программ и сессий 1С.
Выясним, что происходит на физическом уровне при запросе версии прошивки. Драйвер АТОЛ транслирует наши высокоуровневые команды в бинарный поток байтов, отправляемый в COM-порт кассы. Если вы хотите обойти драйвер или запустить прямую команду нижнего уровня через 1С, вам понадобится знание протокола АТОЛ 3.1.
Запрос версии ПО кассы выполняется с помощью низкоуровневой команды 9D 91:
9D 91.55 00 03 00 00 65 92.65 92) представляют собой номер сборки прошивки в шестнадцатеричном или упакованном десятичном формате. Переведя эти байты в строку, мы получаем значение 6592, что соответствует версии прошивки ККТ.Проанализируем структуру вывода версий прошивок на разных поколениях кассовых аппаратов АТОЛ. Формат возвращаемой строки напрямую зависит от архитектурной платформы устройства:
3.0.XXXX (например, 3.0.1245 или 3.0.8530). Обратите внимание, что первые цифры 3.0 обычно указывают на версию загрузчика ККТ, а реальной версией самой прошивки (ID серии) являются последние четыре цифры после второй точки (в данном случае 1245 или 8530).5.X.XXXX (например, 5.8.3, 5.12.0). В Платформе 5.0 версией прошивки является вся возвращаемая строка целиком.Рассмотрим ситуацию, когда касса заблокирована, драйвер выдает ошибку монопольного доступа к порту, а версию прошивки нужно узнать здесь и сейчас. Для этого существует проверенный физический способ — печать чека "Информация о ККТ":
Кассовый аппарат распечатает сервисный документ. Найдите на этом чеке строку "ID СЕРИИ" (для Платформы 2.5) или блок "ПО ККТ" (для Платформы 5.0) — именно там будет напечатана точная версия текущей установленной прошивки ККТ.