Как программно подключить весы «Масса-К» на сервере 1С через библиотеку DLL?

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

Подключение торгового оборудования на стороне сервера 1С — задача не самая тривиальная, особенно когда речь идет о весах. В отличие от клиентского подключения, где драйвер часто работает в интерактивном режиме, серверное использование требует четкого понимания разрядности платформы, технологии Native API и особенностей прав доступа службы 1С. В данной статье мы подробно разберем, как подключить внешнюю компоненту MassaKDriverR1C, избежать ошибки «Тип не определен» и правильно организовать обмен данными с весами в серверном контексте. При необходимости вы можете задействовать готовое решение для программной работы с весами Масса-К через механизмы БПО.

Понимаем разницу между COM и Native API

Прежде чем приступать к коду, давайте проанализируем ситуацию с самой библиотекой. Традиционно многие драйверы регистрировались в системе через regsvr32. Однако современные компоненты от «Масса-К» используют технологию Native API. Это критически важный момент: такие библиотеки не нужно и бесполезно регистрировать в реестре Windows. Они подключаются динамически непосредственно из кода 1С. Если вы пытаетесь использовать библиотеку с суффиксом x64, убедитесь, что ваш сервер 1С также имеет 64-битную разрядность, так как 32-битный рабочий процесс 1С (rphost) просто не сможет «проглотить» 64-битную DLL.

Почему возникает ошибка «Тип не определен»?

Рассмотрим основные причины, по которым метод Новый() отказывается создавать объект драйвера, даже если файл физически существует на диске:

  1. Несоответствие разрядности: Платформа 1С (сервер) 64-битная, а вы пытаетесь подключить 32-битную компоненту (или наоборот).
  2. Неправильный ProgID: При использовании Native API идентификатор объекта формируется из двух частей: псевдонима, указанного при подключении, и внутреннего имени компоненты.
  3. Отсутствие зависимостей: Для работы DLL могут требоваться пакеты Microsoft Visual C++ Redistributable. Если на сервере их нет, операционная система не даст 1С загрузить библиотеку.
  4. Права доступа: Пользователь, от имени которого запущена служба 1С:Предприятие (обычно USR1CV8), должен иметь права на чтение и выполнение в папке, где лежит DLL.

Подключение через ZIP-архив (Манифест) — правильный путь

Вместо того чтобы мучиться с выбором конкретного DLL-файла, мы рекомендуем использовать «сборку» — ZIP-архив, предоставляемый производителем. Внутри него находится файл manifest.xml, который сообщает 1С, какую именно библиотеку нужно вытащить для текущей операционной системы и её разрядности. Это делает ваш код универсальным.

Рассмотрим пошагово, как это реализовать. Предположим, вы загрузили архив в макет конфигурации или положили его в сетевую папку.


// Пример подключения из ZIP-архива, хранящегося в макете
ИмяВК = "MassaK_Driver"; // Произвольный псевдоним для текущего сеанса
ПутьКАрхиву = "C:\Distr\MassaK_Native.zip"; // Путь к сборке с манифестом

// 1. Подключаем компоненту
РезультатПодключения = ПодключитьВнешнююКомпоненту(ПутьКАрхиву, ИмяВК, ТипВнешнейКомпоненты.Native);

Если РезультатПодключения Тогда
    // 2. Создаем объект. Важно: "MassaKDriverR1C" - это внутреннее имя из манифеста
    Попытка
        ДрайверВесов = Новый("AddIn." + ИмяВК + ".MassaKDriverR1C");
    Исключение
        Сообщить("Объект не создан: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
Иначе
    Сообщить("Не удалось загрузить внешнюю компоненту!");
КонецЕсли;

Разбор синтаксиса создания объекта

Проанализируем строку Новый("AddIn.ИмяВК.MassaKDriverR1C"). Здесь AddIn — это стандартный префикс для всех внешних компонент в 1С. ИмяВК — это тот самый второй параметр, который вы передали в функцию ПодключитьВнешнююКомпоненту. MassaKDriverR1C — это жестко заданное имя класса внутри самой DLL. Если вы ошибетесь хотя бы в одном символе или регистре (Native API чувствителен к регистру), вы получите ошибку определения типа.

Особенности работы на стороне сервера

Выясним, чем отличается работа с весами на сервере от работы на клиенте. Когда вы вызываете методы драйвера на сервере, помните:

  1. Никаких окон: Вы не можете вызвать метод Настроить() или любой другой, который выводит визуальное окно выбора порта. Все параметры связи (IP-адрес весов, порт, таймаут) должны быть установлены программно через свойства объекта ДрайверВесов.
  2. Сетевой протокол: Для сервера наиболее логичным является подключение весов по Ethernet (TCP/IP). Работа через COM-порты на сервере возможна, но требует физического наличия портов на серверной машине или их виртуального проброса.
  3. Освобождение ресурсов: На сервере крайне важно явно разрывать соединение. Если сеанс зависнет или не закроет сокет, весы могут "зависнуть" для других подключений.

Алгоритм получения веса на сервере

Давайте разберем полный цикл взаимодействия с устройством. После того как мы успешно создали объект ДрайверВесов, нам нужно выполнить последовательность действий по опросу устройства.


// Установка параметров (пример для весов с Ethernet-модулем)
ДрайверВесов.IPAddress = "192.168.1.100"; // IP весов в вашей сети
ДрайверВесов.PortNumber = 5001;           // Стандартный порт для Масса-К
ДрайверВесов.Protocol = 1;                 // Уточните номер протокола в документации к вашей модели

// Установка соединения
Если ДрайверВесов.Connect() Тогда 
    // Запрос веса
    Если ДрайверВесов.GetWeight() Тогда
        ТекущийВес = ДрайверВесов.Weight;
        Стабильность = ДрайверВесов.Stable;
        
        Если Стабильность Тогда
            Сообщить("Вес успешно получен: " + ТекущийВес);
        Иначе
            Сообщить("Вес не стабилен, попробуйте еще раз.");
        КонецЕсли;
    Иначе
        Сообщить("Ошибка при запросе веса: " + ДрайверВесов.LastErrorDescription);
    КонецЕсли;
    
    // Обязательно отключаемся
    ДрайверВесов.Disconnect();
Иначе
    Сообщить("Не удалось установить связь с весами!");
КонецЕсли;

Рекомендации по отладке

Если вы все сделали правильно, но код всё равно выдает ошибку, проанализируем следующие моменты. Проверьте логи сервера 1С. Часто там можно найти информацию о том, что системе не удалось загрузить библиотеку из-за отсутствия прав доступа к временной папке. 1С при вызове ПодключитьВнешнююКомпоненту распаковывает DLL во временный каталог текущего пользователя (в данном случае — пользователя, под которым работает сервер 1С). Если папка Temp переполнена или заблокирована антивирусом, загрузка не произойдет.

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

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

← На главную