При автоматизации рабочего места кассира в 1С:Управление торговлей 10.3 нередко возникает необходимость подключить к одному системному блоку два кассовых аппарата (например, для разделения продаж по разным организациям или системам налогообложения). Однако при подключении двух аппаратов Штрих-М через последовательные интерфейсы (COM1 и COM2) пользователи сталкиваются с тем, что тест драйвера видит оба устройства, но внутри 1С все фискальные операции и опрос параметров (даже при явном выборе первой кассы) направляются исключительно на порт второй кассы.
Разберем подробнее, почему возникает такое поведение, как устроено взаимодействие конфигурации с драйвером и какие варианты решения позволяют настроить стабильную работу обоих аппаратов.
Проанализируем архитектуру работы драйвера производителя и типовых механизмов торгового оборудования в 1С:
COM2, переключение на COM1 в рамках того же объекта завершается неудачей или просто игнорируется.Наиболее надежный программный способ для конфигураций на обычных формах — отказаться от постоянного удержания открытого COM-порта. Разберем логику доработки обработки обслуживания кассового аппарата:
Disconnect / Отключить), освобождая COM-порт и сбрасывая состояние драйвера.Посмотрим на пример организации вызова фискальной операции с гарантированным разрывом соединения:
Функция ВыполнитьКомандуККТ(ОбъектДрайвера, ПараметрыПодключения, ИмяМетода)
// 1. Устанавливаем параметры связи для конкретного аппарата
ОбъектДрайвера.ComNumber = ПараметрыПодключения.НомерCOM;
ОбъектДрайвера.BaudRate = ПараметрыПодключения.Скорость;
ОбъектДрайвера.Timeout = 1000;
// 2. Открываем соединение
Если ОбъектДрайвера.Connect() <> 0 Тогда
Сообщить("Ошибка подключения к ККТ: " + ОбъектДрайвера.ResultCodeDescription);
Возврат Ложь;
КонецЕсли;
Попытка
// 3. Выполняем требуемое действие
Результат = ВыполнитьДействиеККТ(ОбъектДрайвера, ИмяМетода);
Исключение
// Гарантированно отключаемся при ошибке
ОбъектДрайвера.Disconnect();
ВызватьИсключение;
КонецПопытки;
// 4. Обязательно освобождаем порт после завершения
ОбъектДрайвера.Disconnect();
Возврат Результат;
КонецФункции
Если в коде используется драйвер «Штрих-М» через создание таблицы логических устройств, разберем по шагам альтернативную настройку:
COM1) и ЛУ 2 (настроенное на COM2). Сохраняем конфигурацию драйвера.DeviceNumber / LogicalNumber).Посмотрим на пример переключения контекста кассы:
// Устанавливаем номер активного логического устройства драйвера
ОбъектДрайвера.DeviceNumber = НомерЛогическогоУстройства; // 1 или 2
ОбъектДрайвера.SetActiveDevice();
Если ОбъектДрайвера.ResultCode <> 0 Тогда
Сообщить("Не удалось переключить активное устройство: " + ОбъектДрайвера.ResultCodeDescription);
КонецЕсли;
Если типовой механизм торгового оборудования хранит глобальную ссылку на объект драйвера и не позволяет корректно переключать свойства, рекомендуется изменить логику инициализации:
Новый COMОбъект("AddIn.DRVFR") (или актуальный COM-класс драйвера) непосредственно внутри функции выполнения операции.Disconnect() переменной с COM-объектом присваиваем Неопределено, что инициирует корректное уничтожение объекта в памяти и освобождение ресурсов операционной системы.Если программная доработка конфигурации нежелательна или ограничена регламентом, рассмотрим организационные и аппаратные альтернативы: