Как подключить одну онлайн-кассу (ККТ) к двум разным базам 1С: Розница и Управление торговлей?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При автоматизации торговых точек часто возникает классическая задача: на рабочем месте кассира или менеджера установлены две разные базы данных (например, устаревшая 1С:Управление торговлей 10.3 на обычных формах и современная 1С:Розница 2.3 на управляемых формах), но физический фискальный регистратор (ККТ) всего один. Покупая второе устройство, бизнес несёт лишние расходы на покупку оборудования, фискального накопителя (ФН) и обслуживание ОФД. Поэтому гораздо выгоднее настроить печать чеков из двух баз на одну физическую кассу — для этого подойдёт готовое решение для сетевой печати 1С.

В этой статье мы подробно разберем, с какими техническими трудностями придется столкнуться при реализации этой схемы, и рассмотрим практические варианты решения проблемы блокировки портов и рассинхронизации кассовых смен.

--- ### Основные технические проблемы совместного использования ККТ

При попытке напрямую подключить одну кассу к двум разным информационным базам вы неизбежно столкнетесь со следующими препятствиями:

  1. Монопольный захват порта (COM или USB). Операционная система Windows отдает порт подключения ККТ той программе, которая первой к ней обратилась. Когда вы запускаете 1С:Розницу и открываете форму рабочего места кассира (РМК), драйвер кассы монопольно захватывает порт. При попытке пробить чек из УТ 10.3 вы получите ошибку о том, что порт занят или устройство не найдено (поможет драйвер торгового оборудования для УТ 10.3).
  2. Контроль статуса кассовой смены в 1С. Внутри конфигураций 1С логика работы с торговым оборудованием жестко привязана к документам КассоваяСмена. Если вы открыли смену на кассе из базы 1С:Розница, то физически ККТ находится в режиме открытой смены. Но база УТ 10.3 «не знает» об этом — поможет обработка фискализации чеков через TCP/IP. При попытке пробить чек из УТ программа выдаст внутреннюю ошибку «Смена закрыта». Если же вы попытаетесь штатно открыть смену в УТ, драйвер ККТ вернет ошибку «Смена уже открыта на ККТ».
  3. Одновременные транзакции. Если два пользователя одновременно нажмут кнопку пробития чека в разных базах, возникнет конфликт блокировки драйвера, который необходимо корректно обрабатывать на программном уровне.

Давайте подробно разберем, как обойти эти ограничения — для этого есть модуль совместного использования одной ККТ.

--- ### Решение 1. Динамическое подключение ККТ в момент печати

Самый простой способ решить проблему монопольного захвата портов — изменить логику работы драйвера оборудования в коде 1С. По умолчанию в типовых конфигурациях ККТ подключается при старте программы (или открытии формы РМК) и отключается только при выходе. Нам необходимо сделать так, чтобы ККТ подключалась исключительно в момент физической печати чека и мгновенно освобождала порт сразу после завершения операции.

Для реализации этого метода в управляемых формах (например, в 1С:Розница 2.3) нам потребуется доработать общий модуль, отвечающий за работу с торговым оборудованием. Нам нужно исключить постоянное удержание соединения.

Рассмотрим пример кода, который перехватывает процедуру пробития чека, принудительно открывает сессию связи с ККТ, отправляет XML-пакет чека и сразу закрывает соединение:


Процедура ПробитьЧекНаККТ(ДокументОбъект, ПараметрыПодключения) Экспорт
    
    // 1. Принудительно подключаем устройство перед печатью
    РезультатПодключения = МенеджерОборудованияКлиент.ПодключитьУстройствоПоИдентификатору(ПараметрыПодключения.ИдентификаторУстройства);
    
    Если Не РезультатПодключения Тогда
        ВызватьИсключение "Не удалось подключить ККТ для печати чека! Возможно, порт занят другой базой.";
    КонецЕсли;
    
    Попытка
        // 2. Формируем XML и отправляем команду на печать чека
        ОбъектДрайвера = ПараметрыПодключения.ОбъектДрайвера;
        ПараметрыЧека = СформироватьXMLПакетДляЧека(ДокументОбъект);
        
        РезультатПечати = ОбъектДрайвера.ПробитьЧек(ПараметрыПодключения.ПараметрУстройства, ПараметрыЧека);
        
        Если Не РезультатПечати Тогда
            ВызватьИсключение ОбъектДрайвера.ОписаниеОшибки;
        КонецЕсли;
        
    Исключение
        // Обязательно отключаем устройство даже в случае ошибки!
        МенеджерОборудованияКлиент.ОтключитьУстройствоПоИдентификатору(ПараметрыПодключения.ИдентификаторУстройства);
        ЗаписатьЛогОшибки(ОписаниеОшибки());
        ВызватьИсключение ОписаниеОшибки();
    КонецПопытки;
    
    // 3. Отключаем устройство после успешной печати
    МенеджерОборудованияКлиент.ОтключитьУстройствоПоИдентификатору(ПараметрыПодключения.ИдентификаторУстройства);

