Как отладить мобильный клиент 1С и почему код встроенной обработки может не срабатывать?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Сфера услуг, туризм и социальный сектор
← На главную

При разработке решений для мобильных рабочих мест (например, интерфейса официанта или кладовщика) разработчики нередко сталкиваются с ситуацией, когда код корректно выполняется в обычной внешней обработке на настольном компьютере, но на мобильном клиенте отказывается работать или возвращает непредвиденные результаты. При этом попытки установить точку останова не приводят к успеху — отладчик просто не останавливается в нужных процедурах.

Разберем подробно, как правильно настроить отладку мобильного клиента, почему точка останова может игнорироваться платформой и каким образом локальные расширения в узлах распределенной информационной базы (РИБ) могут нарушать работу мобильного приложения.

Особенности настройки отладки мобильного клиента

Для того чтобы конфигуратор перехватывал выполнение кода на мобильном устройстве (смартфоне или планшете), стандартной схемы запуска отладки для настольного клиента недостаточно. Рассмотрим ключевые технические требования:

  1. Использование протокола HTTP: Мобильная платформа 1С не поддерживает отладку по протоколу TCP. Служба сервера «1С:Предприятия» должна быть запущена с параметрами отладки по протоколу HTTP (ключи -debug -http).
  2. Сетевой адрес сервера отладки: В конфигураторе в меню «Сервис» → «Параметры» → «Отладка» категорически нельзя указывать 127.0.0.1 или localhost. Необходимо прописать реальный статический IP-адрес сетевого адаптера компьютера в локальной сети (или VPN-адрес), к которому устройство имеет прямой доступ.
  3. Параметры подключения в мобильном приложении: На самом мобильном устройстве в настройках подключения к информационной базе необходимо включить режим отладки и указать адрес отладчика вида http://<IP-компьютера>:1560.
  4. Настройка автоматического подключения предметов отладки: В конфигураторе откроем меню «Отладка» → «Подключение» → «Настройка автоматического подключения» и обязательно установим флажки напротив пунктов «Клиентские приложения на мобильных устройствах» и «Сервер».
  5. Межсетевой экран: Убедимся, что порты отладчика (по умолчанию диапазон 1550–1570) не блокируются брандмауэром операционной системы для входящих пакетов из подсети Wi-Fi.

Анализ клиентского кода сканирования и отправки данных

Посмотрим на пример реализации сканирования QR-кода на мобильном клиенте с последующей передачей данных на сервер:


&НаКлиенте
Процедура ЗаполнитьИзQR(Команда)
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);
    Режим = РежимДиалогаВопрос.ДаНет;
    ПоказатьВопрос(ОписаниеОповещения, "Отсканировать QR для онлайн меню?", Режим);
КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопрос(Результат, Параметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        #Если МобильныйКлиент Тогда
            Если СредстваМультимедиа.ПоддерживаетсяСканированиеШтрихКодов() Тогда        
                ОповещенияСканирования = Новый ОписаниеОповещения("ОбработкаОтсканированногоШтрихКода", ЭтаФорма);
                ОповещениеЗакрытия = Новый ОписаниеОповещения("ОбработкаЗавершенияСканера", ЭтаФорма);
                СредстваМультимедиа.ПоказатьСканированиеШтрихКодов("Scan Code", ОповещенияСканирования, ОповещениеЗакрытия, ТипШтрихКода.Все);
            Иначе
                Сообщить("Не поддерживается сканер штрихкодов");
            КонецЕсли;    
        #КонецЕсли    
    КонецЕсли;
КонецПроцедуры

Обратим внимание на следующие нюансы мобильного клиента:

  1. Метод СредстваМультимедиа.ПоказатьСканированиеШтрихКодов требует предоставления прав доступа к камере на самом мобильном устройстве. Если пользователь отклонил системный запрос операционной системы, сканер не откроется.
  2. Инструкция препроцессора #Если МобильныйКлиент Тогда гарантирует, что методы мультимедиа не вызовут синтаксических ошибок при запуске формы в обычном тонком клиенте на ПК.

После считывания кода управление передается в процедуру обработки:


&НаКлиенте
Процедура ОбработкаОтсканированногоШтрихКода(Штрихкод, Результат, Сообщение, ДополнительныеПараметры) Экспорт     
    ОчиститьСообщения();
    Если Результат И ЗначениеЗаполнено(Штрихкод) Тогда
        ДобавитьТоварыИзОнлайнМеню(Штрихкод);    
    Иначе
        ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
            НСтр("ru = 'Мобильный сканер'"), "Ошибка", 
            "Не удалось отсканировать QR: " + Сообщение,, Истина);
    КонецЕсли;    
    
    #Если МобильныйКлиент Тогда
        СредстваМультимедиа.ЗакрытьСканированиеШтрихКодов();
    #КонецЕсли
