Разработка под мобильный клиент 1С имеет множество нюансов, особенно когда речь заходит о механизме расширений. Часто разработчики сталкиваются с ситуацией, когда код расширения прекрасно работает в тонком и толстом клиентах на ПК, но при запуске на мобильном устройстве система просто игнорирует внесенные изменения. В этой статье мы подробно разберем, почему возникают проблемы с выполнением процедур в модуле управляемого приложения и общих модулях в мобильном клиенте, а также рассмотрим по шагам способы их решения.
Первая и самая распространенная ошибка при попытке переопределить стандартный метод (например, ПриНачалеРаботыСистемы) связана с неправильным использованием директив компиляции расширений. Давайте проанализируем, как ведет себя платформа в различных ситуациях.
Если вы хотите полностью заменить метод основной конфигурации своим собственным методом в расширении, вам необходимо использовать аннотацию &Вместо. При этом крайне важно соблюдать правильный синтаксис. Рассмотрим пример ошибочного написания кода:
&Вместо
Процедура ПриНачалеРаботыСистемы()
// Этот код вызовет ошибку: имя метода уже зарегистрировано
КонецПроцедуры
Или другой неверный вариант, когда имя процедуры меняют, но забывают передать имя оригинального метода в параметрах аннотации:
&Вместо
Процедура ффф_ПриНачалеРаботыСистемы()
// Этот код не ругается при компиляции, но и работать не будет
КонецПроцедуры
Правильное решение: аннотация &Вместо требует обязательного указания имени переопределяемого метода в круглых скобках и кавычках. При этом имя вашей процедуры в расширении должно отличаться от оригинального (желательно использовать уникальный префикс вашего расширения), чтобы избежать конфликта имен. Правильный шаблон выглядит следующим образом:
&Вместо("ПриНачалеРаботыСистемы")
Процедура ххх_ПриНачалеРаботыСистемы()
// Здесь пишем свой код
Сообщить("Успешно переопределено!");
КонецПроцедуры
Мобильный клиент активно развивался, начиная с версии платформы 8.3.12. В первых релизах технология работы расширений на мобильных устройствах была нестабильной. Платформа могла молча игнорировать запуск модулей управляемого приложения из расширений, не выдавая никаких ошибок в журнал регистрации.
Если вы используете старые версии платформы (например, 8.3.12.67 или аналогичные), настоятельно рекомендуется обновить платформу сервера и версию мобильного клиента на мобильном устройстве до актуальных (как минимум до версий 8.3.14 и выше, где мобильный клиент вышел из статуса беты, а оптимально — до стабильных версий 8.3.20+).
Когда вы переносите общий модуль в расширение для перехвата процедур и функций, система должна знать, в каких средах этот код будет компилироваться. Если ваш код должен выполняться на мобильном устройстве, обязательно проверьте свойства заимствованного модуля в расширении.
Выполним следующую проверку по шагам:
По умолчанию при подключении любого расширения в базе данных для него устанавливается признак Безопасный режим. В этом режиме накладываются серьезные ограничения на исполнение кода (включая запрет на выполнение некоторых низкоуровневых операций, внешних вызовов и работу с файловой системой на мобильном клиенте).
Чтобы исключить влияние безопасного режима, выполните следующие действия:
Если по какой-то причине переопределить модуль управляемого приложения напрямую в расширении под мобильным клиентом не удается, мы можем прибегнуть к проверенным архитектурным решениям, которые гарантируют стабильную работу логики инициализации.
Это самый надежный и простой способ, к которому часто приходят опытные разработчики мобильных приложений. Экран мобильного устройства имеет ограниченный размер, и при запуске мобильного клиента всегда открывается определенная начальная форма. Мы можем использовать обработчик этой формы для выполнения инициализирующего кода.
Рассмотрим по шагам, как это реализовать:
ПриОткрытии (на клиенте) или ПриСозданииНаСервере (на сервере в зависимости от ваших задач).
&НаКлиенте
Процедура ххх_ПриОткрытииПосле(Отказ)
// Данный код гарантированно выполнится при старте мобильного клиента
Сообщить("Мобильный клиент успешно запущен. Приветствуем пользователя!");
КонецПроцедуры
Если ваша конфигурация построена на базе БСП, напрямую расширять модуль управляемого приложения считается плохим тоном. Вместо этого БСП предоставляет специальные переопределяемые модули. Работа с ними в мобильном клиенте через расширения происходит гораздо стабильнее.
Для интеграции вашего стартового кода:
ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы или ПослеНачалаРаботыСистемы.&После или &Перед.Пример реализации через БСП:
&После("ПослеНачалаРаботыСистемы")
Процедура ххх_ПослеНачалаРаботыСистемы(ПараметрыВыхода)
// Этот код отработает на клиенте сразу после инициализации всех подсистем БСП
#Если МобильныйКлиент Тогда
ПоказатьПредупреждение(, "Приветствуем в мобильном приложении!");
#КонецЕсли
КонецПроцедуры
Если вам необходимо настроить параметры окружения, заполнить параметры сеанса или выполнить подготовительные действия на сервере при входе пользователя, используйте Модуль сеанса расширения. Метод УстановкаПараметровСеанса гарантированно срабатывает на сервере при старте абсолютно любого клиента, включая мобильный.
&После("УстановкаПараметровСеанса")
Процедура ххх_УстановкаПараметровСеанса(ТребуемыеПараметры)
// Этот серверный код отработает при запуске мобильного клиента
// Здесь можно определить тип клиента и заполнить нужные параметры сеанса
КонецПроцедуры
Используя предложенные инструкции по исправлению синтаксиса аннотаций, проверке компиляции общих модулей и применению альтернативных вариантов запуска кода, вы сможете добиться стабильного поведения вашего расширения в среде мобильного клиента 1С.