При разработке решений для мобильных рабочих мест (например, интерфейса официанта или кладовщика) разработчики нередко сталкиваются с ситуацией, когда код корректно выполняется в обычной внешней обработке на настольном компьютере, но на мобильном клиенте отказывается работать или возвращает непредвиденные результаты. При этом попытки установить точку останова не приводят к успеху — отладчик просто не останавливается в нужных процедурах.
Разберем подробно, как правильно настроить отладку мобильного клиента, почему точка останова может игнорироваться платформой и каким образом локальные расширения в узлах распределенной информационной базы (РИБ) могут нарушать работу мобильного приложения.
Для того чтобы конфигуратор перехватывал выполнение кода на мобильном устройстве (смартфоне или планшете), стандартной схемы запуска отладки для настольного клиента недостаточно. Рассмотрим ключевые технические требования:
-debug -http).127.0.0.1 или localhost. Необходимо прописать реальный статический IP-адрес сетевого адаптера компьютера в локальной сети (или VPN-адрес), к которому устройство имеет прямой доступ.http://<IP-компьютера>:1560.Посмотрим на пример реализации сканирования QR-кода на мобильном клиенте с последующей передачей данных на сервер:
&НаКлиенте
Процедура ЗаполнитьИзQR(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);
Режим = РежимДиалогаВопрос.ДаНет;
ПоказатьВопрос(ОписаниеОповещения, "Отсканировать QR для онлайн меню?", Режим);
КонецПроцедуры
&НаКлиенте
Процедура ПослеОтветаНаВопрос(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
#Если МобильныйКлиент Тогда
Если СредстваМультимедиа.ПоддерживаетсяСканированиеШтрихКодов() Тогда
ОповещенияСканирования = Новый ОписаниеОповещения("ОбработкаОтсканированногоШтрихКода", ЭтаФорма);
ОповещениеЗакрытия = Новый ОписаниеОповещения("ОбработкаЗавершенияСканера", ЭтаФорма);
СредстваМультимедиа.ПоказатьСканированиеШтрихКодов("Scan Code", ОповещенияСканирования, ОповещениеЗакрытия, ТипШтрихКода.Все);
Иначе
Сообщить("Не поддерживается сканер штрихкодов");
КонецЕсли;
#КонецЕсли
КонецЕсли;
КонецПроцедуры
Обратим внимание на следующие нюансы мобильного клиента:
СредстваМультимедиа.ПоказатьСканированиеШтрихКодов требует предоставления прав доступа к камере на самом мобильном устройстве. Если пользователь отклонил системный запрос операционной системы, сканер не откроется.#Если МобильныйКлиент Тогда гарантирует, что методы мультимедиа не вызовут синтаксических ошибок при запуске формы в обычном тонком клиенте на ПК.После считывания кода управление передается в процедуру обработки:
&НаКлиенте
Процедура ОбработкаОтсканированногоШтрихКода(Штрихкод, Результат, Сообщение, ДополнительныеПараметры) Экспорт
ОчиститьСообщения();
Если Результат И ЗначениеЗаполнено(Штрихкод) Тогда
ДобавитьТоварыИзОнлайнМеню(Штрихкод);
Иначе
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
НСтр("ru = 'Мобильный сканер'"), "Ошибка",
"Не удалось отсканировать QR: " + Сообщение,, Истина);
КонецЕсли;
#Если МобильныйКлиент Тогда
СредстваМультимедиа.ЗакрытьСканированиеШтрихКодов();
#КонецЕсли
КонецПроцедуры
Серверная процедура отправляет запрос к внешнему API для получения структуры блюд или товаров по номеру отсканированного заказа:
&НаСервере
Процедура ДобавитьТоварыИзОнлайнМеню(Штрихкод)
СтруктураСервера = Новый Структура;
СтруктураСервера.Вставить("Сервер", "menu.domain.ru");
СтруктураСервера.Вставить("Порт", 443);
СтруктураСервера.Вставить("Ресурс", "/api/offline-order-scan?number=" + Штрихкод);
СтруктураСервера.Вставить("SSL", Истина);
СтруктураСервера.Вставить("Метод", "GET");
СтруктураСервера.Вставить("Токен", "ВАШ_ТОКЕН_АВТОРИЗАЦИИ");
СтрОтвета = ОтправитьЗапросНаСервер_ВызватьМетод(СтруктураСервера);
Если Не СтрОтвета.Успех Тогда
Возврат;
КонецЕсли;
КонецПроцедуры
Важно помнить: код под директивой &НаСервере исполняется не на мобильном телефоне, а на сервере «1С:Предприятия» (или веб-сервере публикации). Соответственно, сетевая доступность внешнего адреса (DNS, порты, проверка сертификатов) должна проверяться непосредственно с серверной машины.
Проанализируем распространенную ситуацию: разработчик настраивает конфигуратор, запускает отладку, но выполнение не заходит в процедуры основной конфигурации, а веб-сервер сообщает об ошибках или запросы уходят на устаревшие адреса.
Главная причина: в информационной базе подключено расширение конфигурации, перехватывающее выполнение метода с помощью аннотации &Вместо.
Если в расширении метод переопределен без вызова оператора ПродолжитьВызов(), код основной конфигурации никогда не получит управление. Точки останова, установленные в основной конфигурации, будут игнорироваться, так как исполняется исключительно код расширения.
Выясним, как такая ситуация возникает в распределенных базах (например, в розничных магазинах или кофейнях):
.com на домен .ru) в центральной базе адрес может быть обновлен, но в локальном расширении на удаленной точке останется зашит старый адрес. В результате мобильные клиенты, подключенные к периферийному узлу, продолжат обращаться к устаревшему серверу.Разберем по шагам, как выявить и устранить подобные расхождения:
&Вместо, &Перед или &После.