КонецПроцедуры

Использование этого подхода позволяет двум базам бесконфликтно отправлять команды на печать, так как порт ККТ свободен 99% времени работы приложений.

--- ### Решение 2. Программный обход контроля смен (Метод «Виртуальной смены»)

Даже решив проблему с портами, мы упираемся в контроль состояния смен в базах 1С. Разберем, как обойти эту проверку без нарушения логики фискального накопителя.

Основная идея заключается в том, что физическую команду открытия смены на ККТ посылает только первая («основная») база. Вторая база при нажатии кнопки «Открыть смену» должна лишь создать у себя внутренний виртуальный документ КассоваяСмена со статусом Открыта без физического обращения к ККТ.

Реализация через подмену ККТ на Эмулятор

Для реализации этого метода можно использовать оригинальный трюк с программной подменой оборудования в коде 1С перед вызовом стандартных механизмов БСП:

  1. При вызове процедуры открытия смены во второй базе мы программно проверяем, открыта ли смена на физической ККТ.
  2. Если на ККТ смена уже открыта (ее открыли из первой базы), мы временно подменяем в настройках торгового оборудования реальную ККТ на предопределенный Эмулятор фискального регистратора.
  3. Вызываем стандартную процедуру открытия смены 1С. Программа успешно создает документ КассоваяСмена, думая, что она работает с эмулятором.
  4. Сразу после этого возвращаем настройки оборудования обратно на реальную физическую ККТ.

Проанализируем пример кода для обработки открытия смены:


Процедура ПередОткрытиемСмены(Отказ)
    
    ФизическаяКассаОткрыта = ПроверитьСтатусСменыНаРеальнойККТ();
    
    Если ФизическаяКассаОткрыта Тогда
        // Подменяем ККТ на эмулятор в справочнике ПодключаемоеОборудование
        УстановитьЭмуляторВКачествеАктивногоОборудования();
        
        // Выполняем стандартное открытие смены в 1С
        ОткрытьСменуЛокальноБезККТ();
        
        // Возвращаем реальную кассу на место
        ВосстановитьРеальнуюККТ();
        
        // Отменяем стандартную транзакцию к ККТ, так как смена уже открыта физически
        Отказ = Истина; 
    КонецЕсли;

КонецПроцедуры

Аналогичную операцию подмены на эмулятор необходимо проделать и при закрытии смены, чтобы во второй базе корректно сформировался и провелся документ ОтчетОРозничныхПродажах, а реальный Z-отчет распечатался только один раз из первой базы.

--- ### Решение 3. Использование gRPC-сервера АТОЛ (Для касс АТОЛ)

Если на вашем торговом объекте установлена ККТ производства компании АТОЛ, то решить проблему можно современным системным методом без существенного изменения кода конфигураций 1С.

Начиная с 10-й версии драйверов (ДТО 10), АТОЛ поставляет встроенную службу удаленного подключения, работающую по современному протоколу gRPC (служба atol-grpc-service). Этот инструмент позволяет превратить локальную кассу в полноценное сетевое устройство — для этого подойдёт настройка gRPC сервера для касс АТОЛ.

Разберем алгоритм настройки работы через gRPC:

  1. На компьютере, к которому физически подключена ККТ по USB, запускается сетевая служба gRPC АТОЛ. В настройках службы указывается порт для прослушивания (например, 5678).
  2. Касса регистрируется в локальной сети по IP-адресу компьютера-хоста.
  3. В обеих базах 1С (и в Рознице, и в УТ) при настройке торгового оборудования в качестве канала связи выбирается не «COM/USB-порт», а «Сеть» (TCP/IP или gRPC). Указывается IP-адрес компьютера с кассой и порт службы gRPC.
  4. Драйвер АТОЛ на сетевом уровне берет на себя управление очередью печати и блокировками. Он принимает запросы от обеих баз 1С, выстраивает их в очередь и последовательно отправляет на печать.

Важное примечание: Использование старого встроенного веб-сервера АТОЛ (HTTP Server) в новых версиях драйверов может потребовать приобретения дополнительных платных лицензий от производителя, в то время как подключение по gRPC через локальную службу является стабильным и стандартным решением.

--- ### Важное юридическое предупреждение: Требования закона 54-ФЗ

Прежде чем приступать к программной реализации любой из описанных схем, обязательно выясните юридический статус ваших информационных баз.

### Резюме

Для реализации печати на одну ККТ из двух баз 1С мы рекомендуем комбинированный подход:

  1. Для касс марки АТОЛ настройте работу через сетевую службу gRPC. Это полностью снимет проблему занятых COM-портов операционной системы.
  2. Для решения проблемы кассовых смен внедрите в базы 1С механизм виртуального открытия/закрытия смен через программную подмену ККТ на эмулятор, чтобы базы могли беспрепятственно формировать чеки и отчеты о розничных продажах в автономном режиме.
← На главную