Почему не работает расширение в мобильном клиенте 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка под мобильный клиент 1С имеет множество нюансов, особенно когда речь заходит о механизме расширений. Часто разработчики сталкиваются с ситуацией, когда код расширения прекрасно работает в тонком и толстом клиентах на ПК, но при запуске на мобильном устройстве система просто игнорирует внесенные изменения. В этой статье мы подробно разберем, почему возникают проблемы с выполнением процедур в модуле управляемого приложения и общих модулях в мобильном клиенте, а также рассмотрим по шагам способы их решения.

Причина 1. Ошибки синтаксиса аннотации &Вместо в расширениях

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

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


&Вместо
Процедура ПриНачалеРаботыСистемы()
    // Этот код вызовет ошибку: имя метода уже зарегистрировано
КонецПроцедуры

Или другой неверный вариант, когда имя процедуры меняют, но забывают передать имя оригинального метода в параметрах аннотации:


&Вместо
Процедура ффф_ПриНачалеРаботыСистемы()
    // Этот код не ругается при компиляции, но и работать не будет
КонецПроцедуры

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


&Вместо("ПриНачалеРаботыСистемы")
Процедура ххх_ПриНачалеРаботыСистемы()
    // Здесь пишем свой код
    Сообщить("Успешно переопределено!");
КонецПроцедуры

Причина 2. Версия платформы и баги ранних релизов мобильного клиента

Мобильный клиент активно развивался, начиная с версии платформы 8.3.12. В первых релизах технология работы расширений на мобильных устройствах была нестабильной. Платформа могла молча игнорировать запуск модулей управляемого приложения из расширений, не выдавая никаких ошибок в журнал регистрации.

Если вы используете старые версии платформы (например, 8.3.12.67 или аналогичные), настоятельно рекомендуется обновить платформу сервера и версию мобильного клиента на мобильном устройстве до актуальных (как минимум до версий 8.3.14 и выше, где мобильный клиент вышел из статуса беты, а оптимально — до стабильных версий 8.3.20+).

Причина 3. Свойства компиляции заимствованных общих модулей

Когда вы переносите общий модуль в расширение для перехвата процедур и функций, система должна знать, в каких средах этот код будет компилироваться. Если ваш код должен выполняться на мобильном устройстве, обязательно проверьте свойства заимствованного модуля в расширении.

Выполним следующую проверку по шагам:

  1. Найдите заимствованный общий модуль в дереве объектов вашего расширения.
  2. Нажмите на него правой кнопкой мыши и выберите пункт Свойства.
  3. В палитре свойств найдите флаги компиляции (Клиент, Сервер, Внешнее соединение и т.д.).
  4. Убедитесь, что установлен флаг Клиент (мобильный клиент). Если этот флаг снят, мобильный клиент просто физически не сможет скомпилировать и запустить данный модуль при старте сеанса.

Причина 4. Влияние безопасного режима расширения

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

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

  1. Откройте информационную базу в режиме "1С:Предприятие" под правами администратора.
  2. Перейдите в меню НСИ и администрирование -> Печатные формы, отчеты и обработки -> Расширения (или воспользуйтесь стандартным интерфейсом управления расширениями).
  3. Найдите ваше расширение в списке.
  4. Снимите галочку в колонке Безопасный режим (Safe Mode).
  5. Перезапустите мобильный клиент и проверьте работу кода.

Архитектурные обходные пути (Воркэраунды)

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

Вариант А. Вынос логики на форму начальной страницы (рабочий стол)

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

Рассмотрим по шагам, как это реализовать:

  1. Добавьте в расширение обработку (или форму), которая назначена основной на начальной странице (рабочем столе) для мобильного клиента.
  2. В модуле формы этой обработки переопределите событие ПриОткрытии (на клиенте) или ПриСозданииНаСервере (на сервере в зависимости от ваших задач).
  3. Поместите туда инициализационный код. Например:

&НаКлиенте
Процедура ххх_ПриОткрытииПосле(Отказ)
    // Данный код гарантированно выполнится при старте мобильного клиента
    Сообщить("Мобильный клиент успешно запущен. Приветствуем пользователя!");
КонецПроцедуры

Вариант Б. Использование механизмов БСП (Библиотеки стандартных подсистем)

Если ваша конфигурация построена на базе БСП, напрямую расширять модуль управляемого приложения считается плохим тоном. Вместо этого БСП предоставляет специальные переопределяемые модули. Работа с ними в мобильном клиенте через расширения происходит гораздо стабильнее.

Для интеграции вашего стартового кода:

  1. Заимствуйте в расширение общий модуль ОбщегоНазначенияКлиентПереопределяемый.
  2. Найдите в нем процедуру ПриНачалеРаботыСистемы или ПослеНачалаРаботыСистемы.
  3. Добавьте к ней аннотацию &После или &Перед.

Пример реализации через БСП:


&После("ПослеНачалаРаботыСистемы")
Процедура ххх_ПослеНачалаРаботыСистемы(ПараметрыВыхода)
    // Этот код отработает на клиенте сразу после инициализации всех подсистем БСП
    #Если МобильныйКлиент Тогда
        ПоказатьПредупреждение(, "Приветствуем в мобильном приложении!");
    #КонецЕсли
КонецПроцедуры

Вариант В. Использование Модуля сеанса (для серверной инициализации)

Если вам необходимо настроить параметры окружения, заполнить параметры сеанса или выполнить подготовительные действия на сервере при входе пользователя, используйте Модуль сеанса расширения. Метод УстановкаПараметровСеанса гарантированно срабатывает на сервере при старте абсолютно любого клиента, включая мобильный.


&После("УстановкаПараметровСеанса")
Процедура ххх_УстановкаПараметровСеанса(ТребуемыеПараметры)
    // Этот серверный код отработает при запуске мобильного клиента
    // Здесь можно определить тип клиента и заполнить нужные параметры сеанса
КонецПроцедуры

Используя предложенные инструкции по исправлению синтаксиса аннотаций, проверке компиляции общих модулей и применению альтернативных вариантов запуска кода, вы сможете добиться стабильного поведения вашего расширения в среде мобильного клиента 1С.

← На главную