При эксплуатации фискальных регистраторов (например, АТОЛ 11Ф) в конфигурации «Управление торговлей» (редакция 10.3) кассиры или операторы могут сталкиваться со следующей ошибкой:
«АТОЛ 11Ф: Ошибка при подключении устройства. Необходимо убедиться, что устройство правильно настроено и соответствующий порт не занят другим приложением. Порт занят»
Характерная особенность этой проблемы — она проявляется эпизодически, например, при попытке пробить чек на товар с отрицательным остатком. При этом обычный перезапуск кассового модуля не помогает, и касса становится доступной только спустя 5–10 минут. Разберем подробнее, почему так происходит и как правильно доработать алгоритмы 1С для предотвращения подобного поведения.
Протокол передачи данных по интерфейсу RS-232 (а также его виртуальной эмуляции через USB VCOM) является монопольным. Это означает, что в один момент времени работать с портом устройства может только один процесс или поток через установленное соединение.
Взаимодействие 1С с ККТ происходит по следующей базовой схеме:
Если в процессе пробития чека возникают бизнес-проверки (например, проверка остатка номенклатуры на складе) и алгоритм выводит сообщение об ошибке с помощью операторов Возврат, ВызватьИсключение или прерыванием выполнения процедуры до момента освобождения кассы, метод отключения ККТ не вызывается. Сессия работы с портом остаётся открытой на стороне внешней компоненты в памяти процесса 1С.
При повторной попытке пробить чек 1С снова пытается занять тот же порт, но получает отказ от операционной системы или драйвера, так как предыдущее соединение не было закрыто. Порт освобождается сам лишь по истечении системного таймаута удержания дескриптора (обычно от 5 до 10 минут).
Наиболее эффективный подход — не подключаться к фискальному регистратору до тех пор, пока не пройдут все необходимые валидации документа. Проанализируем правильный порядок действий:
Если проверки выполняются непосредственно во время печатного цикла или внутри обработки обслуживания, код необходимо обернуть в конструкцию обработки исключений с обязательным вызовом деактивации кассы.
Рассмотрим пример правильного оформления кода отключения оборудования при работе с механизмом Торгового Оборудования (ТО):
Попытка
// Подключение оборудования и попытка печати
Если Не ПодключитьОборудование(ВидТорговогоОборудования) Тогда
ВызватьИсключение "Не удалось подключить ККТ";
КонецЕсли;
// Проверка остатка номенклатуры
Если ОстатокНаСкладе < КоличествоКПродаже Тогда
ВызватьИсключение "Недостаточно товара на складе!";
КонецЕсли;
// Логика печати чека
ПробитьЧекНаККТ(ДокументПродажи);
// Отключение оборудования при успешном завершении
ОтключитьОборудование(ВидТорговогоОборудования);
Исключение
// В случае ошибки гарантированно освобождаем порт ККТ
ОтключитьОборудование(ВидТорговогоОборудования);
// Вывод сообщения пользователю
Предупреждение(ОписаниеОшибки());
КонецПопытки;
Разберем процедуру ОтключитьОборудование из типовых обработок обслуживания 1С. Она должна перебирать подключенные клиенты торгового оборудования и явно вызывать метод Отключить() у объекта внешней компоненты:
Процедура ОтключитьОборудование(Клиент)
ТО = ПолучитьТО();
Клиенты = ПолучитьПараметрСервераТО("Клиенты", "Соответствие");
СтруктураПоиска = Новый Структура("Вид");
Для Каждого ВидТО Из Перечисления.ВидыТорговогоОборудования Цикл
Если Клиент.ПоддерживаетсяВидТО(ВидТО) Тогда
СтруктураПоиска.Вид = ВидТО;
СтрокиТО = ТО.НайтиСтроки(СтруктураПоиска);
Для Каждого СтрокаТО Из СтрокиТО Цикл
Если СтрокаТО.Ссылки = 1 Тогда
СтрокаТО.Ссылки = 0;
// Явный вызов отключения драйвера ККТ для освобождения COM-порта
СтрокаТО.Обработка.Отключить(СтрокаТО.Объект);
ИначеЕсли СтрокаТО.Ссылки > 1 Тогда
СтрокаТО.Ссылки = СтрокаТО.Ссылки - 1;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Клиенты.Удалить(Клиент);
КонецПроцедуры
Если программный код 1С полностью исправен, но ошибка периодически повторяется, стоит проверить системные настройки подключения кассового аппарата:
settings.xml обращается именно к выделенному для ОФД порту и не пытается занять рабочий порт 1С.