При работе в программе 1С:Управление торговлей (начиная с версий 11.4) многие системные администраторы и специалисты по автоматизации сталкиваются с неприятной особенностью: после пробития чека в рабочем месте кассира (РМК) программа намертво блокирует порт подключения ККТ (будь то виртуальный COM-порт или TCP-сокет). В результате этого становится невозможно открыть «Тест драйвера» для проведения сервисных операций, проверки таблиц или снятия отчетов, пока сессия 1С не будет полностью закрыта. Давайте детально проанализируем причины этой проблемы и подробно разберем все способы ее решения.
Для того чтобы понять, почему 1С ведет себя подобным образом, рассмотрим архитектурную логику работы современной Библиотеки подключаемого оборудования (БПО), встроенной в конфигурации на управляемых формах.
В старых версиях программ (например, в УТ 10.3 или «Торговля и Склад» 7.7) подключение к оборудованию происходило непосредственно в момент выполнения операции — при нажатии кнопки «Пробить чек». После завершения печати устройство сразу же программно отключалось. В новых версиях 1С:Управление торговлей 11 разработчики кардинально изменили этот подход.
При первом обращении к кассе (например, при открытии формы РМК или первом чеке) БПО инициализирует драйвер, открывает порт связи с ККТ и кэширует объект драйвера в глобальном модуле или параметрах сеанса пользователя. Соединение сознательно удерживается активным на протяжении всей работы пользователя в системе. Это сделано ради оптимизации быстродействия: постоянное открытие и закрытие порта (особенно при сетевом подключении по протоколу TCP/IP или через эмуляцию RNDIS) вызывает ощутимые задержки (иногда до 3–5 секунд) перед отправкой каждого чека на печать, что крайне критично для кассиров в часы пиковых нагрузок.
Дополнительная сложность возникает при использовании протокола TCP Socket. Если в процессе обмена данными между 1С, драйвером «Штрих-М» (например, версий семейства 4.14) и самой кассой происходит микросбой, сетевой сокет переходит в зависшее состояние (статусы CLOSE_WAIT или ESTABLISHED на уровне операционной системы). В этом случае ККТ считает соединение активным, а операционная система продолжает блокировать порт процессами 1С. Освободить его удается только полной перезагрузкой компьютера или службы кассы.
Давайте подробно рассмотрим четыре практических метода борьбы с этой проблемой, начиная с оригинального аппаратного решения и заканчивая тонкой программной настройкой.
Этот оригинальный и весьма изящный способ предложил автор темы на форуме. Современные фискальные регистраторы марки «Штрих-М» обладают уникальной особенностью — они способны аппаратно поддерживать одновременную работу по нескольким физическим интерфейсам. Мы можем разграничить доступ для разных программ, подключив кассу к компьютеру сразу двумя кабелями.
Проанализируем шаги для реализации этой схемы:
COM3). Программа 1С будет монопольно владеть этим портом для пробития чеков, и это никак не помешает другим процессам.192.168.137.111) и соответствующий порт.В результате такого разделения 1С работает через свой выделенный канал связи (COM), а сервисные утилиты и механизмы отправки чеков в ОФД обращаются к кассе по сетевому каналу (TCP), не мешая друг другу. Порт в 1С остается занят, но это больше не блокирует администрирование устройства.
Если физически подключить кассу двумя кабелями невозможно (например, на кассовом узле ограниченное количество свободных портов или ККТ установлена удаленно), рекомендуется использовать промежуточное программное обеспечение, которое выступает в роли мультиплексора соединений.
Рассмотрим по шагам настройку схемы с использованием специализированного ПО:
Иногда решить проблему удается без изменения схемы подключения, за счет обновления библиотек и активации скрытых параметров в интерфейсе программы.
Разберем, на что необходимо обратить внимание при настройке конфигурации:
Для разработчиков и системных администраторов, имеющих навыки конфигурирования, самым надежным решением будет создание небольшого расширения, которое будет принудительно давать команду драйверу освободить порт сразу после того, как чек ККМ будет закрыт на экране или успешно фискализирован.
Рассмотрим пример кода, который можно внедрить в обработчик закрытия формы чека ККМ или в процедуру завершения печати чека в общем модуле РМК:
&НаКлиенте
Процедура ПринудительноОсвободитьПортККТ(ИдентификаторУстройства) Экспорт
// Проверяем, подключено ли устройство в данный момент
Если ПодключаемоеОборудованиеКлиент.УстройствоПодключено(ИдентификаторУстройства) Тогда
// Формируем описание оповещения для асинхронного отключения
ПараметрыОтключения = Новый ОписаниеОповещения("ПослеОтключенияУстройства", ЭтотОбъект);
// Вызываем метод БПО для принудительного освобождения занятого порта
ПодключаемоеОборудованиеКлиент.ОтключитьУстройствоАсинх(ПараметрыОтключения, ИдентификаторУстройства);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеОтключенияУстройства(РезультатВыполнения, ДополнительныеПараметры) Экспорт
// Порт успешно освобожден. Теперь касса доступна для сторонних утилит.
КонецПроцедуры
Использование метода ОтключитьУстройствоАсинх гарантирует, что 1С вызовет деструктор объекта драйвера ККТ и операционная система закроет все удерживаемые сетевые сокеты и виртуальные COM-порты.
Если ваша касса подключена по USB-кабелю в режиме RNDIS (TCP-сокет), обязательно проверьте настройки электропитания операционной системы Windows. По умолчанию в системе включена функция временного отключения USB-портов для экономии энергии. При простое кассы Windows приостанавливает работу порта, сессия драйвера в 1С аварийно обрывается, но порт при этом остается программно заблокированным.
Для исправления этого перейдите в «Панель управления» — «Электропитание» — «Настройка схемы электропитания» — «Изменить дополнительные параметры питания». Найдите в списке «Параметры USB» и установите значение параметра «Временное отключение USB-порта» в положение «Запрещено». Это предотвратит внезапные разрывы связи и зависание сетевых сокетов ККТ.