Как в 1С подключиться к ККМ «Штрих-М» по сети (TCP/IP), если не работает стандартный код?

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

В этой статье мы подробно разберем ситуацию, когда при попытке программного подключения к ККМ «Штрих-М» из 1С ничего не происходит, хотя стандартная утилита «Тест драйвера ФР» видит устройство и успешно выполняет команды. Проанализируем, почему так происходит и как правильно настроить подключение, если касса подключена к компьютеру по сети (через TCP-сокет или в режиме RNDIS), а не через стандартный COM-порт. Это базовый этап, без которого невозможна дальнейшая настройка торгового оборудования, включая разрешительный режим на кассах и онлайн проверку в «Честном знаке».

Анализ проблемы: почему ККМ видна в тесте драйвера, но недоступна из 1С?

Рассмотрим типичную ситуацию. Вы пишете код для печати строки на фискальном регистраторе:


Попытка
    Аппарат = Новый COMОбъект("AddIn.Drvfr");
    Аппарат.StringForPrinting = "Тестовая строка";
    Аппарат.PrintString();
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;

При выполнении этого кода явных ошибок не возникает, но и на ККМ ничего не печатается. Если в отладчике проверить свойства созданного COM-объекта `Аппарат`, то можно увидеть, что многие из них (например, ResultCodeDescription) возвращают ошибку «COM порт недоступен».

Ключевая причина кроется в способе подключения. По умолчанию драйвер «Штрих-М» при создании объекта COMОбъект("AddIn.Drvfr") пытается установить соединение через локальный COM-порт, параметры которого он берет из своих настроек по умолчанию (часто это COM1). Однако современные ККМ, такие как «Штрих ON-LINE», часто подключаются через USB-кабель в режиме RNDIS. Этот режим эмулирует сетевое подключение, то есть для операционной системы касса выглядит как сетевое устройство со своим IP-адресом (например, 192.168.137.111).

Утилита «Тест драйвера ФР» работает корректно, так как в её настройках вы заранее указываете правильный тип соединения (TCP-сокет), а также вводите IP-адрес и порт. В коде 1С эти параметры не были заданы, поэтому драйвер даже не пытается искать устройство в сети. Наша задача — явно указать в коде все необходимые сетевые параметры перед установкой соединения.

Решение: правильное подключение к ККМ по TCP-сокету

Чтобы успешно подключиться к кассе по сети, необходимо перед вызовом метода Connect() задать свойства COM-объекта. Разберем процесс по шагам.

  1. Создание COM-объекта

    Этот шаг остается стандартным — мы создаем экземпляр объекта драйвера.

    Аппарат = Новый COMОбъект("AddIn.Drvfr");
  2. Установка параметров соединения

    Это самый важный этап. Нужно сообщить драйверу, что мы используем не COM-порт, а TCP-подключение.

    • ConnectionType — тип соединения. Для прямого подключения по TCP-сокету необходимо установить значение 6.

      Другие значения:

      • 0: Локально (через COM-порт)
      • 1: Сервер ККМ (TCP)
      • 6: Подключение через TCP-сокет
    • UseIPAddress — флаг использования IP-адреса. Устанавливаем в Истина.
    • IPAddress — строковое представление IP-адреса вашей ККМ.
    • TCPPort — сетевой порт (стандартный для «Штрих-М» — 7778).
    • Password — пароль доступа. По умолчанию для администратора — "30", для кассира — "1".

    Пример установки свойств в коде:

    
    // Настраиваем сетевое подключение
    Аппарат.ConnectionType = 6; // Подключение через TCP-сокет
    Аппарат.UseIPAddress = Истина;
    Аппарат.IPAddress = "192.168.137.111"; // Укажите IP-адрес вашей кассы
    Аппарат.TCPPort = 7778; // Стандартный порт Штрих-М
    
    // Устанавливаем пароль администратора
    Аппарат.Password = "30";
    
  3. Установка соединения и проверка результата

    После задания параметров вызываем метод Connect(). Обязательно проверяйте результат: если метод возвращает 0, соединение успешно. Любое другое значение сигнализирует об ошибке, причины которой мы разбирали в отдельной статье.

    
    РезультатПодключения = Аппарат.Connect();
    Если РезультатПодключения <> 0 Тогда
        ТекстОшибки = "Ошибка подключения к ККМ! Код: " + РезультатПодключения + ". Описание: " + Аппарат.ResultCodeDescription;
        Сообщить(ТекстОшибки);
        Возврат; 
    КонецЕсли;
    
  4. Выполнение команд

    После успешного подключения можно отправлять данные на печать. На этом этапе вы можете реализовать любую логику, вплоть до настройки печати на ККT c нескольких рабочих мест, если архитектура сети это позволяет.

    
    Аппарат.StringForPrinting = "Подключение успешно! Печатаем строку.";
    Аппарат.PrintString();
    
  5. Завершение работы

    После завершения операций, например, после печати чека или программного снятия Z-отчета, обязательно закройте соединение методом Disconnect(), чтобы освободить ресурсы для других приложений. Кстати, если у вас периодически возникают проблемы с чеками при закрытии месяца, убедитесь, что соединения с кассой корректно завершаются во всех фоновых заданиях.

    Аппарат.Disconnect();

Итоговый пример кода для подключения по TCP/IP

Соберем все этапы в готовый фрагмент кода. Рекомендуется использовать конструкцию Попытка-Исключение для обработки возможных ошибок COM-соединения.


Процедура ПечатьНаККМПоСети(СтрокаДляПечати)

    Если Не ЗначениеЗаполнено(СтрокаДляПечати) Тогда
        Возврат;
    КонецЕсли;

    Аппарат = Неопределено;
    Попытка
        // 1. Создание объекта
        Аппарат = Новый COMОбъект("AddIn.Drvfr");
        
        // 2. Настройка параметров
        Аппарат.ConnectionType = 6; 
        Аппарат.IPAddress = "192.168.137.111"; 
        Аппарат.TCPPort = 7778; 
        Аппарат.Password = "30"; 

        // 3. Подключение
        Если Аппарат.Connect() <> 0 Тогда
            Сообщить("Не удалось подключиться к ККМ: " + Аппарат.ResultCodeDescription);
            Возврат;
        КонецЕсли;

        // 4. Печать
        Аппарат.StringForPrinting = СтрокаДляПечати;
        Аппарат.PrintString();

        Сообщить("Команда успешно отправлена на ККМ.");

    Исключение
        Сообщить("Произошла ошибка при работе с ККМ: " + ОписаниеОшибки());
    КонецПопытки;

    // 5. Завершение сеанса
    Если Аппарат <> Неопределено Тогда
        Аппарат.Disconnect();
    КонецЕсли;

КонецПроцедуры

Дополнительные рекомендации

Таким образом, для стабильной работы 1С с ККМ по сети достаточно правильно определить тип физического подключения и явно инициализировать сетевые параметры драйвера в программном коде перед вызовом команды соединения.

← На главную