В обоих методах используется генерация этикетки на стороне центральной базы. Такой подход был принят с учетом условий:
- Этикетка на заказ должна печататься всегда одинаковая;
- Кладовщик не всегда следит за необходимостью обновить конфигурацию в мобильном приложении;
- Процесс приема заказов подразумевает наличие соединения мобильного приложения с центральной базой.
Отправка на печать через сессию на компьютере.
Исходные данные: Кладовщик перемещается по складу с мобильным устройством и портативным wi-fi принтером этикеток. Имеется постоянно запущенная сессия 1с на персональном компьютере.
В данном варианте мобильное приложение отправляет в центральную базу параметры этикетки, которую надо распечатать. На основании полученных через веб-сервис параметров центральная база формирует табличный документ этикетки заказа. После формирования табличного документа он помещается в регистр сведений с ресурс с типом ХранилищеЗначения. Табличный документ помещается в данные для печати с привязкой к пользователю, который инициировал операцию печати. Так как для вызова операции веб-сервиса центральной базы пользователь должен быть авторизован мы знаем кто инициировал печать данной этикетки.
Функция PrintOrderSticker(IDOrder)
ЗаказСсылка = Документы.ЗаказПокупателя.ПолучитьСсылку(Новый УникальныйИдентификатор(Idorder));
ТабДок = РаботаСЗаказами.СформироватьЭтикету(ЗаказСсылка);
МенеджерЗаписи = РегистрыСведений.ДанныеДляПечати.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ТабличныйДокумент = Новый ХранилищеЗначения(ТабДок);
МенеджерЗаписи.Код = Строка(Новый УникальныйИдентификатор);
МенеджерЗаписи.Создал = ПараметрыСеанса.ТекущийПользователь;
МенеджерЗаписи.Записать();
КонецФункции
На постоянно включенном персональном компьютере в операционной системе регистрируются wi-fi принтеры, с которыми работают кладовщики. На данной машине запускается обработка «Монитор печати», которая опрашивает регистр сведений на наличие данных для печати. Так как обработка запущена и у нас есть клиентская часть мы можем реализовать механизм сопоставления пользователя и принтера, который уже зарегистрирован в системе. В результате опроса регистра на предмет наличия данных печати этикетка печатается на сопоставленном с пользователем принтере.
Процедура ПроверитьДанныеНаПечать()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ДанныеДляПечати.Код,
| ДанныеДляПечати.ТабличныйДокумент,
| ДанныеДляПечати.Создал
|ИЗ
| РегистрСведений.ДанныеДляПечати КАК ДанныеДляПечати
|ГДЕ
| НЕ ДанныеДляПечати.ФайлРаспечатан";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ПринтерПечатиДокумента = "Принтер кладовщика"; //Выбираем принтер из таблицы сопоставления
ТабДок = Выборка.ТабличныйДокумент.Получить();
ТабДок.ИмяПринтера = ПринтерПечатиДокумента;
УниверсальныеМеханизмы.НапечататьДокумент(ТабДок, 1, Истина);
НаборЗаписей = РегистрыСведений.ДанныеДляПечати.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Код.Установить(Выборка.Код);
НаборЗаписей.Прочитать();
Запись = НаборЗаписей[0];
Запись.ФайлРаспечатан = Истина;
Запись.Распечатал = ПараметрыСеанса.ТекущийПользователь;
НаборЗаписей.Записать();
КонецЦикла;
КонецПроцедуры
Отправка на печать с мобильного приложения
Исходные данные: Кладовщик перемещается по складу с мобильным устройством и портативным bluetooth принтером этикеток.
На основании параметров веб-сервис возвращает pdf-файл этикетки, которая отправляется на печать с мобильного устройства.
Формирование и передача файла на стороне центральной базы:
Функция ReceiveGetOrderSticker(IDOrder)
ЗаказСсылка = Документы.ЗаказПокупателя.ПолучитьСсылку(Новый УникальныйИдентификатор(Idorder));
ТабДок = РаботаСЗаказами.СформироватьЭтикетку(ЗаказСсылка);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяВременногоФайла,ТипФайлаТабличногоДокумента.PDF);
ФайлДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
ДанныеФайла = Новый ХранилищеЗначения(ФайлДвоичныеДанные, Новый СжатиеДанных(9));
Возврат = Base64Строка(ДанныеФайла.Получить());
КонецФункции
Прием файла на стороне мобильного приложения:
&НаСервере
Функция ПечатьСтикераЗаказаНаПринтерСервер(УИДЗаказа,АдресФайлаСтикера)
Прокси = ОбменМобильныеПереопределяемый.ПолучитьПрокси();
СтрокаОтвет = Прокси.ReceiveGetOrderSticker(УИДЗаказа);
ЗначениеФайла = Base64Значение(СтрокаОтвет);
ЗначениеФайла.Записать(АдресФайлаСтикера);
КонецФункции
После выполнения вышеописанных операций у нас есть pdf-файл в мобильном приложении, который надо отправить на печать. Для этого на мобильном устройстве надо установить приложение PrinterShare. Данное приложение может отправлять файлы на выбранный принтер. Но пользователь не будет каждый раз искать полученный pdf-файл, поэтому мы в мобильном приложении запускаем просмотр данного файла используя ЗапускПриложенияМобильногоУстройства().
&НаКлиенте
Процедура ПечатьСтикераЗаказаНаПринтер(УИДЗаказа)
АдресФайлаСтикера = КаталогДокументов() + "sticker.pdf";
ПечатьСтикераЗаказаНаПринтерСервер(УИДЗаказа,АдресФайлаСтикера)
#Если МобильноеПриложениеКлиент Тогда
Запуск = Новый ЗапускПриложенияМобильногоУстройства();
Запуск.Действие = "android.intent.action.VIEW";
Запуск.Данные = "file:///"+ АдресФайлаСтикера;
Запуск.Тип = "application/pdf";
Запуск.Запустить(Истина);
#КонецЕсли
КонецПроцедуры