Многие разработчики 1С сталкиваются с ситуацией, когда код для работы с контрольно-кассовой техникой (ККТ) идеально работает на локальной файловой базе или на компьютере разработчика, но «отказывается взлетать» при переносе в рабочую клиент-серверную среду. Типичные симптомы: объект драйвера успешно создается, методы типа ПолучитьРевизиюИнтерфейса отрабатывают, но при попытке подключения (Подключить) система возвращает Ложь, а методы получения описания выдают пустые строки.
В этой статье мы подробно разберем, почему так происходит, проанализируем архитектурные ограничения платформы 1С:Предприятие и рассмотрим несколько вариантов решения проблемы: от простых правок контекста до настройки полноценной автоматической очереди печати.
Проанализируем ситуацию, описанную в теме. Разработчик пытается запустить пробитие чеков через регламентное задание. Это означает, что код выполняется в контексте НаСервере от имени системного пользователя (например, USR1CV8). В то же время сама касса физически подключена к компьютеру бухгалтера (клиентское рабочее место).
Почему сервер «не видит» кассу?
Если автоматизация не требует обязательного выполнения в фоновом режиме без участия человека, самым простым решением будет перенос логики работы с оборудованием в клиентский контекст. В управляемых формах это означает использование процедур с директивой &НаКлиенте.
Рассмотрим пример правильного вызова:
&НаКлиенте
Процедура ПробитьЧекНаКлиенте(ДанныеЧека)
// Объект драйвера должен создаваться именно здесь
Результат = ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАТОЛ10", "Atol_KKT_10", ТипВнешнейКомпоненты.Native);
Если Результат Тогда
Драйвер = Новый ("AddIn.Atol_KKT_10.Atol64"); // Пример для 10-го драйвера
// Теперь мы можем обращаться к портам локального ПК
ПараметрыПодключения = "Port=USB;Model=67;";
Драйвер.УстановитьПараметры(ПараметрыПодключения);
Драйвер.Подключить();
КонецЕсли;
КонецПроцедуры
Этот способ решает проблему «видимости» оборудования, так как код выполняется в том же сеансе ОС, где подключена касса. Однако, как справедливо замечено в обсуждении, это не позволит использовать регламентные задания.
Современные модели АТОЛ (особенно с драйвером 10-й версии) поддерживают работу по сети. Если касса подключена к локальной сети через Ethernet или Wi-Fi, или настроена служба EthernetOverUSB, сервер 1С может обращаться к ней напрямую по IP-адресу.
Разберем этот вариант по шагам:
Пример настройки параметров для сервера:
// Код выполняется НаСервере
Драйвер.УстановитьСвойство("LibraryPath", "C:\Atol\Drivers10\KKT\bin\");
Драйвер.УстановитьСвойство("Model", 67); // Код модели
Драйвер.УстановитьСвойство("ConnectionType", 1); // 1 - это TCP/IP
Драйвер.УстановитьСвойство("IPAddress", "192.168.1.150");
Драйвер.УстановитьСвойство("IPPort", 5555);
Результат = Драйвер.Connect();
В этом случае серверу не нужно «знать» о компьютере бухгалтера — он общается напрямую с «железом» по сети.
Если модель кассы не поддерживает сетевой интерфейс напрямую, можно воспользоваться решением «Веб-сервер АТОЛ». На компьютере бухгалтера (где касса подключена по USB) запускается специальная служба, которая превращает локальный драйвер в HTTP-сервис.
Как это работает:
http://192.168.1.10:16732/tasks).Это самый стабильный вариант для реализации регламентных заданий в распределенной сети, так как HTTP-запросы легко проходят через маршрутизаторы и не требуют сложной настройки DCOM.
Если вы работаете в современной конфигурации (БП 3.0, УТ 11, Розница 2.3), рекомендуется использовать штатный механизм Библиотеки подключаемого оборудования (БПО). Вместо того чтобы пытаться пробить чек мгновенно из фонового задания, мы можем использовать асинхронный подход.
Проанализируем алгоритм:
Этот метод считается «золотым стандартом» в 1С, так как он сохраняет все преимущества клиент-серверной архитектуры и не требует сложной сетевой настройки оборудования.
Разберем дополнительные факторы, которые могут блокировать работу драйвера даже при правильном контексте:
USR1CV8 по умолчанию имеет очень ограниченные права. Она может не иметь прав на чтение файлов драйвера в папке Program Files или на запись логов в системные папки. Проверьте настройки прав доступа к папкам драйвера.set_LogFile().ПолучитьОписание возвращает пустую строку, если драйвер не нашел свои конфигурационные файлы. При работе на сервере убедитесь, что все необходимые dll и xml файлы драйвера находятся в путях поиска системы или явно указаны в настройках компоненты.Подводя итог: если ваша задача — полная автоматизация без участия пользователя, выбирайте Вариант 2 (TCP/IP) или Вариант 3 (Веб-сервер). Если же допустимо наличие запущенного сеанса 1С на компьютере с кассой — используйте Вариант 4 (Очередь печати БПО). Простое перемещение серверного кода в регламентное задание без изменения способа связи с кассой работать в клиент-серверном режиме не будет.