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

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

При работе с мобильным клиентом 1С на терминалах сбора данных (ТСД) под управлением Android разработчики часто сталкиваются с проблемой нестабильности стандартной подсистемы печати. Основная сложность заключается в том, что принтеры, добавленные в систему по IP-адресу, могут периодически «пропадать» из списка доступных устройств, а стандартный диалог 1С требует лишних действий от оператора. В этой статье мы подробно разберем несколько стратегий реализации печати, которые позволяют обойти ограничения мобильной платформы и обеспечить бесперебойную работу склада или производства. Для обхода подобных ограничений также можно использовать внешнюю компоненту под Android для принтеров этикеток и чеков Bixolon.

Проблема стандартных средств печати

Стандартный механизм мобильной платформы 1С при вызове метода Напечатать() для объекта ТабличныйДокумент использует встроенные средства операционной системы Android (Print Framework). Проанализируем, почему это не всегда удобно:

  1. Человеческий фактор: Появляется системное окно выбора принтера и подтверждения параметров, что замедляет работу на ТСД.
  2. Нестабильность службы печати: В версиях Android 6–9 агрессивные настройки энергосбережения часто «усыпляют» Print Spooler, из-за чего принтеры становятся недоступными до перезагрузки службы.
  3. Отсутствие программного контроля: Из кода 1С практически невозможно принудительно выбрать конкретный принтер по его IP-адресу без открытия диалогового окна.

Решение 1: Перенос логики печати на сторону сервера (HTTP-сервис)

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

Алгоритм реализации выглядит следующим образом:

  1. На основном сервере 1С или отдельном принт-сервере создается HTTP-сервис.
  2. Мобильный клиент формирует данные для печати (например, структуру с параметрами или готовый ТабличныйДокумент) и отправляет POST-запрос к этому сервису.
  3. Сервер принимает запрос, формирует печатную форму в фоновом задании и отправляет ее на принтер, используя стандартные методы Windows или Linux (CUPS).

Пример кода для отправки данных из мобильного клиента:


// Код на стороне мобильного клиента
Процедура ОтправитьНаПечатьСерверу(СсылкаНаДокумент, ИмяПринтера)
    Запрос = Новый HTTPЗапрос("/hs/PrinterService/Print");
    Запрос.УстановитьТелоИзСтроки(ЗначениеВСтрокуВнутр(Новый Структура("Документ, Принтер", СсылкаНаДокумент, ИмяПринтера)));
    
    Соединение = Новый HTTPСоединение("192.168.1.100", 80, "пользователь", "пароль");
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    
    Если Ответ.КодСостояния <> 200 Тогда
        Сообщить("Ошибка отправки задания на печать");
    КонецЕсли;
КонецПроцедуры

Решение 2: Формирование PDF и печать через командную строку

Если в вашей инфраструктуре нет возможности развернуть полноценный HTTP-сервис, проанализируем вариант с использованием промежуточного PDF-файла. Это особенно удобно, когда нужно печатать сложные формы на обычные офисные принтеры.

Пошаговый процесс:

  1. Сформируйте ТабличныйДокумент на сервере 1С.
  2. Сохраните его во временный файл в формате PDF методом Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF).
  3. Используйте внешнюю утилиту (например, SumatraPDF для Windows или lp для Linux) для отправки файла на принтер по сети.

Пример кода серверной процедуры печати через SumatraPDF:


Процедура ПечатьPDFНаСервере(ПутьКФайлу, СетевоеИмяПринтера)
    // SumatraPDF позволяет печатать без открытия окна
    Команда = """C:\Program Files\SumatraPDF\SumatraPDF.exe"" -print-to """ + СетевоеИмяПринтера + """ " + ПутьКФайлу;
    ЗапуститьПриложение(Команда, , Истина); 
КонецПроцедуры

Решение 3: Прямая отправка данных в сокет (Port 9100)

Для специализированных принтеров этикеток и чеков (Zebra, Honeywell, TSC) наиболее эффективным является метод прямой передачи управляющих кодов (ZPL, ESC/POS) через TCP-сокет. Выясним причину популярности этого метода: он работает мгновенно и не требует установки драйверов на мобильное устройство. При необходимости можно использовать компоненту для отправки управляющих кодов ZPL, TSPL и CPCL на мобильные и сетевые принтеры по сети и Bluetooth.

Разберем по шагам реализацию через объект ЗаписьДанных:

  1. Подготовьте текст задания в формате принтера (например, ZPL-код для этикетки).
  2. Откройте соединение с IP-адресом принтера по порту 9100.
  3. Запишите данные в поток и закройте соединение.

Посмотрим на пример кода:


// Прямая печать этикетки из мобильного клиента (если есть доступ к сокетам через ВК)
Процедура ПечатьНаПринтерНапрямую(IPАдрес, ТекстZPL)
    // В мобильной платформе 8.3 для прямой работы с сокетами 
    // часто используются внешние компоненты (Native Add-ins)
    ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечати", "PrinterAddIn", ТипВнешнейКомпоненты.Native);
    ОбъектПечати = Новый("AddIn.PrinterAddIn.SocketPrinter");
    
    Если ОбъектПечати.Подключить(IPАдрес, 9100) Тогда
        ОбъектПечати.ОтправитьДанные(ТекстZPL);
        ОбъектПечати.Отключить();
    Иначе
        Сообщить("Принтер недоступен по адресу: " + IPАдрес);
    КонецЕсли;
КонецПроцедуры

Решение 4: Использование сторонних приложений-посредников (Intents)

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

Как это работает: Вы из 1С вызываете системный Intent (через ЗапуститьПриложение), передавая ему путь к файлу или текст и параметры принтера. Стороннее приложение берет на себя все сложности взаимодействия с драйвером и сетевым стеком. Это значительно стабильнее встроенного менеджера печати Android, так как эти программы имеют встроенные механизмы переподключения и ведения очередей.

Рекомендации по настройке ТСД

Чтобы минимизировать ситуации, когда принтеры «слетают» на ровном месте, необходимо выполнить настройку самой операционной системы Android на ТСД:

Подводя итог, можно сказать: для быстрой реализации в рамках одной локальной сети лучше всего подходит Решение 1 (HTTP-сервис), так как оно дает полный контроль над процессом и позволяет легко масштабировать систему, добавляя новые принтеры через справочник в центральной базе 1С.

← На главную