В мобильном приложении всего один документ Заказ, зато реализованы следующие механизмы:
- обмен с центральной базой (подробно описано здесь http://its.1c.ru/db/pubintromobile);
- отправка PUSH-уведомлений (подробно описано здесь http://its.1c.ru/db/pubintromobile);
- сканирование штрихкодов встроенной камерой;
- загрузка наименования товара по штрихкоду из интернета при создании товара (описание сервиса здесь https://barcodes.olegon.ru/);
- получение чека из ФНС по QR-коду (API здесь https://habr.com/ru/post/358966/);
- вывод QR-кода уже загруженных чеков для возможности получить чек на другом устройстве.
Кому интересно, выкладываю куски кода некоторых механизмов.
Сканирование штрихкодов встроенной камерой смартфона (объект СредстваМультимедиа)
Модуль формы документа или справочника, где нужно сканировать штрихкод:
// Кнопка Сканировать на форме
&НаКлиенте
Процедура Сканировать(Команда)
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Форма", ЭтотОбъект);
ДополнительныеПараметры.Вставить("ИмяОбработчикаЗакрытияСканирования", "ОбработкаЗакрытияСканирования");
ПодключаемоеОборудованиеКлиент.ПолучитьШтрихкод(ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаЗакрытияСканирования(ДополнительныеПараметры) Экспорт
Возврат;
КонецПроцедуры
// Здесь обрабатываем полученный штрихкод, QR-код и т.п.
&НаКлиенте
Процедура ОбработатьПолученныйШтрихкод(ПолученныйШтрихкод, Параметры) Экспорт
Сообщить(ПолученныйШтрихкод);
КонецПроцедуры
Общий модуль ПодключаемоеОборудованиеКлиент:
Процедура ПолучитьШтрихкод(ДополнительныеПараметры) Экспорт
ЗаголовокСканирования = НСтр("ru = 'Считайте штрихкод'");
Если ДополнительныеПараметры.Свойство("ЗаголовокСканирования") Тогда
ЗаголовокСканирования = ДополнительныеПараметры.ЗаголовокСканирования;
КонецЕсли;
#Если МобильноеПриложениеКлиент Тогда
ОбработчикСканирования = Новый ОписаниеОповещения("ОбработкаСканирования", ПодключаемоеОборудованиеКлиент, ДополнительныеПараметры);
ОбработчикЗакрытияСканирования = Новый ОписаниеОповещения(ДополнительныеПараметры.ИмяОбработчикаЗакрытияСканирования,
ДополнительныеПараметры.Форма, ДополнительныеПараметры);
СредстваМультимедиа.ПоказатьСканированиеШтрихКодов(ЗаголовокСканирования, ОбработчикСканирования, ОбработчикЗакрытияСканирования);
#КонецЕсли
КонецПроцедуры
Процедура ОбработкаСканирования(Штрихкод, Результат, Сообщение, ДополнительныеПараметры) Экспорт
Если НЕ ДополнительныеПараметры.Свойство("ПотоковоеСканирование") Тогда
#Если МобильноеПриложениеКлиент Тогда
СредстваМультимедиа.ЗакрытьСканированиеШтрихКодов();
#КонецЕсли
КонецЕсли;
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
ДополнительныеПараметры.Форма.ОбработатьПолученныйШтрихкод(Штрихкод, ДополнительныеПараметры);
КонецПроцедуры
Загрузка наименования товара по штрихкоду из интернета
Поиск наименований товара по штрихкоду реализован через сервис https://barcodes.olegon.ru/. Сервис возвращает массив имен, я беру первое имя ТекМассив.names[0]. Модуль формы элемента справочника товаров:
&НаКлиенте
Процедура ОбработатьПолученныйШтрихкод(ПолученныйШтрихкод, Параметры) Экспорт
Объект.Штрихкод = СокрЛП(ПолученныйШтрихкод);
ssl4 = Новый ЗащищенноеСоединениеOpenSSL( неопределено, неопределено );
HTTPСоединение = Новый HTTPСоединение("barcodes.olegon.ru", 443,,,,,ssl4,);
HTTPЗапрос = Новый HTTPЗапрос("/api/card/name/" + Объект.Штрихкод + "/B644542640852064273024635143606");
Результат = HTTPСоединение.Получить(HTTPЗапрос);
Если Результат.КодСостояния = 200 Тогда
СтрокаРезультат = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаРезультат);
ТекМассив = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Если СтрДлина(Объект.Наименование) = 0 Тогда
Объект.Наименование = ТекМассив.names[0];
КонецЕсли;
Иначе
Сообщить("Статус ответа:" + Результат.КодСостояния);
КонецЕсли;
КонецПроцедуры
Получение чека из ФНС по QR-коду
QR-код чека является строкой вида t=20190602T2026&s=1854.00&fn=9282000100073930&i=74555&fp=3968601409&n=1, содержащей дату, сумму, номер фискального накопителя, номер чека, фискальный признак и вид операции. Используя эти данные можно получить сам чек из ФНС. Для получения чека в заголовке HTTP-запроса необходимо указать номер телефона и пароль, которые можно получить при регистрации в мобильном приложении Проверка кассового чека https://play.google.com/store/apps/details?id=ru.fns.billchecker&hl=ru.
&НаКлиенте
Процедура ЗагрузитьЧек(Команда)
ВидЧека = "1";
ДатаВремя = "20190602T1150";
Сумма = "299.00";
ФН = "8710000101180608";
ФД = "98325";
ФП = "309098793";
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Basic " + ЗашифроватьBase64("+79637413216:702187", "US-ASCII"));
Заголовки.Вставить("Device-Id", "Android");
Заголовки.Вставить("Device-OS", "Android");
HTTPСоединение = Новый HTTPСоединение("proverkacheka.nalog.ru", 8888);
HTTPЗапрос = Новый HTTPЗапрос("/v1/ofds/*/inns/*/fss/" + СокрЛП(ФН) + "/operations/" + СокрЛП(ВидЧека) + "/tickets/" + СокрЛП(ФД) + "?fiscalSign=" + СокрЛП(ФП) + "&date=" + СокрЛП(ДатаВремя) + "&sum=" + СокрЛП(СтрЗаменить(Сумма,".","")), Заголовки);
Ответ = HTTPСоединение.Получить(HTTPЗапрос);
Если Ответ.КодСостояния = 204 Тогда
//Сообщить("Чек корректен");
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
HTTPЗапрос = Новый HTTPЗапрос("/v1/inns/*/kkts/*/fss/" + СокрЛП(ФН) + "/tickets/" + СокрЛП(ФД) + "?fiscalSign=" + СокрЛП(ФП) + "&sendToEmail=no", Заголовки);
Ответ = HTTPСоединение.Получить(HTTPЗапрос, ИмяВременногоФайла);
Если Ответ.КодСостояния = 200 Тогда
//Сообщить("Чек получен");
Форма = ПолучитьФорму("Документ.Заказ.Форма.ФормаДокумента");
ДанныеФормы = Форма.Объект;
ОбработатьФайлОтвета(ИмяВременногоФайла, ДанныеФормы);
КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
Форма.Открыть();
Иначе
Сообщить("Получение чека: " + Ответ.КодСостояния);
КонецЕсли;
Иначе
Сообщить("Проверка корректности: " + Ответ.КодСостояния);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗашифроватьBase64(Строка, Кодировка) Экспорт
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, Кодировка);
ЗаписьТекста.Записать(Строка);
ЗаписьТекста.Закрыть();
Двоичные = Новый ДвоичныеДанные(ИмяВременногоФайла);
Результат = Base64Строка(Двоичные);
Если Лев(Результат, 4) = "77u/" Тогда
Результат = Сред(Результат, 5);
КонецЕсли;
Результат = СтрЗаменить(Результат, Символы.ПС, "");
УдалитьФайлы(ИмяВременногоФайла);
Возврат Результат;
КонецФункции
&НаСервере
Процедура ОбработатьФайлОтвета(ИмяФайла, ДанныеФормы)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ИмяФайла, "UTF-8");
Результат = ПрочитатьJSON(ЧтениеJSON,,"dateTime");
Организация = Результат.document.receipt.user;
ИНН = Результат.document.receipt.userInn;
СтрокиТовары = Результат.document.receipt.items;
Для каждого СтрокаТовар Из СтрокиТовары Цикл
Сообщить(СтрокаТовар.name);
Сообщить(СтрокаТовар.price / 100);
Сообщить(СтрокаТовар.quantity);
Сообщить(СтрокаТовар.sum / 100);
КонецЦикла;
КонецПроцедуры
Вывод QR-кода
Для возможности вывода QR-кода чека строка QR-кода сохраняется в реквизите документа Заказ. Для вывода QR-кода в табличный документ используется типовая компонента 1С КомпонентаПечатиQRКода, которая есть в общих макетах типовых конфигураций 1С. Правда в мобильном приложении компонента не работает, поэтому приходится запрашивать QR-код из центральной базы.
&НаСервере
Функция ПолучитьКартинкуQR(QRКод)
Макет = ПолучитьОбщийМакет("КомпонентаПечатиQRКода");
Адрес = ПоместитьВоВременноеХранилище(Макет);
КодВозврата = ПодключитьВнешнююКомпоненту(Адрес, "QRCodeExtensionSymbolicName");
Если Не КодВозврата Тогда
Сообщить("Проблема подключения внешней компоненты!");
КонецЕсли;
ГенераторQRКода = Новый("AddIn.QRCodeExtensionSymbolicName.QRCodeExtension");
ДанныеQRКода = ГенераторQRКода.GenerateQRCode(QRКод, 1, 190);
Если ДанныеQRКода = Неопределено Тогда
КартинкаQRКода = Новый Картинка();
Иначе
КартинкаQRКода = Новый Картинка(ДанныеQRКода);
КонецЕсли;
Макет = ПолучитьОбщийМакет("Макет");
Макет.Рисунки.ШК.Картинка = КартинкаQRКода;
ТабДок = Новый ТабличныйДокумент;
ТабДок.Вывести(Макет);
Возврат ТабДок;
КонецФункции
О мобильном приложении
Центральную базу необходимо опубликовать на web-сервере, например http://192.168.103.28/BuyCentr. В центральной базе заполнить узлы плана обмена Мобильные устройства (предопределенный Ц - Центральный, второй К - Константин, третий Н - Николай и т.п.) и константу Ключ доступа отправителя PUSH, например PUSH_SRV_API_KEY_F55C7685_602D_4F06_BD4B_727CFBFAA85F (можно получить здесь https://pushnotifications.1c.com/). Также через консоль заданий можно настроить расписание регламентного задания, которое оповещает сколько денег потрачено сегодня.
Мобильное приложение необходимо собрать в Сборщике приложений, запустить на телефоне, заполнить узлы плана обмена (предопределенный К - Константин, второй Ц - Центр), константу Адрес центральной базы, например http://192.168.103.28/BuyCentr, константу Код центральной базы - Ц, Номер проекта мобильного приложения, например 797785657074 (можно получить здесь https://pushnotifications.1c.com/), Номер и пароль для проверки чеков, например +79637413216 и 702187 (можно получить зарегистрировавшись в мобильном приложении ФНС https://play.google.com/store/apps/details?id=ru.fns.billchecker&hl=ru).
Проверялось на платформе 1С версии 8.3.14.1630 и мобильной платформе 1С версии 8.3.14.53.