Как подключить нестандартный дисплей покупателя в 1С:Розница 2.2 и УТ 11?

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

При работе с современными типовыми конфигурациями (такими как 1С:Розница 2.2 или 1С:Управление торговлей 11) разработчики часто сталкиваются с изменениями в архитектуре Библиотеки подключаемого оборудования (БПО). В старых версиях конфигураций для подключения оборудования использовались внешние обработки обслуживания в формате .epf. В современных версиях БПО интеграция устройств переведена на внешние компоненты и подсистему универсальных драйверов.

Рассмотрим ситуацию, когда необходимо подключить дисплей покупателя (например, POSUA LPOS-USB VFD), для которого нет готового встроенного драйвера 1С или стандартная DLL от производителя не поддерживает методы стандарта «1С:Совместимо» в полном объеме.

Анализ архитектуры подключения оборудования в БПО

Проанализируем, как работает подсистема подключаемого оборудования при отправке команд на устройство:

  1. В справочнике Драйверы оборудования создается запись для устройства.
  2. При отправке данных на дисплей покупателя система вызывает функции клиентского общего модуля ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.
  3. Этот модуль обращается к загруженной внешней компоненте (DLL) и передает сформированный массив команд или текст.

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

Решение проблемы через расширение конфигурации

Разберем по шагам, как перехватить вызов функций вывода информации на дисплей покупателя с помощью механизмов аннотаций расширений (&Вместо).

  1. Создадим новое расширение конфигурации в режиме Конфигуратор.
  2. Добавим в расширение с заимствованием типовой общий модуль ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.
  3. Переопределим процедуры вывода текста и очистки экрана дисплея с помощью аннотации &Вместо.

Рассмотрим пример готового кода для подмены функций вывода текста и очистки дисплея покупателя в заимствованном модуле:


#Область ПроцедурыИФункцииОбщиеДляДисплеевПокупателя

// Функция осуществляет вывод списка строк на дисплей покупателя.
&Вместо("ВывестиСтрокуНаДисплейПокупателя") 
Функция ВывестиСтрокуНаДисплейПокупателя_Подменяемая(ОбъектДрайвера, Параметры, ПараметрыПодключения, СтрокаТекста, ВыходныеПараметры)
    Результат = Истина;
    
    нн = ПодключитьВнешнююКомпоненту("AddIn.lpos_usb_vfd");
    Компонент = Новый("AddIn.lpos_usb_vfd_extension");
    СтрОшибка = "";    
    ИДУстройства = 1;    
    
    МассивЗначений = Новый Массив();
    КодоваяСтраница = 12; 
    МассивЗначений.Добавить(КодоваяСтраница);
    
    Если (Компонент.Подключить(МассивЗначений, ИДУстройства) <> Истина) Тогда
        Компонент.ПолучитьОшибку(СтрОшибка);
        Результат = Ложь;
    Иначе
        СтрОшибка = "Ок";
    КонецЕсли;

    // Очистка / подготовка структуры перед выводом
    Стр1 = "";
    Стр2 = "";
    МассивСтрок = Новый Массив();
    СтруктураСтр1 = Новый Структура;
    СтруктураСтр2 = Новый Структура;
    СтруктураСтр1.Вставить("Текст", "                    ");
    СтруктураСтр2.Вставить("Текст", "                    ");
    СтруктураСтр1.Вставить("БегущаяСтрока", Ложь);
    СтруктураСтр2.Вставить("БегущаяСтрока", Ложь);
    МассивСтрок.Добавить(СтруктураСтр1);
    МассивСтрок.Добавить(СтруктураСтр2);

    Если (Компонент.ВывестиСтрокуНаДисплейПокупателя(ИДУстройства, МассивСтрок) <> Истина) Тогда
        Компонент.ПолучитьОшибку(СтрОшибка);
        Результат = Ложь;
    Иначе 
        СтрОшибка = "OK";
    КонецЕсли; 

    // Разделение входящего текста на 2 строки по символу переноса
    Разделитель = Найти(СтрокаТекста, Символы.ПС);
    Если Разделитель > 0 Тогда
        Стр1 = Лев(СтрокаТекста, Разделитель - 1);
        Стр2 = Прав(СтрокаТекста, СтрДлина(СтрокаТекста) - Разделитель);
    Иначе
        Стр1 = СтрокаТекста;
        Стр2 = "";
    КонецЕсли;

    МассивСтрок = Новый Массив();
    СтруктураСтр1 = Новый Структура;
    СтруктураСтр2 = Новый Структура;
    СтруктураСтр1.Вставить("Текст", Стр1);
    СтруктураСтр2.Вставить("Текст", Стр2);
    СтруктураСтр1.Вставить("БегущаяСтрока", Ложь);
    СтруктураСтр2.Вставить("БегущаяСтрока", Ложь);
    МассивСтрок.Добавить(СтруктураСтр1);
    МассивСтрок.Добавить(СтруктураСтр2);

    Если (Компонент.ВывестиСтрокуНаДисплейПокупателя(ИДУстройства, МассивСтрок) <> Истина) Тогда
        Компонент.ПолучитьОшибку(СтрОшибка);
        Результат = Ложь;
    Иначе 
        СтрОшибка = "OK";
    КонецЕсли; 

    Если Не Результат Тогда
        ВыходныеПараметры.Очистить();
        ВыходныеПараметры.Добавить(999);
        ВыходныеПараметры.Добавить(СтрОшибка);
    КонецЕсли;

    Возврат Результат;    
КонецФункции

// Функция осуществляет очистку дисплея покупателя.
&Вместо("ОчиститьДисплейПокупателя") 
Функция ОчиститьДисплейПокупателя_Подменяемая(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры)
    Результат = Истина;
    нн = ПодключитьВнешнююКомпоненту("AddIn.lpos_usb_vfd");
    Компонент = Новый("AddIn.lpos_usb_vfd_extension");
    СтрОшибка = "";    
    ИДУстройства = 1;    

    Если (Компонент.ОчиститьДисплейПокупателя(ИДУстройства) <> Истина) Тогда
        Компонент.ПолучитьОшибку(СтрОшибка);
        Результат = Ложь;
    Иначе
        СтрОшибка = "OK";
    КонецЕсли;    

    Если Не Результат Тогда
        ВыходныеПараметры.Очистить();
        ВыходныеПараметры.Добавить(999);
        ВыходныеПараметры.Добавить(СтрОшибка);
    КонецЕсли;

    Возврат Результат;
КонецФункции

#КонецОбласти

Особенности регистрации компоненты и права доступа

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

  1. Права администратора при регистрации DLL: Регистрация системных COM-компонент через RegSvr32 стандартно требует прав администратора для записи в раздел реестра HKEY_LOCAL_MACHINE.
  2. Регистрация в ветке текущего пользователя: Для запуска без административных прав регистрацию компоненты можно выполнять в ветку реестра текущего пользователя HKEY_CURRENT_USER\Software\Classes.
  3. Эмуляция ESC/POS: Многие USB/VFD дисплеи покупателя имеют возможность переключения в режим эмуляции протокола EPSON (ESC/POS) или CD5220. В таком режиме устройство определяется в системе как виртуальный COM-порт, что позволяет использовать штатный драйвер 1С: Дисплей покупателя без написания специального кода подмены.

Таким образом, с помощью расширения конфигурации и подмены методов общего модуля БПО ПодключаемоеОборудованиеУниверсальныйДрайверКлиент удается интегрировать практически любое экзотическое оборудование без снятия конфигурации с поддержки.

← На главную