При разработке мобильных приложений на платформе 1С:Предприятие для ОС Android разработчики часто сталкиваются с неприятной особенностью: стандартная печать табличного документа на принтеры этикеток работает некорректно. Основная «дичь», как выражаются пользователи, заключается в том, что макет смещается, текст печатается на стыке двух этикеток, а системные настройки печати Android игнорируют параметры страницы, заданные в 1С. Это происходит из-за того, что стандартный диспетчер печати Android пытается подогнать документ под формат А4 или добавляет собственные невидимые поля.
В этой статье мы подробно разберем, почему так происходит, и рассмотрим три проверенных способа решения проблемы: от использования серверных мощностей до прямой отправки команд принтеру.
Проанализируем ситуацию: когда мы вызываем метод Напечатать() в мобильном приложении, 1С передает управление системному сервису печати Android. Этот сервис зачастую не предназначен для работы с узкой термолентой. Он воспринимает ТабличныйДокумент как обычный графический объект и пытается применить к нему стандартные алгоритмы масштабирования. Даже если вы установите АвтоМасштаб в Ложь и зададите поля в 0, системный драйвер может добавить свои отступы в 3–5 мм, что для этикетки размером 30x20 мм является критичным. В итоге мы получаем смещение калибровки, и принтер «теряет» начало этикетки.
Это самый надежный способ, который рекомендует большинство опытных разработчиков. Суть заключается в том, чтобы не заставлять мобильное устройство печатать самостоятельно, а делегировать эту задачу полноценному серверу или стационарному компьютеру, к которому подключен принтер.
Разберем алгоритм реализации этого метода по шагам:
ТабличныйДокумент, сохраняется в PDF или сразу отправляется на сетевой принтер через консольную утилиту.Рассмотрим пример кода для передачи данных из мобильного приложения через HTTP-запрос:
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("НомерЗаказа", Объект.Номер);
ПараметрыЗапроса.Вставить("ИмяПринтера", "Zebra_Sklad_1");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Отправка на сервер через HTTPСоединение
Соединение = Новый HTTPСоединение("192.168.1.100", 80, "Логин", "Пароль");
Запрос = Новый HTTPЗапрос("/your_base/hs/print/label");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
На стороне сервера в методе HTTP-сервиса мы получаем эти данные и используем внешнюю программу для печати, например, PDFtoPrinter или SumatraPDF, чтобы избежать проблем с диалоговыми окнами. Проанализируем пример серверного кода:
// Путь к временному файлу
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
// Вызов консольной утилиты для печати без лишних вопросов
КомандаЗапуска = "C:\PrintUtils\PDFtoPrinter.exe """ + ИмяФайла + """ """ + ИмяПринтера + """";
ЗапуститьПриложение(КомандаЗапуска, , Истина);
Если нам нужна максимальная скорость и четкость штрихкода, мы должны отказаться от графической печати в пользу текстовых команд. Профессиональные принтеры этикеток (Zebra, Honeywell, XPrinter) понимают специальные языки разметки. Выясним причину, почему это лучше: в этом случае принтер сам рисует линии и генерирует штрихкод из текста, что исключает размытие или искажение при масштабировании.
Рассмотрим пример формирования строки на языке TSPL (популярен в принтерах XPrinter) для печати простого текста:
Команда = "SIZE 40 mm, 30 mm" + Символы.ПС; // Размер этикетки
Команда = Команда + "GAP 3 mm, 0" + Символы.ПС; // Зазор между этикетками
Команда = Команда + "CLS" + Символы.ПС; // Очистка буфера
Команда = Команда + "TEXT 10,10,""ROMAN.TTF"",0,1,1,""Заказ №" + НомерЗаказа + """" + Символы.ПС;
Команда = Команда + "PRINT 1,1" + Символы.ПС; // Печать 1 копии
Эту строку можно отправить на принтер напрямую через TCP/IP Socket (если принтер сетевой) или через Bluetooth, используя внешнюю компоненту для мобильной платформы 1С.
Если разработка собственного сервиса кажется слишком сложной, рассмотрим вариант с использованием посредника в виде Android-приложения RawBT (или аналогичного PrintHand). Это специализированные драйверы, которые умеют принимать данные от 1С и передавать их на принтер в «сыром» виде, минуя стандартный диспетчер печати Android.
Для реализации этого метода выполним следующие шаги:
ЗапуститьПриложение, передав путь к файлу в параметрах Intent.Этот способ позволяет жестко задать настройки бумаги в самом приложении RawBT, и Android больше не сможет их изменить по своему усмотрению.
Если вы все же решили бороться со стандартной печатью, проанализируем настройки ТабличногоДокумента, которые обязательны к исполнению:
Подведем итог: для стабильной работы на складе или в рознице наиболее предпочтительным является Способ 1 (печать через сервер), так как он обеспечивает полный контроль над очередью печати и макетом. Если же мобильное устройство должно быть автономным, используйте Способ 2 (ZPL/TSPL команды) для прямой связи с принтером через Bluetooth.