Прямая печать из мобильного приложения
Оборудование.
Не маловажным вопросом есть выбор принтера. В моем понимании мобильности, принтер должен быть беспроводным (незачем играться со шнурками), а еще лучше если принтер сможет быть точкой доступа (таким образом можно исключить из списка необходимого оборудования wi-fi роутер). Облачная печать не рассматривается, так как обязательным условием будет наличие интернета, который может отсутствовать по многим причинам. Путем общения с несколькими представителями производителей принтеров для тестов был выбран принтер HP 1102w (около 100$) – дешево и сердито.
HP 1102w имеет минимум аппаратного функционала – три кнопки (учитывая кнопку включения). Чтобы принтер заработал как точка доступа нужно в веб интерфейсе перейти на вкладку сеть и установить флажок «Точка доступа». Заставить работать точкой доступа этот аппарат без изменения настроек через веб интерфейс мне не удалось. Это минус, учитывая, что настройки могут слететь «в поле». Для доступа к веб интерфейсу принтер должен получить IP-адрес от DHCP сервера, которым может быть наделен офисный wi-fi маршрутизатор или точка доступа.
С точки зрения пользователя, мне непонятно как можно наделить принтер такой полезной функцией как прямая печать и не дать возможность ее быстрого включения/отключения аппаратными клавишами. Аппаратные кнопки могут только найти сеть и вкл./откл. беспроводную сеть вообще. Непосредственно само подключение мобильного устройства к принтеру не составило труда. Точка доступа (ТД) имела название типа «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):
Если использовать метод ЗапускПриложенияМобильногоУстройства (вариант 2). В коде, в таком случае, изменится только последняя строка:
К сожалению получить от PrintHand результата ее работы не удалось, так как html документ приложение не воспринимает как файл и для его просмотра открывает дополнительную страницу веб-просмотра. В описании разработчику PrintHand описан процесс фоновой печати и передача дополнительных параметров, собственно, как и возврат результата работы самого приложения. Но такое описание я не смог применить к 1С. Возможно есть другие приложения которые смогут корректно вернуть результат своей работы либо работать в фоновом режиме и содержать в себе все необходимое (печатать офлайн), но о таких мне не известно.
В функции СформироватьДокументHTML() все как обычно для процедур печати на всех платформах. Формируются таблицы заполнения и на их основе заполняется html документ разделенный на части (шапка, строки, подвал) для удобства.
Была проблема, которая проявилась только в ходе тестирования приложения на мобильном устройстве, на ПК все отрабатывало как надо. Это использование функции ЧислоПрописью(). Как оказалось функция не умеет работать с украинским языком на Android платформе (протестировано на 3 разных устройствах известных производителей, на разных прошивках и на разных версиях платформы 1С). Пришлось делать функцию перевода русских чисел прописью в украинские. Функция получилась весьма скромной, всего 45 строк кода.
Так же в моем методе формирования печатных форм был еще один существенный недостаток. Если нужно будет выводить по надобности дополнительную колонку (например код или артикул), придется создавать еще одну дополнительную форму, а это приличный кусок времени.
Естественно, для большинства форм нужны дополнительные данные, такие как: платежные и налоговые реквизиты организации, ответственное лицо за выписку документов, коды, штрих коды, артикулы, коды УКТВЭД и пр. Если организаций несколько и они имеют разную учетную политику, в том числе и по налогам, то естественно нужны будут и все эти данные для каждой из организаций. В общем все как обычно, данные которые выводятся в печатной форме и которые нельзя жестко привязать нужно переносить на мобильное устройство. Но, например, если организация плательщик НДС и таковой будет еще долго, то незачем таскать на мобильное устройство все ставки НДС и засорять базу лишними данными.
Приложение Android.
Нужен был софт который сможет печатать тип документов сформированный через ЗаписьТекста() (html). Перебрав огромную кучу софта в Play Маркете было обнаружено две схожие по функционалу программы от одного разработчика: PrintHand (около 10$) и PrinterShare (около 15$). Бесплатные приложения либо не умели работать с беспроводными принтерами (подключатся напрямую к wi-fi принтеру), либо с html документами.
Решено было пойти логическим путем. Сначала подключено МУ к ТД принтера. При открытии документа (картинки) появилось окно с предварительным просмотром.
При самой печати с МУ все печатные формы сделаны так, чтоб не нужно было ничего больше настраивать, то есть пользователь нажал «Печать» в 1С, открылась PrintHand, нажал «Печать» в ней и страница распечатана.
Итоги.
В сети уже есть похожие статьи, например эта. Плюсы такого метода в том, что не нужно создавать отдельные макеты для мобильных устройств, а также обновлять их при доработках в центральной базе, что увеличивает объем работ при обновлении.
Главное отличие описанного мной подхода это то, что нет необходимости подключатся к центральной базе. То есть печать можно осуществлять имея только принтер и мобильное устройство. И не важно есть интернет или устройство вовсе не имеет доступа к всемирной паутине. Печать идет сразу на принтер. Такой подход более интересен когда мобильное устройство не находиться в одной сети с сервером. А также когда нужно исключить ЦБ из процесса печати. Ведь это как минимум дополнительная нагрузка на сервер, а как максимум – лишнее звено в процедуре печати, что в свою очередь менее просто и отказоустойчиво.
Печать с мобильного приложения
В рамках разработки мобильного приложения кладовщика столкнулись с необходимостью печати этикеток для обклейки заказа. В данном посте я поделюсь подходами, которые удалось реализовать для решения поставленной задачи. Так как задача решалась постепенно с разным набором оборудования получилось в результате два метода:
Отправка на печать через запущенную сессию 1с на компьютере.
Отправка на печать с мобильного приложения.
В обоих методах используется генерация этикетки на стороне центральной базы. Такой подход был принят с учетом условий:
Отправка на печать через сессию на компьютере.
Исходные данные: Кладовщик перемещается по складу с мобильным устройством и портативным wi-fi принтером этикеток. Имеется постоянно запущенная сессия 1с на персональном компьютере.
В данном варианте мобильное приложение отправляет в центральную базу параметры этикетки, которую надо распечатать. На основании полученных через веб-сервис параметров центральная база формирует табличный документ этикетки заказа. После формирования табличного документа он помещается в регистр сведений с ресурс с типом ХранилищеЗначения. Табличный документ помещается в данные для печати с привязкой к пользователю, который инициировал операцию печати. Так как для вызова операции веб-сервиса центральной базы пользователь должен быть авторизован мы знаем кто инициировал печать данной этикетки.
На постоянно включенном персональном компьютере в операционной системе регистрируются wi-fi принтеры, с которыми работают кладовщики. На данной машине запускается обработка «Монитор печати», которая опрашивает регистр сведений на наличие данных для печати. Так как обработка запущена и у нас есть клиентская часть мы можем реализовать механизм сопоставления пользователя и принтера, который уже зарегистрирован в системе. В результате опроса регистра на предмет наличия данных печати этикетка печатается на сопоставленном с пользователем принтере.
Отправка на печать с мобильного приложения
Исходные данные: Кладовщик перемещается по складу с мобильным устройством и портативным bluetooth принтером этикеток.
На основании параметров веб-сервис возвращает pdf-файл этикетки, которая отправляется на печать с мобильного устройства.
Формирование и передача файла на стороне центральной базы:
Прием файла на стороне мобильного приложения:
После выполнения вышеописанных операций у нас есть pdf-файл в мобильном приложении, который надо отправить на печать. Для этого на мобильном устройстве надо установить приложение PrinterShare. Данное приложение может отправлять файлы на выбранный принтер. Но пользователь не будет каждый раз искать полученный pdf-файл, поэтому мы в мобильном приложении запускаем просмотр данного файла используя ЗапускПриложенияМобильногоУстройства().
Принтер этикеток и 1с Мобильная платформа
А как Вы сопрягаете? Только что ведь из утилиты печатало.
(5) А вообще с телефона печатать можете из других приложений? Посмотрите на 8.3.18, там реализовали печать на принтеры средствами системы, возможно стоит в эту сторону посмотреть.
В сборщике приложений в группе приложений ищите:
Поле Режим печати позволяет указать, какой способ печати будет использовать собираемое мобильное приложение. Это поле задается как в сборщике (описываемое поле), так и в свойствах информационной базы на мобильном устройстве. Приоритет имеет настройка, установленная в свойствах информационной базы. Каждая настройка может быть установлена в одно из следующих значений:
● Авто ‑ в этом случае режим печати выбирается автоматически:
● Если из приложения на устройстве ранее выполнялась печать встроенными средствами приложения ‑ будет продолжено использование этого способа печати.
● Иначе будет использовать печать средствами устройства.
Рекомендуется указывать это значение по умолчанию.
● Средствами устройства ‑ используется печать с использованием инструментов мобильной операционной системы, под управлением которой работает мобильное приложение. Печать выполняется на принтерах, которые поддерживает мобильная операционная система. При сборке приложений рекомендуется использовать этот способ печати в том случае, если собирается новая версия мобильного приложения, которое ранее выполняло печать встроенными средствами приложения, а теперь надо изменить для него режим печати.
● Встроенными средствами приложения ‑ в этом случае используется печать на принтерах, которые поддерживают языки PCL3 и ZPL. Печать выполняется только на поддерживаемых моделях принтеров. При сборке приложения рекомендуется указывать данный режим печати в том случае, когда у потребителей мобильного приложения имеется парк принтеров, совместимых с мобильной версией «1С:Предприятие» и эти принтера не поддерживаются используемой мобильной операционной системой.
Добрый день.
Да, из стандартной утилиты TSC Mobile Utility печать производиться.
Кроме того, поставил тестовую версию приложения RS: Mobile ACS «1С:Мобильная торговля» (мобильная конфигурация), так же печать идет.
То есть типовыми драйверами 1С отправляет на печать, но принтер не понимает полученную команду, при печати типовыми средствами платформы принтер «зависает».
Вот и не могу найти способ, при котором 1С отправляет только структуру, которая понятна принтеру, а не форматирует комаенду или средствами драйвера, или средствами самой платформы
Немного не верно выразился.
Вот ссылка на видео, как это сейчас происходит.
https://www.youtube.com/watch?v=L7pOVk7EgvM
То есть я могу выбрать что печатать, картинка попадает в утилиту, и печать происходит через утилиту.
Это очень не удобно, так как печать идет не напрямую, из 1С, а через посредника в виде TSC Mobile Utilites.
То есть печать есть, но печать отправляется не из самой 1С.
Но пока работающего варианта не нашел
Нашел на просторах интернета форум, в котором пользователь упомянул, что написал java-прослойку между 1С и принтером.
Связался с ним, попросил apk, через данное приложение через intent’ы все печатает.
В общем способ печати нашел
Всем откликнувшимся спасибо огромное
Не знаю, имею ли я право сбрасывать apk
Думаю если нужно будет кому сброшу
Ниже переписка с автором приложения
Сделал, чтобы в этикетке печатался кладовщик в последней строки, и название товара в первой строке. Изображение этикетки в картинке во вложении.
1С должна передать в приложение Андроид следующий текст:
TEXT 400,590,»4″,180,1,1,2,»Смесь Гавайская с/м»
TEXT 400,550,»4″,180,1,1,2,»ФЗП ООО»
QRCODE 300,310,H,9,A,0,M2,S7,»850000001323898″
TEXT 400,290,»4″,180,1,1,2,»850000001323898″
TEXT 400,260,»4″,180,1,1,2,»Коробок на паллете: 35″
TEXT 400,220,»3″,180,1,1,2,»Единицы измерения шт 80″
TEXT 400,180,»2″,180,1,1,2,»ИД 1323898 Приходный ордер (склад) 002486498 от 01.11.2017 0:00:00″
TEXT 400,150,»2″,180,1,1,2,»Склад хранения: Склад_Заморозки_БГ»
TEXT 400,120,»2″,180,1,1,2,»Кладовщик: Денисов Алексей Николаевич»
Ваш браузер устарел, пожалуйста обновите ваш браузер пройдя по ссылке www.microsoft.com/download
Прямая печать из мобильного приложения
Оборудование.
Не маловажным вопросом есть выбор принтера. В моем понимании мобильности, принтер должен быть беспроводным (незачем играться со шнурками), а еще лучше если принтер сможет быть точкой доступа (таким образом можно исключить из списка необходимого оборудования wi-fi роутер). Облачная печать не рассматривается, так как обязательным условием будет наличие интернета, который может отсутствовать по многим причинам. Путем общения с несколькими представителями производителей принтеров для тестов был выбран принтер HP 1102w (около 100$) – дешево и сердито.
HP 1102w имеет минимум аппаратного функционала – три кнопки (учитывая кнопку включения). Чтобы принтер заработал как точка доступа нужно в веб интерфейсе перейти на вкладку сеть и установить флажок «Точка доступа». Заставить работать точкой доступа этот аппарат без изменения настроек через веб интерфейс мне не удалось. Это минус, учитывая, что настройки могут слететь «в поле». Для доступа к веб интерфейсу принтер должен получить IP-адрес от DHCP сервера, которым может быть наделен офисный wi-fi маршрутизатор или точка доступа.
С точки зрения пользователя, мне непонятно как можно наделить принтер такой полезной функцией как прямая печать и не дать возможность ее быстрого включения/отключения аппаратными клавишами. Аппаратные кнопки могут только найти сеть и вкл./откл. беспроводную сеть вообще. Непосредственно само подключение мобильного устройства к принтеру не составило труда. Точка доступа (ТД) имела название типа «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):
Если использовать метод ЗапускПриложенияМобильногоУстройства (вариант 2). В коде, в таком случае, изменится только последняя строка:
К сожалению получить от PrintHand результата ее работы не удалось, так как html документ приложение не воспринимает как файл и для его просмотра открывает дополнительную страницу веб-просмотра. В описании разработчику PrintHand описан процесс фоновой печати и передача дополнительных параметров, собственно, как и возврат результата работы самого приложения. Но такое описание я не смог применить к 1С. Возможно есть другие приложения которые смогут корректно вернуть результат своей работы либо работать в фоновом режиме и содержать в себе все необходимое (печатать офлайн), но о таких мне не известно.
В функции СформироватьДокументHTML() все как обычно для процедур печати на всех платформах. Формируются таблицы заполнения и на их основе заполняется html документ разделенный на части (шапка, строки, подвал) для удобства.
Была проблема, которая проявилась только в ходе тестирования приложения на мобильном устройстве, на ПК все отрабатывало как надо. Это использование функции ЧислоПрописью(). Как оказалось функция не умеет работать с украинским языком на Android платформе (протестировано на 3 разных устройствах известных производителей, на разных прошивках и на разных версиях платформы 1С). Пришлось делать функцию перевода русских чисел прописью в украинские. Функция получилась весьма скромной, всего 45 строк кода.
Так же в моем методе формирования печатных форм был еще один существенный недостаток. Если нужно будет выводить по надобности дополнительную колонку (например код или артикул), придется создавать еще одну дополнительную форму, а это приличный кусок времени.
Естественно, для большинства форм нужны дополнительные данные, такие как: платежные и налоговые реквизиты организации, ответственное лицо за выписку документов, коды, штрих коды, артикулы, коды УКТВЭД и пр. Если организаций несколько и они имеют разную учетную политику, в том числе и по налогам, то естественно нужны будут и все эти данные для каждой из организаций. В общем все как обычно, данные которые выводятся в печатной форме и которые нельзя жестко привязать нужно переносить на мобильное устройство. Но, например, если организация плательщик НДС и таковой будет еще долго, то незачем таскать на мобильное устройство все ставки НДС и засорять базу лишними данными.
Приложение Android.
Нужен был софт который сможет печатать тип документов сформированный через ЗаписьТекста() (html). Перебрав огромную кучу софта в Play Маркете было обнаружено две схожие по функционалу программы от одного разработчика: PrintHand (около 10$) и PrinterShare (около 15$). Бесплатные приложения либо не умели работать с беспроводными принтерами (подключатся напрямую к wi-fi принтеру), либо с html документами.
Решено было пойти логическим путем. Сначала подключено МУ к ТД принтера. При открытии документа (картинки) появилось окно с предварительным просмотром.
При самой печати с МУ все печатные формы сделаны так, чтоб не нужно было ничего больше настраивать, то есть пользователь нажал «Печать» в 1С, открылась PrintHand, нажал «Печать» в ней и страница распечатана.
Итоги.
В сети уже есть похожие статьи, например эта. Плюсы такого метода в том, что не нужно создавать отдельные макеты для мобильных устройств, а также обновлять их при доработках в центральной базе, что увеличивает объем работ при обновлении.
Главное отличие описанного мной подхода это то, что нет необходимости подключатся к центральной базе. То есть печать можно осуществлять имея только принтер и мобильное устройство. И не важно есть интернет или устройство вовсе не имеет доступа к всемирной паутине. Печать идет сразу на принтер. Такой подход более интересен когда мобильное устройство не находиться в одной сети с сервером. А также когда нужно исключить ЦБ из процесса печати. Ведь это как минимум дополнительная нагрузка на сервер, а как максимум – лишнее звено в процедуре печати, что в свою очередь менее просто и отказоустойчиво.