Почему мобильное приложение 1С игнорирует ИмяПринтера и как это исправить?

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

В процессе разработки мобильных решений на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда стандартные механизмы печати, привычные по работе с настольной версией Windows, ведут себя непредсказуемо. Одной из таких проблем является игнорирование параметра ИмяПринтера объекта ТабличныйДокумент при использовании встроенных средств печати мобильного приложения. Рассмотрим подробнее, почему это происходит и какие существуют обходные пути для реализации стабильной печати на конкретное устройство.

Анализ проблемы: почему стандартное свойство не работает?

Проанализируем ситуацию, описанную в обращении. Разработчик устанавливает два принтера в системе и пытается программно переключаться между ними, задавая значение свойства ИмяПринтера. Однако приложение упорно отправляет задание на тот принтер, который был выбран последним в интерактивном диалоге. Выясним причину такого поведения, углубившись в архитектуру мобильных операционных систем.

В операционной системе Windows 1С взаимодействует с принтерами напрямую через Windows API и установленные драйверы. В этом случае ИмяПринтера является четким идентификатором для системы. В мобильных ОС (Android и iOS) ситуация в корне иная. Мобильная платформа 1С, работая в режиме «Встроенными средствами приложения», не управляет очередью печати напрямую. Вместо этого она выполняет следующие шаги:

  1. Формирует временный документ в формате PDF.
  2. Передает этот файл системному менеджеру печати (Android Print Framework или iOS AirPrint).
  3. Вызывает системный диалог или фоновую службу, которая уже сама решает, куда отправить файл.

Для мобильной системы параметр ИмяПринтера, передаваемый из 1С, является не жесткой командой, а всего лишь «подсказкой» (hint). Если системный менеджер печати кэшировал предыдущий выбор пользователя, он отдаст приоритет ему, чтобы обеспечить успешное завершение операции, игнорируя программную установку.

Проблема идентификации принтеров в мобильных ОС

Разберем, почему текстовое имя принтера (например, "HP_LaserJet") часто оказывается бесполезным. В Android принтеры идентифицируются не по именам, а по внутренним URI или уникальным идентификаторам служб печати (например, com.android.bpp://...). Поскольку в мобильной платформе 1С на данный момент отсутствует штатный метод ПолучитьСписокПринтеров(), который возвращал бы валидные системные идентификаторы, разработчик физически не может передать в свойство ИмяПринтера то значение, которое система смогла бы однозначно распознать.

Решение №1: Прямая печать через сокеты (TCP/IP)

Если перед нами стоит задача жестко закрепить принтер за конкретным рабочим местом (например, печать чеков или этикеток на складе), самым надежным способом будет обход системного менеджера печати. Мы можем отправить данные напрямую на IP-адрес принтера, используя протоколы RAW (порт 9100) или LPR.

Рассмотрим пример реализации такой печати. Для этого нам понадобится сформировать данные (например, в формате ZPL, ESC/POS или просто текстовую строку) и отправить их через объект ЗаписьДанных.


// Пример прямой отправки данных на принтер по IP
Процедура НапечататьНаПринтерНапрямую(ДанныеДляПечати, IPАдресПринтера)
    
    Порт = 9100; // Стандартный порт для RAW печати
    Соединение = Новый TCPСоединение(IPАдресПринтера, Порт);
    
    Если Соединение.Подключено() Тогда
        Поток = Соединение.ПолучитьПоток();
        ЗаписьДанных = Новый ЗаписьДанных(Поток);
        
        // Отправляем сформированные данные (например, команды принтера)
        ЗаписьДанных.ЗаписатьСтроку(ДанныеДляПечати);
        ЗаписьДанных.СброситьБуфер();
        
        Поток.Закрыть();
        Соединение.Закрыть();
        Сообщить("Данные успешно отправлены на печать.");
    Иначе
        Сообщить("Не удалось установить соединение с принтером по адресу: " + IPАдресПринтера);
    КонецЕсли;
    
КонецПроцедуры

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

Решение №2: Использование внешних компонент

Для более сложных задач, таких как печать полноценных графических макетов или работа через Bluetooth, рекомендуется использовать специализированные внешние компоненты. Посмотрим на алгоритм работы с ними:

  1. Подключается внешняя компонента (разработанная на Native API).
  2. Компонента получает список доступных устройств (MAC-адреса для Bluetooth или IP для Wi-Fi).
  3. Табличный документ 1С сохраняется в картинку или PDF.
  4. Данные передаются компоненте, которая сама управляет протоколом обмена с принтером.

Это позволяет программно выбирать устройство, не полагаясь на стандартное свойство ИмяПринтера, которое в мобильной среде работает нестабильно.

Решение №3: Взаимодействие через Android Intents

Проанализируем еще один вариант — использование сторонних приложений-драйверов (например, PrintHand или RawBT). Эти приложения регистрируют в системе специальные "намерения" (Intents), которые мобильная 1С может вызывать через объект ЗапускПриложенияМобильногоУстройства.

При таком подходе мы можем передать файл PDF и в параметрах запуска указать ID принтера, если стороннее приложение это поддерживает. Рассмотрим схему вызова:


// Схематичный пример вызова стороннего сервиса печати через Intent
ЗапускПриложения = Новый ЗапускПриложенияМобильногоУстройства();
ЗапускПриложения.Действие = "android.intent.action.SEND";
ЗапускПриложения.ТипДанных = "application/pdf";

// Указываем путь к предварительно сохраненному файлу
ПутьКФайлу = "file://" + ПутьНаУстройстве;
ЗапускПриложения.ДополнительныеДанные.Добавить("android.intent.extra.STREAM", ПутьКФайлу);

// Если приложение-драйвер поддерживает выбор принтера через параметры:
ЗапускПриложения.ДополнительныеДанные.Добавить("printer_id", "Your_Printer_Unique_ID");

ЗапускПриложения.Запустить(Истина);

Подведение итогов

Выясним причину, по которой стандартный подход не оправдал ожиданий: мобильная платформа 1С спроектирована таким образом, чтобы максимально использовать стандартные возможности ОС для безопасности и универсальности. Однако это накладывает ограничения на тонкую настройку печати. Свойство ИмяПринтера в мобильной версии 8.3.24.66 и смежных не является надежным инструментом для выбора устройства.

Для стабильной работы в корпоративном секторе рекомендуем:

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

← На главную