gifts2017

Печать с мобильного приложения

Опубликовал Андрей Данилюк (DanilaDru) в раздел Программирование - Мобильные приложения

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

Отправка на печать через запущенную сессию 1с на компьютере.
Отправка на печать с мобильного приложения.

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

  • Этикетка на заказ должна печататься всегда одинаковая;
  • Кладовщик не всегда следит за необходимостью обновить конфигурацию в мобильном приложении;
  • Процесс приема заказов подразумевает наличие соединения мобильного приложения с центральной базой.

Отправка на печать через сессию на компьютере.

Исходные данные: Кладовщик перемещается по складу с мобильным устройством и портативным wi-fi принтером этикеток. Имеется постоянно запущенная сессия 1с на персональном компьютере.

В данном варианте мобильное приложение отправляет в центральную базу параметры этикетки, которую надо распечатать. На основании полученных через веб-сервис параметров центральная база формирует табличный документ этикетки заказа. После формирования табличного документа он помещается в регистр сведений с ресурс с типом ХранилищеЗначения. Табличный документ помещается в данные для печати с привязкой к пользователю, который инициировал операцию печати. Так как для вызова операции веб-сервиса центральной базы пользователь должен быть авторизован мы знаем кто инициировал печать данной этикетки.

Функция PrintOrderSticker(IDOrder)
    ЗаказСсылка = Документы.ЗаказПокупателя.ПолучитьСсылку(Новый УникальныйИдентификатор(Idorder));
    ТабДок = РаботаСЗаказами.СформироватьЭтикету(ЗаказСсылка);
    МенеджерЗаписи  = РегистрыСведений.ДанныеДляПечати.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.ТабличныйДокумент = Новый ХранилищеЗначения(ТабДок);
    МенеджерЗаписи.Код = Строка(Новый УникальныйИдентификатор);
    МенеджерЗаписи.Создал = ПараметрыСеанса.ТекущийПользователь;
    МенеджерЗаписи.Записать();
КонецФункции

На постоянно включенном персональном компьютере в операционной системе регистрируются wi-fi принтеры, с которыми работают кладовщики. На данной машине запускается обработка «Монитор печати», которая опрашивает регистр сведений на наличие данных для печати.  Так как обработка запущена и у нас есть клиентская часть мы можем реализовать механизм сопоставления пользователя и принтера, который уже зарегистрирован в системе. В результате опроса регистра на предмет наличия данных печати этикетка печатается на сопоставленном с пользователем принтере.

Процедура ПроверитьДанныеНаПечать() 
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ДанныеДляПечати.Код,
                   |    ДанныеДляПечати.ТабличныйДокумент,
                   |    ДанныеДляПечати.Создал
                   |ИЗ
                   |    РегистрСведений.ДанныеДляПечати КАК ДанныеДляПечати
                   |ГДЕ
                   |    НЕ ДанныеДляПечати.ФайлРаспечатан";
    Выборка = Запрос.Выполнить().Выбрать(); 
    
    Пока Выборка.Следующий() Цикл 
        ПринтерПечатиДокумента = "Принтер кладовщика"; //Выбираем принтер из таблицы сопоставления
        
        ТабДок = Выборка.ТабличныйДокумент.Получить();
        ТабДок.ИмяПринтера = ПринтерПечатиДокумента;
        УниверсальныеМеханизмы.НапечататьДокумент(ТабДок, 1, Истина);

        НаборЗаписей = РегистрыСведений.ДанныеДляПечати.СоздатьНаборЗаписей();            
        НаборЗаписей.Отбор.Код.Установить(Выборка.Код);
        НаборЗаписей.Прочитать();
        Запись = НаборЗаписей[0];
        Запись.ФайлРаспечатан = Истина; 
        Запись.Распечатал = ПараметрыСеанса.ТекущийПользователь;
        НаборЗаписей.Записать();
    КонецЦикла;
КонецПроцедуры
 

print_monitor

 

Отправка на печать с мобильного приложения

Исходные данные: Кладовщик перемещается по складу с мобильным устройством и портативным bluetooth принтером этикеток.

На основании параметров веб-сервис возвращает pdf-файл этикетки, которая отправляется на печать с мобильного устройства.
Формирование и передача файла на стороне центральной базы:

