При работе с мобильным клиентом 1С на терминалах сбора данных (ТСД) под управлением Android разработчики часто сталкиваются с проблемой нестабильности стандартной подсистемы печати. Основная сложность заключается в том, что принтеры, добавленные в систему по IP-адресу, могут периодически «пропадать» из списка доступных устройств, а стандартный диалог 1С требует лишних действий от оператора. В этой статье мы подробно разберем несколько стратегий реализации печати, которые позволяют обойти ограничения мобильной платформы и обеспечить бесперебойную работу склада или производства. Для обхода подобных ограничений также можно использовать внешнюю компоненту под Android для принтеров этикеток и чеков Bixolon.
Стандартный механизм мобильной платформы 1С при вызове метода Напечатать() для объекта ТабличныйДокумент использует встроенные средства операционной системы Android (Print Framework). Проанализируем, почему это не всегда удобно:
Рассмотрим наиболее надежный архитектурный подход, который полностью исключает зависимость от службы печати Android. Суть метода заключается в том, что мобильный клиент не печатает сам, а лишь отправляет команду на сервер.
Алгоритм реализации выглядит следующим образом:
ТабличныйДокумент) и отправляет POST-запрос к этому сервису.Пример кода для отправки данных из мобильного клиента:
// Код на стороне мобильного клиента
Процедура ОтправитьНаПечатьСерверу(СсылкаНаДокумент, ИмяПринтера)
Запрос = Новый HTTPЗапрос("/hs/PrinterService/Print");
Запрос.УстановитьТелоИзСтроки(ЗначениеВСтрокуВнутр(Новый Структура("Документ, Принтер", СсылкаНаДокумент, ИмяПринтера)));
Соединение = Новый HTTPСоединение("192.168.1.100", 80, "пользователь", "пароль");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
Сообщить("Ошибка отправки задания на печать");
КонецЕсли;
КонецПроцедуры
Если в вашей инфраструктуре нет возможности развернуть полноценный HTTP-сервис, проанализируем вариант с использованием промежуточного PDF-файла. Это особенно удобно, когда нужно печатать сложные формы на обычные офисные принтеры.
Пошаговый процесс:
ТабличныйДокумент на сервере 1С.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF).lp для Linux) для отправки файла на принтер по сети.Пример кода серверной процедуры печати через SumatraPDF:
Процедура ПечатьPDFНаСервере(ПутьКФайлу, СетевоеИмяПринтера)
// SumatraPDF позволяет печатать без открытия окна
Команда = """C:\Program Files\SumatraPDF\SumatraPDF.exe"" -print-to """ + СетевоеИмяПринтера + """ " + ПутьКФайлу;
ЗапуститьПриложение(Команда, , Истина);
КонецПроцедуры
Для специализированных принтеров этикеток и чеков (Zebra, Honeywell, TSC) наиболее эффективным является метод прямой передачи управляющих кодов (ZPL, ESC/POS) через TCP-сокет. Выясним причину популярности этого метода: он работает мгновенно и не требует установки драйверов на мобильное устройство. При необходимости можно использовать компоненту для отправки управляющих кодов ZPL, TSPL и CPCL на мобильные и сетевые принтеры по сети и Bluetooth.
Разберем по шагам реализацию через объект ЗаписьДанных:
Посмотрим на пример кода:
// Прямая печать этикетки из мобильного клиента (если есть доступ к сокетам через ВК)
Процедура ПечатьНаПринтерНапрямую(IPАдрес, ТекстZPL)
// В мобильной платформе 8.3 для прямой работы с сокетами
// часто используются внешние компоненты (Native Add-ins)
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечати", "PrinterAddIn", ТипВнешнейКомпоненты.Native);
ОбъектПечати = Новый("AddIn.PrinterAddIn.SocketPrinter");
Если ОбъектПечати.Подключить(IPАдрес, 9100) Тогда
ОбъектПечати.ОтправитьДанные(ТекстZPL);
ОбъектПечати.Отключить();
Иначе
Сообщить("Принтер недоступен по адресу: " + IPАдрес);
КонецЕсли;
КонецПроцедуры
Если разработка собственной внешней компоненты кажется слишком трудоемкой, можно воспользоваться готовыми решениями, такими как RawBT или PrintHand. Эти приложения работают в фоне и предоставляют API для Android-приложений.
Как это работает:
Вы из 1С вызываете системный Intent (через ЗапуститьПриложение), передавая ему путь к файлу или текст и параметры принтера. Стороннее приложение берет на себя все сложности взаимодействия с драйвером и сетевым стеком. Это значительно стабильнее встроенного менеджера печати Android, так как эти программы имеют встроенные механизмы переподключения и ведения очередей.
Чтобы минимизировать ситуации, когда принтеры «слетают» на ровном месте, необходимо выполнить настройку самой операционной системы Android на ТСД:
Подводя итог, можно сказать: для быстрой реализации в рамках одной локальной сети лучше всего подходит Решение 1 (HTTP-сервис), так как оно дает полный контроль над процессом и позволяет легко масштабировать систему, добавляя новые принтеры через справочник в центральной базе 1С.