При интеграции фискальных регистраторов и контрольно-кассовой техники (ККТ) в нетиповые конфигурации или самописные учетные системы разработчики часто обращаются к коду типовых решений, таких как демонстрационная база 1С:Розницы или Библиотека подключаемого оборудования (БПО). В процессе отладки подключения кассы (например, АТОЛ FPrint-22ПТК или АТОЛ 55Ф) можно столкнуться с неожиданным поведением: при установке скорости порта 115200 бод в метод драйвера передается числовое значение 18.
Посмотрим на типовую строку вызова метода внешней компоненты:
ОбъектДрайвера.УстановитьПараметр(ИмяПараметра, ЗначениеПараметра);
Если в точке останова значение переменной ИмяПараметра равно "BaudRate", а ЗначениеПараметра содержит 18, возникает закономерный вопрос: почему драйвер требует условный индекс вместо реальной скорости передачи данных? Выясним причину такого поведения и разберем, как правильно управлять параметрами связи с торговым оборудованием.
Традиционные внешние компоненты, разработанные по историческому стандарту интеграции торгового оборудования с 1С, не принимают физическую скорость порта в виде числа 115200. Вместо этого разработчики драйверов ККТ заложили внутреннюю перечислимую таблицу (enum), где каждой стандартной скорости сопоставлен свой целочисленный идентификатор.
В прошивках и классических драйверах оборудования АТОЛ используется следующая фиксированная таблица индексов:
Попытка передать в метод УстановитьПараметр("BaudRate", 115200) для таких компонент завершается ошибкой «Некорректное значение параметра» или отказом в установке связи. Именно поэтому в отладчике мы наблюдаем число 18: конфигурация передает внутренний индекс, соответствующий максимальной скорости обмена 115200 бод.
Разберем механизм, благодаря которому пользователь в экранных формах видит привычные значения «115 200», а драйвер получает служебные числа. Стандарт разработки драйверов «1С:Совместимо» предусматривает обязательный метод ПолучитьПараметры() (или GetParameters() в англоязычном варианте).
При вызове этого метода внешняя компонента возвращает XML-документ, полностью описывающий все поддерживаемые параметры, их типы, умолчания и списки допустимых вариантов. Для списочных параметров внутри XML формируются элементы со следующей структурой:
18);"115 200").Типовые механизмы БПО при открытии формы настройки считывают этот XML, заполняют выпадающий список значениями и представлениями, а при сохранении настройки отправляют в базу и передают в оборудование именно поле Value.
Проанализируем контекст используемых библиотек, поскольку способ передачи параметров напрямую зависит от поколения драйвера:
18 для 115200). Эти драйверы считаются устаревшими, не поддерживают актуальный формат фискальных данных ФФД 1.2 и обязательную маркировку товаров по 54-ФЗ.115200) либо упаковываются в JSON-структуру настроек связи.Если вы разрабатываете интеграцию с нуля под требования 54-ФЗ и маркированную продукцию, рекомендуется сразу ориентироваться на компоненты стандарта DTO 10, где подобные таблицы соответствий ушли в прошлое.
При настройке обмена с ККТ следует помнить о технических ограничениях:
"BaudRate" и "Baudrate" для компоненты являются абсолютно разными свойствами. Передача имени с неверным регистром приведет к игнорированию параметра.BaudRate является номинальным требованием драйвера. Однако при подключении через физический кабель RS-232 скорость должна строго совпадать в трех точках: в настройках самой ККТ (таблицы кассы), в свойствах диспетчера устройств операционной системы и в параметрах драйвера 1С.Рассмотрим способы корректной организации кода для работы со скоростью порта в собственной конфигурации.
Если в конфигурации используется простая интеграция под конкретную компоненту старого стандарта, создадим программное соответствие физических скоростей их кодам:
Функция ПолучитьКодСкоростиАтол(СкоростьЧислом)
ТаблицаСкоростей = Новый Соответствие;
ТаблицаСкоростей.Вставить(1200, 3);
ТаблицаСкоростей.Вставить(2400, 4);
ТаблицаСкоростей.Вставить(4800, 5);
ТаблицаСкоростей.Вставить(9600, 7);
ТаблицаСкоростей.Вставить(14400, 9);
ТаблицаСкоростей.Вставить(19200, 10);
ТаблицаСкоростей.Вставить(38400, 12);
ТаблицаСкоростей.Вставить(57600, 14);
ТаблицаСкоростей.Вставить(115200, 18);
КодСкорости = ТаблицаСкоростей[СкоростьЧислом];
Если КодСкорости = Неопределено Тогда
КодСкорости = 18; // Значение по умолчанию для 115200
КонецЕсли;
Возврат КодСкорости;
КонецФункции
// Пример установки параметра перед открытием сессии связи
КодСкорости = ПолучитьКодСкоростиАтол(115200);
ОбъектДрайвера.УстановитьПараметр("BaudRate", КодСкорости);
Более надежный и универсальный подход заключается в вызове метода ПолучитьПараметры() с последующей обработкой полученной XML-строки через объект платформы ЧтениеXML. Это позволяет динамически определить, что именно ожидает загруженная внешняя компонента — реальное число или служебный код, предотвращая ошибки при обновлении версий драйвера на рабочих местах пользователей.