Как подключить весы через COM-объект в мобильном клиенте 1С и исправить ошибку связи?

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

Разберем достаточно распространенную и неочевидную задачу: необходимо разработать мобильное приложение (а точнее, мобильный клиент), которое должно отображать вес с оборудования (весов). Особенность в том, что интеграция с оборудованием традиционно реализована через COMОбъект. Рассмотрим, почему при вызове с мобильного устройства объект создается, но возвращает ошибку, и проанализируем эффективные способы решения этой проблемы.

Суть проблемы: создание COM-объекта на сервере и ошибка подключения

На практике часто встречается следующая ситуация: код инициализации COM-объекта обернут в серверный вызов. Например:


#Если НЕ МобильноеПриложениеСервер Тогда
    Терминал = Новый COMОбъект("Controller.ScAuto");
#КонецЕсли

Если мы запускаем данный код через обычный тонкий клиент с компьютера, к которому физически подключены весы, метод Терминал.GetWeight(1, 5) успешно возвращает вес. Однако при вызове этого же кода из мобильного клиента метод возвращает -5000 (что в контексте драйвера означает "Терминал не обнаружен"). Сам COM-объект при этом создается без ошибок.

Выясним причину такого поведения. Дело в архитектуре мобильного клиента и клиент-серверного взаимодействия 1С:

  1. На мобильных устройствах (Android, iOS) технология COM в принципе отсутствует. Это исключительно Windows-разработка. Поэтому вызов должен происходить строго на сервере (директива &НаСервере).
  2. Когда мобильный клиент инициирует вызов Новый COMОбъект("Controller.ScAuto") на сервере, этот объект создается на машине сервера 1С, а не на локальном рабочем месте, где стоят весы.
  3. Сервер 1С работает под своей служебной учетной записью (например, USR1CV8). Он физически изолирован от локальных COM или USB-портов пользователя. Именно поэтому драйвер загружается, но "не видит" физическое оборудование.

Если же сервер 1С и рабочее место с весами — это один и тот же компьютер, то проблема может заключаться в правах: службе сервера 1С нужно дать права на доступ к портам или запускать сервер от имени администратора. Однако в полноценной сети такой подход не сработает.

Рекомендуемые архитектурные решения

Использование COM-объектов на сервере для связи с локальным оборудованием клиентов считается устаревшей практикой. Рассмотрим более надежные и современные решения для работы мобильного клиента с весами.

  1. Использование нативных драйверов (БПО). Платформа 1С для мобильных устройств поддерживает "Библиотеку подключаемого оборудования" (БПО). Если весы имеют сетевой интерфейс (Wi-Fi, Ethernet) или работают по Bluetooth, мобильный клиент может связываться с ними напрямую с помощью встроенных драйверов (протоколы POS2-M, Штрих-М и др.) без посредничества сервера 1С.
  2. Локальный HTTP-сервис. На компьютере, к которому физически проводом подключены весы, можно поднять легковесный HTTP-сервис (например, с помощью микросервиса на Python, Node.js или даже отдельной крошечной базы 1С с опубликованным HTTP-сервисом). Мобильный клиент будет посылать GET-запросы на локальный IP-адрес этого компьютера и получать вес в удобном формате JSON. Это полностью исключает проблемы с DCOM и зависаниями при инициализации COMОбъект.
  3. Обмен через очередь сообщений (MQTT) или файлы. На компьютере с весами можно запустить простую утилиту (например, скрипт PowerShell), которая будет постоянно опрашивать весы и скидывать актуальный стабильный вес в топик MQTT-брокера или в обычный текстовый файл (расшаренный в сети). Мобильный клиент будет просто читать это готовое значение.

Решение проблемы с интерфейсом: как развернуть форму на весь экран

Помимо связи с оборудованием, при разработке мобильного клиента возникает проблема с интерфейсом: маленькие формы с несколькими элементами могут открываться в виде небольших окошек, не используя всю полезную площадь экрана телефона или планшета.

Разберем по шагам, что нужно делать, чтобы форма гарантированно растянулась на весь экран мобильного устройства:

  1. Сгруппируйте все элементы на форме (например, 4 кнопки или поля ввода) в Обычную группу (без отображения рамки).
  2. В свойствах этой группы и корневых элементов установите свойства РастягиватьПоГоризонтали и РастягиватьПоВертикали в значение Да. Это заставит платформу вытолкнуть границы формы до краев доступного экрана.
  3. Проверьте параметр РежимОткрытияОкна при программном вызове формы. Избегайте независимого режима, который может отображать форму как всплывающее диалоговое окно.
  4. Глобально форсировать полноэкранный режим интерфейса можно с помощью метода глобального контекста при запуске приложения:

КлиентскоеПриложение.УстановитьРежимОсновногоОкна(
    РежимОсновногоОкнаКлиентскогоПриложения.ПолноэкранноеРабочееМесто
);

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

← На главную