При работе с веб-клиентом 1С на мобильных устройствах под управлением Android разработчики часто сталкиваются с аппаратными ограничениями браузера. Печать документов — одна из самых сложных задач, так как стандартные механизмы печати браузера не всегда корректно взаимодействуют со специализированными принтерами (термопринтеры, чековые принтеры) или требуют избыточных действий от пользователя. Рассмотрим способы организации бесшовной печати, когда веб-версия 1С должна передать команду на печать внешнему приложению, установленному на Android-устройстве.
Основная проблема заключается в том, что веб-страница, открытая в мобильном браузере, находится в "песочнице" и не может напрямую запускать исполняемые файлы или обращаться к портам устройства. Решить эту задачу можно через механизм Deep Linking или использование собственных URI-схем.
Проанализируем алгоритм реализации этого метода:
intent-filter. Например, вы регистрируете схему myprintapp://.Разберем пример кода на стороне 1С для вызова приложения:
&НаКлиенте
Процедура КомандаПечать(Команда)
// Формируем параметры: например, ID документа или ссылку на PDF
ИдентификаторФайла = "doc_12345";
СсылкаДляПриложения = "myprintapp://print?id=" + ИдентификаторФайла;
// Переходим по ссылке, что заставит Android открыть связанное приложение
ПерейтиПоСсылке(СсылкаДляПриложения);
КонецПроцедуры
Важный нюанс: Попытка передать весь PDF-файл в строке Base64 через URI-схему, скорее всего, провалится из-за ограничений на длину URL в браузерах (обычно около 2000 символов). Поэтому правильнее передавать только уникальный идентификатор, по которому мобильное приложение само скачает файл с сервера 1С через HTTP-запрос.
Если ваши принтеры являются сетевыми и имеют статические IP-адреса в локальной сети, мы можем полностью исключить мобильное приложение-прокладку из цепочки. В этом случае печать инициируется сервером 1С напрямую на принтер.
Рассмотрим ситуацию, когда принтер поддерживает протокол JetDirect (порт 9100). Выясним причину, почему это удобно: сервер 1С "видит" принтер по IP, и нам не важен тип клиента (браузер на Android или компьютер).
Пример реализации отправки данных на принтер по IP из 1С:
&НаСервере
Процедура ОтправитьНаПринтер(ДанныеФайла, IPАдрес, Порт = 9100)
// ДанныеФайла - это ДвоичныеДанные документа (например, в формате ESC/POS или PDF)
Поток = Новый ЗаписьДанных(IPАдрес, Порт);
Поток.Записать(ДанныеФайла);
Поток.Закрыть();
КонецПроцедуры
Этот способ требует, чтобы принтер понимал формат данных, который вы отправляете. Большинство чековых принтеров работают с системой команд ESC/POS. Если же принтер поддерживает прямую печать PDF, вы можете отправлять двоичные данные PDF-файла напрямую в сокет.
Современные браузеры (например, Google Chrome на Android) поддерживают Web Share API. Мы можем программно вызвать системное окно "Поделиться", в котором пользователь выберет ваше приложение для печати.
Рассмотрим, как это работает:
1. 1С формирует PDF и передает его на клиент в виде ДвоичныеДанные.
2. С помощью JavaScript (через механизм ЗапуститьСценарий или через внедрение JS в HTML-поле) вызывается метод navigator.share.
3. Ваше Android-приложение должно быть зарегистрировано в системе как обработчик файлов типа application/pdf.
Это более дружелюбный интерфейс для пользователя, так как он видит стандартное меню Android, но требует написания небольшого объема JavaScript-кода внутри управляемой формы 1С.
Если использование браузера не является критическим требованием, проанализируем альтернативу в виде Мобильного клиента 1С. В отличие от веб-клиента, мобильный клиент — это полноценное нативное приложение от фирмы "1С", которое умеет работать с внешними компонентами.
Преимущества этого подхода:
.jar или .so библиотеки от производителя принтера через механизм внешних компонент.Разберем еще один "промышленный" вариант. На Android-устройстве запускается фоновая служба (Service), которая открывает локальный HTTP-порт (например, localhost:8080). Веб-клиент 1С отправляет AJAX-запрос на этот локальный адрес.
Преимущество метода заключается в его надежности:
localhost безопасным.Для реализации этого метода в 1С используется объект HTTPЗапрос, направленный на локальный адрес устройства. Это позволяет избежать открытия новых вкладок браузера или переключения между приложениями, что значительно ускоряет работу оператора.
Подведем итог: Выбор метода зависит от инфраструктуры. Если принтеры сетевые — используйте прямую печать по IP с сервера. Если принтеры локальные (USB/Bluetooth) или требуют специфических драйверов — оптимальным будет использование URI-схем для вызова внешнего приложения или переход на Мобильный клиент 1С для полноценной интеграции с оборудованием.