При автоматизации торговых точек часто возникает ситуация, когда на одной кассе установлен эквайринговый терминал (пин-пад), а на другой — нет. Настройки подключения при этом могут существенно различаться: используются разные модели устройств, отличающиеся номера COM-портов, а также виртуальные COM-порты, эмулируемые через USB. Рассмотрим подробнее, как средствами платформы 1С 7.7 (в частности, в конфигурации «Торговля и Склад 9.2») корректно определить доступность торгового оборудования и соответствующих драйверов при запуске системы.
Если для работы с пин-падом в системе должна быть зарегистрирована внешняя компонента или ActiveX-объект (библиотеки с расширениями .dll или .ocx), самый простой и надежный способ проверить её присутствие из кода 1С 7.7 — попробовать программно создать этот OLE-объект с помощью функции СоздатьОбъект().
Проанализируем пример реализации данного подхода с использованием конструкции Попытка ... Исключение:
БиблиотекаПодключена = 0;
Попытка
// Пытаемся создать OLE-объект драйвера эквайринга
ДрайверТерминала = СоздатьОбъект("NameSpace.DeviceClass");
БиблиотекаПодключена = 1;
Исключение
// Если объект не создался, значит библиотека не зарегистрирована в regsvr32
БиблиотекаПодключена = 0;
КонецПопытки;
Если БиблиотекаПодключена = 1 Тогда
Сообщить("Драйвер эквайринга найден и готов к работе.");
Иначе
Сообщить("Драйвер эквайринга не зарегистрирован на данном ПК.");
КонецЕсли;
Важное замечание: успешное создание OLE-объекта подтверждает лишь то, что драйвер зарегистрирован в операционной системе Windows. Однако это не гарантирует, что сам пин-пад физически подключен к COM-порту и включен в сеть.
Разберем технические нюансы работы последовательных интерфейсов (RS-232) и виртуальных USB-to-COM портов:
Если выполнить попытку прямого открытия порта в 1С 7.7 при отсутствии ответа от физического устройства, сеанс 1С может временно заблокироваться или зависнуть из-за ожидания таймаута системного ввода-вывода.
Чтобы проверить, существует ли конкретный COM-порт в системе без его прямого открытия и блокировки, можно обратиться к инструментарию WMI (Windows Management Instrumentation) через класс Win32_PnPEntity или Win32_SerialPort.
Посмотрим на пример функции, позволяющей опрашивать список устройств ПК:
Функция ПроверитьНаличиеПортаWMI(ИскомыйПорт)
Результ = 0;
Попытка
WMI = СоздатьОбъект("WbemScripting.SWbemLocator");
СлужбаWMI = WMI.ConnectServer(".", "root\cimv2");
СписокПортов = СлужбаWMI.ExecQuery("SELECT * FROM Win32_PnPEntity WHERE Name LIKE '%(" + ИскомыйПорт + ")%'");
Если СписокПортов.Count > 0 Тогда
Результ = 1;
КонецЕсли;
Исключение
Сообщить("Ошибка обращения к WMI");
КонецПопытки;
Возврат Результ;
КонецФункции;
В практической разработке на базе 1С 7.7 избегают динамического сканирования портов при каждом запуске программы. Наиболее устойчивым решением является жесткая или полуавтоматическая привязка настроек оборудования к имени локального компьютера.
С помощью встроенной функции ИмяКомпьютера() мы можем легко разделять логику работы кассовых рабочих мест:
ТекущийПК = СокрЛП(ВВерх(ИмяКомпьютера()));
Если ТекущийПК = "KASSA_01" Тогда
// Настройки для первой кассы с подключенным терминалом
ИспользоватьПинПад = 1;
НомерПорта = 3;
ИначеЕсли ТекущийПК = "KASSA_02" Тогда
// Настройки для второй кассы без эквайринга
ИспользоватьПинПад = 0;
КонецЕсли;
Подводя итоги, сформируем оптимальный алгоритм проверки оборудования при запуске 1С 7.7:
ИмяКомпьютера() и сопоставить его со справочником торгового оборудования в базе данных.Попытка ... Исключение при вызове СоздатьОбъект().