Функция ReceiveGetOrderSticker(IDOrder)
    ЗаказСсылка = Документы.ЗаказПокупателя.ПолучитьСсылку(Новый УникальныйИдентификатор(Idorder));
    ТабДок = РаботаСЗаказами.СформироватьЭтикетку(ЗаказСсылка);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
    ТабДок.Записать(ИмяВременногоФайла,ТипФайлаТабличногоДокумента.PDF);
    ФайлДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
    ДанныеФайла = Новый ХранилищеЗначения(ФайлДвоичныеДанные, Новый СжатиеДанных(9));
    Возврат = Base64Строка(ДанныеФайла.Получить());
КонецФункции

Прием файла на стороне мобильного приложения:

&НаСервере
Функция ПечатьСтикераЗаказаНаПринтерСервер(УИДЗаказа,АдресФайлаСтикера)
    Прокси = ОбменМобильныеПереопределяемый.ПолучитьПрокси();
    СтрокаОтвет = Прокси.ReceiveGetOrderSticker(УИДЗаказа);
    ЗначениеФайла = Base64Значение(СтрокаОтвет);
    ЗначениеФайла.Записать(АдресФайлаСтикера);
КонецФункции

После выполнения вышеописанных операций у нас есть pdf-файл в мобильном приложении, который надо отправить на печать. Для этого на мобильном устройстве надо установить приложение PrinterShare. Данное приложение может отправлять файлы на выбранный принтер. Но пользователь не будет каждый раз искать полученный pdf-файл, поэтому мы в мобильном приложении запускаем  просмотр данного файла используя ЗапускПриложенияМобильногоУстройства().

&НаКлиенте
Процедура ПечатьСтикераЗаказаНаПринтер(УИДЗаказа)
    АдресФайлаСтикера = КаталогДокументов() + "sticker.pdf";
    ПечатьСтикераЗаказаНаПринтерСервер(УИДЗаказа,АдресФайлаСтикера)
    #Если МобильноеПриложениеКлиент Тогда  
        Запуск = Новый ЗапускПриложенияМобильногоУстройства();
        Запуск.Действие = "android.intent.action.VIEW";
        Запуск.Данные = "file:///"+ АдресФайлаСтикера;
        Запуск.Тип = "application/pdf";
        Запуск.Запустить(Истина);      
    #КонецЕсли
КонецПроцедуры

http://danila.org.ua/pechat-s-mobilnogo-prilozheniya-1s/

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Ruslan (flyer) 07.10.14 18:54
плюс за статью! я в своих программах использовал механизм Google drive через него печатают. и тоже сторонние программы для андроида и айфона. тут на форуме уже обсуждали как непосредственно минуя сервер 1с отправлять на принтер чеков задание. даже получилось.
2. Андрей Данилюк (DanilaDru) 07.10.14 19:55
(1) flyer, спасибо. За опытами над чеком наблюдал. Может тоже придётся делать такое со временем.
3. Сергей (Che) Коцюра (CheBurator) 10.10.14 20:03
учтем.
спсб.
но если необходимость печатать этикетки КЛАДОВЩИКОМ ПРИ ПЕРЕМЕЩЕНИИ ПО СКЛАДУ - регулярная процедура (а не эпизодическая типа заменить поврежденную) - имхо надо что-то менять в организации и обработке товаропотоков.
4. Андрей Данилюк (DanilaDru) 10.10.14 20:26
(3) CheBurator, спасибо за комментарий.
Наверное я не совсем ясно выразился в статье. Речь идёт не о перемещении заказа по складу, а про приём его кладовщиком на склад. Маркируется заказ один раз, когда попадает в руки принимающему кладовщику из машины, которая его привезла.
5. Александр Маликов (malikov_pro) 12.10.14 14:11
Я в свое время решал подобную задачу с помощью программы BarTender от Seagul, из плюсов может обрабатывать произвольные файлы и печатает через набор команд принтера (в случае формирования макета 1С или PDF печатается картинкой), что позволяет с точностью до пикселя формировать этикетку (была задача сделать очень маленькую этикетку, с помощью макета из 1С это не получилось).
6. Андрей Данилюк (DanilaDru) 13.10.14 11:30
(5) malikov_pro, а как вы потом на стороне мобильного приложения 1с вызывали BarTender ?
7. John Smith (PiccaHut001) 17.10.14 18:57
очень остроумно, печать с мобилы на PC через регистр сведений
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа