При автоматизации торговых точек часто возникает классическая задача: на рабочем месте кассира или менеджера установлены две разные базы данных (например, устаревшая 1С:Управление торговлей 10.3 на обычных формах и современная 1С:Розница 2.3 на управляемых формах), но физический фискальный регистратор (ККТ) всего один. Покупая второе устройство, бизнес несёт лишние расходы на покупку оборудования, фискального накопителя (ФН) и обслуживание ОФД. Поэтому гораздо выгоднее настроить печать чеков из двух баз на одну физическую кассу — для этого подойдёт готовое решение для сетевой печати 1С.
В этой статье мы подробно разберем, с какими техническими трудностями придется столкнуться при реализации этой схемы, и рассмотрим практические варианты решения проблемы блокировки портов и рассинхронизации кассовых смен.
--- ### Основные технические проблемы совместного использования ККТ
При попытке напрямую подключить одну кассу к двум разным информационным базам вы неизбежно столкнетесь со следующими препятствиями:
КассоваяСмена. Если вы открыли смену на кассе из базы 1С:Розница, то физически ККТ находится в режиме открытой смены. Но база УТ 10.3 «не знает» об этом — поможет обработка фискализации чеков через TCP/IP. При попытке пробить чек из УТ программа выдаст внутреннюю ошибку «Смена закрыта». Если же вы попытаетесь штатно открыть смену в УТ, драйвер ККТ вернет ошибку «Смена уже открыта на ККТ».Давайте подробно разберем, как обойти эти ограничения — для этого есть модуль совместного использования одной ККТ.
--- ### Решение 1. Динамическое подключение ККТ в момент печати
Самый простой способ решить проблему монопольного захвата портов — изменить логику работы драйвера оборудования в коде 1С. По умолчанию в типовых конфигурациях ККТ подключается при старте программы (или открытии формы РМК) и отключается только при выходе. Нам необходимо сделать так, чтобы ККТ подключалась исключительно в момент физической печати чека и мгновенно освобождала порт сразу после завершения операции.
Для реализации этого метода в управляемых формах (например, в 1С:Розница 2.3) нам потребуется доработать общий модуль, отвечающий за работу с торговым оборудованием. Нам нужно исключить постоянное удержание соединения.
Рассмотрим пример кода, который перехватывает процедуру пробития чека, принудительно открывает сессию связи с ККТ, отправляет XML-пакет чека и сразу закрывает соединение:
Процедура ПробитьЧекНаККТ(ДокументОбъект, ПараметрыПодключения) Экспорт
// 1. Принудительно подключаем устройство перед печатью
РезультатПодключения = МенеджерОборудованияКлиент.ПодключитьУстройствоПоИдентификатору(ПараметрыПодключения.ИдентификаторУстройства);
Если Не РезультатПодключения Тогда
ВызватьИсключение "Не удалось подключить ККТ для печати чека! Возможно, порт занят другой базой.";
КонецЕсли;
Попытка
// 2. Формируем XML и отправляем команду на печать чека
ОбъектДрайвера = ПараметрыПодключения.ОбъектДрайвера;
ПараметрыЧека = СформироватьXMLПакетДляЧека(ДокументОбъект);
РезультатПечати = ОбъектДрайвера.ПробитьЧек(ПараметрыПодключения.ПараметрУстройства, ПараметрыЧека);
Если Не РезультатПечати Тогда
ВызватьИсключение ОбъектДрайвера.ОписаниеОшибки;
КонецЕсли;
Исключение
// Обязательно отключаем устройство даже в случае ошибки!
МенеджерОборудованияКлиент.ОтключитьУстройствоПоИдентификатору(ПараметрыПодключения.ИдентификаторУстройства);
ЗаписатьЛогОшибки(ОписаниеОшибки());
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
// 3. Отключаем устройство после успешной печати
МенеджерОборудованияКлиент.ОтключитьУстройствоПоИдентификатору(ПараметрыПодключения.ИдентификаторУстройства);
КонецПроцедуры
Использование этого подхода позволяет двум базам бесконфликтно отправлять команды на печать, так как порт ККТ свободен 99% времени работы приложений.
--- ### Решение 2. Программный обход контроля смен (Метод «Виртуальной смены»)
Даже решив проблему с портами, мы упираемся в контроль состояния смен в базах 1С. Разберем, как обойти эту проверку без нарушения логики фискального накопителя.
Основная идея заключается в том, что физическую команду открытия смены на ККТ посылает только первая («основная») база. Вторая база при нажатии кнопки «Открыть смену» должна лишь создать у себя внутренний виртуальный документ КассоваяСмена со статусом Открыта без физического обращения к ККТ.
Для реализации этого метода можно использовать оригинальный трюк с программной подменой оборудования в коде 1С перед вызовом стандартных механизмов БСП:
КассоваяСмена, думая, что она работает с эмулятором.Проанализируем пример кода для обработки открытия смены:
Процедура ПередОткрытиемСмены(Отказ)
ФизическаяКассаОткрыта = ПроверитьСтатусСменыНаРеальнойККТ();
Если ФизическаяКассаОткрыта Тогда
// Подменяем ККТ на эмулятор в справочнике ПодключаемоеОборудование
УстановитьЭмуляторВКачествеАктивногоОборудования();
// Выполняем стандартное открытие смены в 1С
ОткрытьСменуЛокальноБезККТ();
// Возвращаем реальную кассу на место
ВосстановитьРеальнуюККТ();
// Отменяем стандартную транзакцию к ККТ, так как смена уже открыта физически
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Аналогичную операцию подмены на эмулятор необходимо проделать и при закрытии смены, чтобы во второй базе корректно сформировался и провелся документ ОтчетОРозничныхПродажах, а реальный Z-отчет распечатался только один раз из первой базы.
--- ### Решение 3. Использование gRPC-сервера АТОЛ (Для касс АТОЛ)
Если на вашем торговом объекте установлена ККТ производства компании АТОЛ, то решить проблему можно современным системным методом без существенного изменения кода конфигураций 1С.
Начиная с 10-й версии драйверов (ДТО 10), АТОЛ поставляет встроенную службу удаленного подключения, работающую по современному протоколу gRPC (служба atol-grpc-service). Этот инструмент позволяет превратить локальную кассу в полноценное сетевое устройство — для этого подойдёт настройка gRPC сервера для касс АТОЛ.
Разберем алгоритм настройки работы через gRPC:
5678).Важное примечание: Использование старого встроенного веб-сервера АТОЛ (HTTP Server) в новых версиях драйверов может потребовать приобретения дополнительных платных лицензий от производителя, в то время как подключение по gRPC через локальную службу является стабильным и стандартным решением.
--- ### Важное юридическое предупреждение: Требования закона 54-ФЗ
Прежде чем приступать к программной реализации любой из описанных схем, обязательно выясните юридический статус ваших информационных баз.
### Резюме
Для реализации печати на одну ККТ из двух баз 1С мы рекомендуем комбинированный подход: