Как исправить ошибку «Переменная не определена (УведомленияКлиента)» при выгрузке мобильного приложения в 1С?

Программист 1С v8.5 IT и автоматизация бизнеса
← На главную

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

Выясним причину такого поведения платформы и подробно рассмотрим проверенные способы решения данной проблемы.

Почему возникает эта ошибка?

Механизм УведомленияКлиента (объект МенеджерУведомленийКлиента) разработан исключительно для традиционного взаимодействия «клиент — сервер» в среде настольного и веб-приложения (тонкий клиент, веб-клиент, толстый клиент и кластер серверов). В мобильной платформе 1С — в контекстах выполнения «Мобильное приложение (клиент)» и «Мобильное приложение (сервер)» — данный глобальный контекст и его свойства попросту не существуют.

Проанализируем ситуацию с синтаксическим контролем: в среде разработки опции проверки модулей (меню «Сервис – Параметры – Модули – Проверка») управляют исключительно интерактивной подсветкой кода в окне редактора. Отключить синтаксический контроль при выгрузке мобильного приложения штатными средствами невозможно, так как сборщик мобильной конфигурации производит обязательную сквозную компиляцию всех модулей под целевые мобильные контексты. Если в доступном мобильному приложению коде встречается неизвестный мобильной платформе идентификатор, компиляция аварийно завершается.

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

Решение 1. Исключение вызовов через директивы препроцессора

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

Посмотрим на пример оформления серверного вызова:


#Если Сервер И НЕ МобильноеПриложениеСервер Тогда
    УведомленияКлиента.ОтправитьУведомление(Получатель, ДанныеУведомления);
#КонецЕсли

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


#Если Клиент И НЕ МобильноеПриложениеКлиент Тогда
    УведомленияКлиента.ПодключитьОбработчик(ИмяСобытия, ОписаниеОповещения);
#КонецЕсли

При выгрузке мобильного приложения сборщик конфигурации оценивает условия директив препроцессора. Так как условие НЕ МобильноеПриложениеСервер вернет ложь, весь блок внутри условия будет полностью вырезан еще на этапе препроцессинга, и компилятор платформы не зафиксирует ошибку отсутствия переменной.

Решение 2. Настройка свойств доступности общего модуля

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

Разберем по шагам порядок настройки свойств модуля:

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

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

Решение 3. Разделение логики через адаптеры и переопределяемые модули

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

Посмотрим на архитектурную схему разделения:

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

Почему не стоит использовать оператор «Выполнить» для мобильных приложений

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

Компания Apple придерживается строгой политики безопасности в отношении приложений, публикуемых в App Store: среда исполнения не должна выполнять сторонний динамический код, не прошедший статическую компиляцию при сборке пакета. По этой причине платформа 1С на устройствах под управлением iOS блокирует работу конструкций Выполнить() и Вычислить() на уровне системного ядра. Использование подобного обхода приведет к фатальной ошибке во время работы мобильного приложения на смартфонах и планшетах пользователей.

Альтернативные варианты оповещения мобильного клиента

Поскольку УведомленияКлиента не функционируют в мобильных сценариях, рассмотрим штатные механизмы, позволяющие передавать информацию с сервера на мобильные клиенты:

  1. Доставляемые push-уведомления: использование объектов платформы МенеджерОтправкиДоставляемыхУведомлений и ДоставляемоеУведомление. Этот механизм глубоко интегрирован с сервисами Apple Push Notification service (APNs) и Firebase Cloud Messaging (FCM), обеспечивая стабильную доставку информации даже при закрытом мобильном приложении.
  2. HTTP-сервисы и регламентный опрос: периодический фоновый опрос серверной базы данных мобильным клиентом через вызовы специализированных REST/HTTP-сервисов с помощью объекта HTTPСоединение.

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

← На главную