Оборудование.
Принтер.
Не маловажным вопросом есть выбор принтера. В моем понимании мобильности, принтер должен быть беспроводным (незачем играться со шнурками), а еще лучше если принтер сможет быть точкой доступа (таким образом можно исключить из списка необходимого оборудования wi-fi роутер). Облачная печать не рассматривается, так как обязательным условием будет наличие интернета, который может отсутствовать по многим причинам. Путем общения с несколькими представителями производителей принтеров для тестов был выбран принтер HP 1102w (около 100$) – дешево и сердито.
HP 1102w имеет минимум аппаратного функционала – три кнопки (учитывая кнопку включения). Чтобы принтер заработал как точка доступа нужно в веб интерфейсе перейти на вкладку сеть и установить флажок "Точка доступа". Заставить работать точкой доступа этот аппарат без изменения настроек через веб интерфейс мне не удалось. Это минус, учитывая, что настройки могут слететь "в поле". Для доступа к веб интерфейсу принтер должен получить IP-адрес от DHCP сервера, которым может быть наделен офисный wi-fi маршрутизатор или точка доступа.
При подключении принтера к ПК посредством кабеля определятся внешний накопитель на котором есть утилита для настройки - SmartInstall. Так и было до установки драйверов. На ПК где были установлены драйвера принтера внешний накопитель не определялся. То есть до начала установки желательно скопировать содержимое накопителя либо потом для перенастройки (если принтер не подключен к беспроводной сети) придется удалять драйвера, чтобы произвести повторную установку/настройку.
С точки зрения пользователя, мне непонятно как можно наделить принтер такой полезной функцией как прямая печать и не дать возможность ее быстрого включения/отключения аппаратными клавишами. Аппаратные кнопки могут только найти сеть и вкл./откл. беспроводную сеть вообще. Непосредственно само подключение мобильного устройства к принтеру не составило труда. Точка доступа (ТД) имела название типа "hp_1102_w_878sfgdfg" ошибиться невозможно. По умолчанию ТД без защиты и не требует ввода пароля при подключении.
Мобильные устройства (МУ).
Тестирование проходило на трех устройствах с разными размерами экранов и прошивками от разных поставщиков.
1) Планшет Prestigio MultiPad 4 Diamond 7.85 3G. Версия андроид 4.2, прошивка заводская;
2) Телефон Motorola XT910 RAZR 4.3" с андроид 4.4.4 от Liquidsmooth;
3) Телефон LG Optimus Sol E730 3.8" андроид 4.0.4 CyanogenMod.
Дополнительное оборудование.
Если предполагается использование в автомобиле, то принтер нужно включать в розетку, которой автомобиль не наделен. Выбираем автомобильный инвертор подходящей мощности (для данного случая 370В – около 50$). Хорошо если инвертор будет иметь порт USB для зарядки мобильного устройства, т.к. авто может иметь только один "прикуриватель" и тогда для подключения к сети МУ нужно будет отключить принтер или пользоваться переходниками – "тройниками", что не очень удобно. При печати HP 1102w потребляет порядка 370В – подключать строго через наклемники напрямую к АКБ автомобиля иначе не избежать плавленых предохранителей или еще хуже сгоревшей проводки или пожара. Вообще то все лазерные принтеры будут иметь похожее потребление так как в их устройстве есть "печь" которая запекает тонер (краску) на бумаге. Если есть желание, можно использовать струйные принтеры, потребление намного меньше, соответственно можно подключать через штатную розетку в авто. Но в "струйниках" есть свои нюансы. Коротко о сравнении лазерных и струйных принтеров можно глянуть здесь.
Макет и печатная форма.
С помощью объекта ЗаписьТекста() можно создавать файлы имеющие в себе текст определенного формата, например xml, html, cfg, config, ini и так далее. Было рассмотрено много форматов, но если сопоставить, что может напечатать Android устройство и какие форматы можно сделать из текста, то самым оптимальным и на мой взгляд единственным доступным, стал html. Не без труда конечно, но обычным текстом можно сформировать html структуру документа, наполняем его параметрами в виде переменных и в итоге получаем макет для формирования печатных форм.
Непосредственно сама разработка печатной формы казалась понятной, но как всегда, имела несколько путей решения. Можно было сделать универсальные процедуры формирующие нужные части документа – это самый "грамотный" и трудоемкий вариант, так как каждый документ имеет собственную структуру строк и колонок и с универсальностью пришлось бы повозиться. Можно также сделать отдельные формы для каждого документа, с делением html документа на понятные блоки (для знающих html). Но исходя из задачи, мною был выбран третий вариант, он же, на мой взгляд, самый простой – это банальное сохранение сформированного документа в 1С на ПК в html формате и подстановка переменных, как говорится: "где надо". Единственное изменение – это вынесение формирования табличной части в цикл, как бы копирование одного блока html текста с подстановкой нужных переменных. Уж очень подробно, но у меня без знания языка разметки html это заняло немного больше ожидаемого времени.
Ну и последнее. Процедура печати выполняется через открытие сформированного файла (например order.html) используя функцию ЗапуститьПриложение(). Далее Android предлагает открыть файл через доступные приложения, выбираем PrintHand (о нем далее). Если подтвердим использование по умолчанию для формата html программы PrintHand, то при нажатии на кнопку печать в 1С будем сразу получать открытую в программе форму документа. Так же есть вариант использования объекта ЗапускПриложенияМобильногоУстройства. Оба варианта рассматриваются ниже.
Для сохранения сформированных документов использован стандартный каталог документов.
В итоге код самой печати выглядит так (вариант 1):
ФайлИмя = КаталогДокументов()+"order.html";
Файл = ПечатьДокументов.СформироватьДокументHTML(Объект.Ссылка);
Текст = Новый ЗаписьТекста(файлИмя);
Текст.Записать(Файл);
Текст.Закрыть();
ЗапуститьПриложение(ФайлИмя);
Если использовать метод ЗапускПриложенияМобильногоУстройства (вариант 2). В коде, в таком случае, изменится только последняя строка:
// ЗапуститьПриложение(ФайлИмя);
Запуск = Новый ЗапускПриложенияМобильногоУстройства;
Запуск.Действие = "android.intent.action.VIEW";
Запуск.Данные = "file://"+ФайлИмя;
Запуск.Приложение = "com.dynamixsoftware.printhand";
Запуск.Тип = "text/html";
Запуск.Запустить(Истина);
К сожалению получить от PrintHand результата ее работы не удалось, так как html документ приложение не воспринимает как файл и для его просмотра открывает дополнительную страницу веб-просмотра. В описании разработчику PrintHand описан процесс фоновой печати и передача дополнительных параметров, собственно, как и возврат результата работы самого приложения. Но такое описание я не смог применить к 1С. Возможно есть другие приложения которые смогут корректно вернуть результат своей работы либо работать в фоновом режиме и содержать в себе все необходимое (печатать офлайн), но о таких мне не известно.
В функции СформироватьДокументHTML() все как обычно для процедур печати на всех платформах. Формируются таблицы заполнения и на их основе заполняется html документ разделенный на части (шапка, строки, подвал) для удобства.
Подводные камни.
Была проблема, которая проявилась только в ходе тестирования приложения на мобильном устройстве, на ПК все отрабатывало как надо. Это использование функции ЧислоПрописью(). Как оказалось функция не умеет работать с украинским языком на Android платформе (протестировано на 3 разных устройствах известных производителей, на разных прошивках и на разных версиях платформы 1С). Пришлось делать функцию перевода русских чисел прописью в украинские. Функция получилась весьма скромной, всего 45 строк кода.
Так же в моем методе формирования печатных форм был еще один существенный недостаток. Если нужно будет выводить по надобности дополнительную колонку (например код или артикул), придется создавать еще одну дополнительную форму, а это приличный кусок времени.
Естественно, для большинства форм нужны дополнительные данные, такие как: платежные и налоговые реквизиты организации, ответственное лицо за выписку документов, коды, штрих коды, артикулы, коды УКТВЭД и пр. Если организаций несколько и они имеют разную учетную политику, в том числе и по налогам, то естественно нужны будут и все эти данные для каждой из организаций. В общем все как обычно, данные которые выводятся в печатной форме и которые нельзя жестко привязать нужно переносить на мобильное устройство. Но, например, если организация плательщик НДС и таковой будет еще долго, то незачем таскать на мобильное устройство все ставки НДС и засорять базу лишними данными.
Приложение Android.
Нужен был софт который сможет печатать тип документов сформированный через ЗаписьТекста() (html). Перебрав огромную кучу софта в Play Маркете было обнаружено две схожие по функционалу программы от одного разработчика: PrintHand (около 10$) и PrinterShare (около 15$). Бесплатные приложения либо не умели работать с беспроводными принтерами (подключатся напрямую к wi-fi принтеру), либо с html документами.
Настройка PrintHand.
Решено было пойти логическим путем. Сначала подключено МУ к ТД принтера. При открытии документа (картинки) появилось окно с предварительным просмотром.
Жмем Настройка -> Принтер -> wi-fi Принтеры, выбираем ТД принтера, после чего приложение предложило скачать драйвера для моей модели принтера, что возможно только с присутствием интернета. Другими словами - если включен GPRS или планшет с принтером подключены к одному маршрутизатору с наличием интернета. А я уже подключился к сети принтера, вот такой казус.
Итак последовательность подключения должна выглядеть следующим образом (подразумевается, что принтер уже работает как точка доступа): утилитой smartInstall подключаем принтер к офисной/домашней сети с наличием интернета через wi-fi или используем/включаем GPRS на МУ. После, заходим в PrintHand, Установка принтера -> wi-fi Принтеры, находим и выбираем наш принтер, на предложение скачать драйвера соглашаемся. Когда установка драйверов будет завершена можно подключаться непосредственно к ТД принтера и начинать печать или сразу начинать печать если Вы использовали GPRS и МУ уже было подключено к принтеру. МУ запомнит сеть и не нужно перед печатью каждый раз подключатся. Если нет, при подключении не забываем ставить флажок "подключатся автоматически".
При самой печати с МУ все печатные формы сделаны так, чтоб не нужно было ничего больше настраивать, то есть пользователь нажал "Печать" в 1С, открылась PrintHand, нажал "Печать" в ней и страница распечатана.
Итоги.
В сети уже есть похожие статьи, например эта. Плюсы такого метода в том, что не нужно создавать отдельные макеты для мобильных устройств, а также обновлять их при доработках в центральной базе, что увеличивает объем работ при обновлении.
Главное отличие описанного мной подхода это то, что нет необходимости подключатся к центральной базе. То есть печать можно осуществлять имея только принтер и мобильное устройство. И не важно есть интернет или устройство вовсе не имеет доступа к всемирной паутине. Печать идет сразу на принтер. Такой подход более интересен когда мобильное устройство не находиться в одной сети с сервером. А также когда нужно исключить ЦБ из процесса печати. Ведь это как минимум дополнительная нагрузка на сервер, а как максимум – лишнее звено в процедуре печати, что в свою очередь менее просто и отказоустойчиво.