КонецПроцедуры

Выполнение серверного HTTP-запроса

Серверная процедура отправляет запрос к внешнему API для получения структуры блюд или товаров по номеру отсканированного заказа:


&НаСервере
Процедура ДобавитьТоварыИзОнлайнМеню(Штрихкод)
    СтруктураСервера = Новый Структура;
    СтруктураСервера.Вставить("Сервер", "menu.domain.ru"); 
    СтруктураСервера.Вставить("Порт", 443);
    СтруктураСервера.Вставить("Ресурс", "/api/offline-order-scan?number=" + Штрихкод);
    СтруктураСервера.Вставить("SSL", Истина);
    СтруктураСервера.Вставить("Метод", "GET");
    СтруктураСервера.Вставить("Токен", "ВАШ_ТОКЕН_АВТОРИЗАЦИИ");
    
    СтрОтвета = ОтправитьЗапросНаСервер_ВызватьМетод(СтруктураСервера);
    Если Не СтрОтвета.Успех Тогда
        Возврат;
    КонецЕсли;    
КонецПроцедуры

Важно помнить: код под директивой &НаСервере исполняется не на мобильном телефоне, а на сервере «1С:Предприятия» (или веб-сервере публикации). Соответственно, сетевая доступность внешнего адреса (DNS, порты, проверка сертификатов) должна проверяться непосредственно с серверной машины.

Почему точка останова не срабатывает: скрытое влияние расширений

Проанализируем распространенную ситуацию: разработчик настраивает конфигуратор, запускает отладку, но выполнение не заходит в процедуры основной конфигурации, а веб-сервер сообщает об ошибках или запросы уходят на устаревшие адреса.

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

Если в расширении метод переопределен без вызова оператора ПродолжитьВызов(), код основной конфигурации никогда не получит управление. Точки останова, установленные в основной конфигурации, будут игнорироваться, так как исполняется исключительно код расширения.

Особенности локальных расширений в узлах РИБ

Выясним, как такая ситуация возникает в распределенных базах (например, в розничных магазинах или кофейнях):

  1. При создании расширения в свойствах можно отключить его синхронизацию по планам обмена РИБ. В таком случае расширение становится локальным для конкретного периферийного узла.
  2. Если разработчик вносит правки в центральной базе (ЦБ), глобальный поиск по конфигурации центрального узла не покажет код, находящийся в локальном расширении удаленной базы.
  3. При смене сетевых настроек (например, переезде внешнего сервиса с домена .com на домен .ru) в центральной базе адрес может быть обновлен, но в локальном расширении на удаленной точке останется зашит старый адрес. В результате мобильные клиенты, подключенные к периферийному узлу, продолжат обращаться к устаревшему серверу.

Порядок диагностики проблемы

Разберем по шагам, как выявить и устранить подобные расхождения:

  1. Проверить состав расширений в проблемном узле: Откроем базу узла под администратором через меню «Функции для технического специалиста» → «Управление расширениями конфигурации» и проверим наличие локальных расширений, отсутствующих в центральной базе.
  2. Выполнить поиск заимствованных методов: Если в расширении заимствована нужная обработка или общий модуль, откроем модуль расширения и найдем аннотации &Вместо, &Перед или &После.
  3. Установить точки останова в модуле расширения: При подключении отладчика к сеансу мобильного клиента точки останова следует ставить именно в коде расширения.
  4. Очистить кэш мобильного клиента: Мобильный клиент интенсивно кэширует формы и модули. После изменения расширений на сервере рекомендуется полностью перезапустить сеанс мобильного приложения или сбросить его кэш.
← На главную