При интеграции торгового оборудования, в частности фискальных регистраторов и ККТ производства «Штрих-М», разработчики часто сталкиваются с необходимостью сетевого подключения устройств. Переход с классического интерфейса RS-232 (COM-порт) или прямого USB-подключения на работу по протоколу TCP/IP (через Ethernet, Wi-Fi или виртуальный сетевой адаптер RNDIS) позволяет вынести кассу за пределы рабочего места кассира или организовать совместный доступ к ней.
Однако при попытке настроить такое подключение программно из кода 1С через COM-объект драйвера AddIn.DrvFR возникает распространенная проблема: метод вызова окна свойств драйвера ShowProperties() упрямо игнорирует переданный в коде IP-адрес, подставляя вместо него локальное имя компьютера пользователя. При этом попытка вызова метода Connect() завершается ошибкой связи. Давайте подробно разберем, почему возникает эта ошибка и как заставить ККТ «Штрих-М» стабильно работать по сети.
Для того чтобы понять, почему драйвер игнорирует свойство IPAddress, обратимся к его внутренней архитектуре. При выборе сетевого типа подключения (свойство ConnectionType принимает значение 6 — TCP-сокет) драйвер ориентируется на флаг UseIPAddress (Использовать IP-адрес):
UseIPAddress равен Ложь (или 0), драйвер считает, что обращение к кассе идет по сетевому имени компьютера. В этом случае свойство IPAddress игнорируется, а поиск устройства происходит по имени, указанному в свойстве ComputerName. Если оно пустое, драйвер подставляет имя текущего ПК.UseIPAddress равен Истина (или 1), драйвер считывает значение из свойства IPAddress.В коде 1С разработчики часто совершают синтаксическую ошибку, передавая значение флага в стиле других языков программирования: FR.UseIPAddress = true;. Платформа 1С:Предприятие не воспринимает ключевое слово true (написанное строчными буквами) как системное булево значение. В лучшем случае это интерпретируется как пустая переменная (или значение Неопределено), которая при передаче в COM-объект превращается в 0 (Ложь). В результате драйвер отключает использование IP-адреса и переходит в режим работы по имени компьютера.
Кроме того, свойства, передаваемые в COM-объект "на лету", не сохраняются автоматически в настройках логического устройства (ЛУ) в системном реестре Windows. Из-за этого при вызове диалогового окна настроек драйвера ShowProperties() визуальные поля заполняются значениями по умолчанию из реестра, а не вашими актуальными переменными из кода 1С.
---
Чтобы драйвер «Штрих-М» корректно воспринял команду работы по IP-адресу, необходимо правильно передать булев тип из 1С в COM-соединение. Для этого следует использовать предопределенную константу 1С Истина или её числовой эквивалент 1. Также перед выводом интерактивного окна свойств или перед подключением обязательно нужно вызвать метод SetExchangeParam(), который запишет переданные параметры в активный профиль оборудования.
Рассмотрим правильный шаблон инициализации подключения ККТ по TCP:
// Инициализируем внешнюю компоненту драйвера
Попытка
ПодключитьВнешнююКомпоненту("AddIn.DrvFR");
ФР = Новый COMОбъект("AddIn.DrvFR");
Исключение
Предупреждение("Не удалось загрузить внешнюю компоненту драйвера Штрих-М!");
Возврат;
КонецПопытки;
// Настраиваем параметры связи по протоколу TCP
ФР.ConnectionType = 6; // Устанавливаем тип подключения: TCP-сокет
ФР.ProtocolType = 0; // Использовать стандартный протокол обмена
// Включаем использование IP-адреса (передаем корректное значение для COM)
ФР.UseIPAddress = Истина; // Или используем альтернативный вариант: ФР.UseIPAddress = 1;
// Задаем сетевые реквизиты кассы
ФР.IPAddress = СокрЛП("192.168.137.111");
ФР.TCPPort = 7778; // Стандартный TCP-порт для ККТ Штрих-М
// Устанавливаем таймауты (критически важно для сетевых соединений)
ФР.Timeout = 5000; // Таймаут приема байта (в мс)
ФР.TCPConnectionTimeout = 3000; // Таймаут ожидания TCP-соединения (в мс)
ФР.Password = 30; // Пароль системного администратора ККТ по умолчанию
// Применяем установленные параметры в память драйвера
ФР.SetExchangeParam();
// При необходимости открываем окно свойств для проверки параметров связи
ФР.ShowProperties();
// Выполняем подключение к устройству
ФР.Connect();
Если ФР.ResultCode <> 0 Тогда
Сообщить("Ошибка подключения к ККТ: " + ФР.ResultCodeDescription, СтатусСообщения.Важное);
Иначе
Сообщить("Связь с ККТ успешно установлена!");
КонецЕсли;
---
Проанализируем альтернативный вариант, который часто находят разработчики в процессе отладки. Если по какой-то причине вам не удается передать булево значение для флага UseIPAddress, можно воспользоваться особенностью обработки сетевых имен самим драйвером.
Если UseIPAddress равен Ложь, драйвер пытается установить связь по имени компьютера, указанному в поле ComputerName. Если в качестве имени компьютера передать строковое представление IP-адреса, операционная система Windows при попытке разрешения сетевого имени (DNS/WINS) автоматически преобразует эту строку в реальный IP-адрес сетевого сокета.
Пример реализации такого обходного пути:
ПодключитьВнешнююКомпоненту("AddIn.DrvFR");
ФР = Новый COMОбъект("AddIn.DrvFR");
ФР.ConnectionType = 6; // TCP-сокет
ФР.ProtocolType = 0;
// Оставляем UseIPAddress отключенным или не заполняем его
ФР.UseIPAddress = Ложь;
// Передаем IP-адрес напрямую в поле имени компьютера!
ФР.ComputerName = "192.168.137.111";
ФР.TCPPort = 7778;
ФР.Timeout = 5000;
ФР.Password = 30;
ФР.SetExchangeParam();
ФР.Connect();
Важное предупреждение: Несмотря на то что данный способ является полностью рабочим, он считается «костылем» (обходным путем). Использование IP-адреса в поле ComputerName может приводить к задержкам на этапе инициализации соединения, так как операционная система будет тратить время на попытку разрешить строку как доменное имя в локальной сети через DNS-запросы перед тем, как обратиться напрямую по указанному IP. Рекомендуется использовать первый вариант с корректной передачей флага UseIPAddress = Истина.
---
При переводе фискальных регистраторов на работу по сети крайне важно тонко настроить временные параметры обмена информацией. Сетевое подключение, в отличие от локального кабеля USB или COM, подвержено микросбоям, задержкам пакетов и потерям сессий. Чтобы избежать аварийного прерывания печати чеков (что может привести к расхождению данных в 1С и на фискальном накопителе), придерживайтесь следующих правил:
3000 до 5000 мс. Длинные чеки или тяжелые фискальные отчеты требуют времени на формирование в оперативной памяти ККТ, и сетевой стек не должен разрывать сессию раньше времени.3000 мс.ShowProperties() предназначен исключительно для целей отладки, первоначальной настройки оборудования интегратором или проверки связи администратором. В коде рабочей конфигурации, предназначенном для повседневной работы кассиров, вызов интерактивных окон драйвера должен быть закомментирован или полностью исключен, чтобы не блокировать интерфейс программы.