Как настроить корректную печать этикеток из мобильного приложения 1С на Android?

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

При разработке мобильных приложений на платформе 1С:Предприятие для ОС Android разработчики часто сталкиваются с неприятной особенностью: стандартная печать табличного документа на принтеры этикеток работает некорректно. Основная «дичь», как выражаются пользователи, заключается в том, что макет смещается, текст печатается на стыке двух этикеток, а системные настройки печати Android игнорируют параметры страницы, заданные в 1С. Это происходит из-за того, что стандартный диспетчер печати Android пытается подогнать документ под формат А4 или добавляет собственные невидимые поля.

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

Почему стандартный механизм 1С и Android дает сбой?

Проанализируем ситуацию: когда мы вызываем метод Напечатать() в мобильном приложении, 1С передает управление системному сервису печати Android. Этот сервис зачастую не предназначен для работы с узкой термолентой. Он воспринимает ТабличныйДокумент как обычный графический объект и пытается применить к нему стандартные алгоритмы масштабирования. Даже если вы установите АвтоМасштаб в Ложь и зададите поля в 0, системный драйвер может добавить свои отступы в 3–5 мм, что для этикетки размером 30x20 мм является критичным. В итоге мы получаем смещение калибровки, и принтер «теряет» начало этикетки.

Способ 1. Печать через Web-сервис на стороне сервера

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

Разберем алгоритм реализации этого метода по шагам:

  1. Подготовка данных в мобильном приложении: Вместо вывода на печать мы собираем все данные для этикетки (номер заказа, артикул, штрихкод) в структуру или JSON.
  2. Передача на сервер: Вызываем специально написанный HTTP-сервис или Web-сервис на стороне основной базы 1С.
  3. Формирование и отправка: На сервере 1С формируется ТабличныйДокумент, сохраняется в 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 """ + ИмяФайла + """ """ + ИмяПринтера + """";
ЗапуститьПриложение(КомандаЗапуска, , Истина);

Способ 2. Использование языков управления принтером (ZPL, TSPL, EPL)

Если нам нужна максимальная скорость и четкость штрихкода, мы должны отказаться от графической печати в пользу текстовых команд. Профессиональные принтеры этикеток (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С.

Способ 3. Использование приложения-драйвера RawBT

Если разработка собственного сервиса кажется слишком сложной, рассмотрим вариант с использованием посредника в виде Android-приложения RawBT (или аналогичного PrintHand). Это специализированные драйверы, которые умеют принимать данные от 1С и передавать их на принтер в «сыром» виде, минуя стандартный диспетчер печати Android.

Для реализации этого метода выполним следующие шаги:

  1. Установим RawBT на мобильное устройство и настроим связь с принтером.
  2. В 1С сформируем файл этикетки (например, в формате изображения или PDF).
  3. Вызовем RawBT через механизм ЗапуститьПриложение, передав путь к файлу в параметрах Intent.

Этот способ позволяет жестко задать настройки бумаги в самом приложении RawBT, и Android больше не сможет их изменить по своему усмотрению.

Важные технические нюансы настройки макета

Если вы все же решили бороться со стандартной печатью, проанализируем настройки ТабличногоДокумента, которые обязательны к исполнению:

Подведем итог: для стабильной работы на складе или в рознице наиболее предпочтительным является Способ 1 (печать через сервер), так как он обеспечивает полный контроль над очередью печати и макетом. Если же мобильное устройство должно быть автономным, используйте Способ 2 (ZPL/TSPL команды) для прямой связи с принтером через Bluetooth.

← На главную