При автоматизации розничной торговли часто возникает ситуация, когда несколько продавцов или менеджеров должны печатать чеки на одну общую онлайн-кассу. В случае с популярной моделью Атол 55Ф, подключенной по Ethernet, пользователи часто сталкиваются с ошибкой: "Устройство правильно настроено и соответствующий порт не занят другим приложением".
Разберем детально, почему это происходит и какими способами можно организовать стабильную совместную работу. Проблема заключается в том, что стандартный драйвер 1С при подключении к ККТ захватывает сетевой порт (или COM-порт) монопольно. Пока у одного пользователя открыта форма чека или сеанс работы с оборудованием не завершен, второй пользователь будет получать отказ.
Самый современный и рекомендуемый производителем способ — использование Драйвера торгового оборудования (ДТО) версии 10. В этой версии реализован полноценный веб-сервер, который выступает посредником между 1С и кассой.
Рассмотрим алгоритм настройки этого режима:
16732).Проанализируем преимущество этого метода: веб-сервер умеет самостоятельно выстраивать очередь запросов. Если два пользователя нажмут кнопку "Пробить" одновременно, сервер примет оба JSON-задания, выполнит первое, а второе поставит в очередь на несколько миллисекунд, не выдавая ошибку "порт занят".
Если используется старая конфигурация, такая как Комплексная автоматизация 1.1, и переход на новый драйвер затруднителен, мы можем реализовать механизм очереди на стороне 1С. Суть метода заключается в том, что рабочие места вообще не подключаются к кассе напрямую.
Разберем по шагам, как это реализовать программно:
ОчередьЧековНаПечать. В нем будем хранить данные чека в виде XML или просто ссылку на документ.Рассмотрим пример кода для обработки такой очереди:
Процедура ОбработатьОчередьЧеков() Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 * ИЗ РегистрСведений.ОчередьЧековНаПечать ГДЕ Статус = &СтатусНовый";
Запрос.УстановитьПараметр("СтатусНовый", Перечисления.СтатусыЧеков.Новый);
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого СтрокаОчереди Из Результат Цикл
// Подключаемся к кассе только здесь, в одном потоке
Если ПодключитьККТ() Тогда
РезультатПечати = НапечататьЧек(СтрокаОчереди.Объект);
Если РезультатПечати Тогда
ЗафиксироватьУспех(СтрокаОчереди);
КонецЕсли;
ОтключитьККТ();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод гарантирует, что к порту кассы всегда обращается только один сеанс 1С — наше фоновое задание. Остальные пользователи лишь добавляют записи в таблицу.
Выясним причину, почему порт часто остается занятым. В старых реализациях 1С метод ПодключитьОборудование() вызывается при открытии формы, а ОтключитьОборудование() — при закрытии. Если кассир открыл чек и ушел на перерыв, порт будет заблокирован.
Чтобы минимизировать конфликты, необходимо перенастроить логику работы с объектом Драйвер в коде 1С:
НапечататьЧек.Попытка ... КонецПопытки) вызывать деактивацию устройства.Также полезно будет добавить цикл ожидания в момент подключения. Проанализируем пример функции подключения с "настойчивым" ожиданием:
Функция ПодключитьсяКККТСПовтором(ОбъектДрайвера, КоличествоПопыток = 5)
Для Счетчик = 1 По КоличествоПопыток Цикл
Результат = ОбъектДрайвера.Подключить();
Если Результат = 0 Тогда // 0 - успех для Атол
Возврат Истина;
КонецЕсли;
// Если порт занят, ждем 2 секунды перед следующей попыткой
Пауза(2);
КонецЦикла;
Возврат Ложь;
КонецФункции
Существуют специализированные программные "прокладки", такие как KKMServer или проект Print2FR. Они работают по принципу принт-сервера для касс.
Разберем принцип их работы: На компьютере, имеющем доступ к Атол 55Ф, устанавливается небольшая утилита. Она эмулирует работу кассы для всех остальных компьютеров в сети. 1С на рабочих местах обращается не к драйверу Атол, а к этому серверу по протоколу HTTP. Преимущество: полная независимость от версии 1С и платформы. Вы можете печатать чеки даже из браузера или разных баз данных одновременно.
Это решение особенно эффективно, если у вас смешанная среда (например, часть рабочих мест на 1С 7.7, а часть на 8.3), так как сервер очереди берет на себя все вопросы совместимости с низкоуровневым протоколом ККТ.
При использовании одной кассы на нескольких рабочих местах, мы должны помнить о требованиях законодательства:
Подводя итог, можно сказать, что для современных конфигураций оптимальным выбором будет веб-сервер АТОЛ, а для кастомизированных или старых систем (КА 1.1) — создание внутренней очереди чеков в 1С или использование KKMServer.