Почему не работает процедура ПоказатьОповещениеПользователя в мобильном приложении 1С и как это исправить?

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

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

Разбираемся в терминах: Мобильный клиент vs Мобильное приложение

Первым делом проанализируем корень проблемы. Ошибка часто возникает из-за путаницы в двух похожих, но технологически разных продуктах фирмы 1С. Давайте выясним, в чем их принципиальное различие, так как именно в этом кроется ответ на вопрос о доступности процедур.

  1. Мобильный клиент: Это тонкий клиент, специально адаптированный под мобильные операционные системы (Android, iOS). Он не содержит в себе базу данных, а подключается напрямую к серверу 1С. В этом режиме доступны почти все возможности обычного управляемого приложения, включая метод ПоказатьОповещениеПользователя.
  2. Мобильное приложение: Это полностью автономная конфигурация. Она имеет свою собственную локальную базу данных (SQLite) и работает без постоянного соединения с основным сервером. В этой среде состав доступных функций глобального контекста сильно ограничен.

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

Анализируем проблемный код

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


&НаКлиенте
Процедура ОбработкаВыбораКаталога(Каталог, ДополнительныеПараметры) Экспорт
    Если НЕ Каталог = Неопределено Тогда
        Если ДополнительныеПараметры = "ВыгрузкаДанных" Тогда
            Если ВыгрузкаДанныхНаСервере(Каталог) Тогда
                // Ошибка возникнет здесь, если это Мобильное приложение
                ПоказатьОповещениеПользователя("Данные успешно выгружены!", , , , );
            Иначе
                Сообщить("Возникла ошибка во время выгрузки данных!");
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

Варианты решения и альтернативные уведомления

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

Метод 1: Использование процедуры Сообщить

Самый простой и надежный способ — использование стандартного метода Сообщить. Он доступен абсолютно везде: на сервере, на клиенте, в мобильном приложении и в мобильном клиенте.

Плюсы: Универсальность, отсутствие ошибок компиляции.
Минусы: Текст попадает в общую панель сообщений, которую пользователь может не заметить сразу, если она скрыта.

Метод 2: ПоказатьПредупреждение

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


ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияПредупреждения", ЭтотОбъект);
ПоказатьПредупреждение(ОписаниеОповещения, "Данные успешно сохранены!");

Этот метод блокирует интерфейс приложения до тех пор, пока пользователь не нажмет кнопку «ОК», что гарантирует ознакомление с текстом.

Метод 3: Доставляемые уведомления (Локальные уведомления)

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

Для создания локального уведомления используется объект ДоставляемоеУведомление. Рассмотрим пример реализации:


Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Текст = "Обмен завершен успешно";
Уведомление.Заголовок = "Синхронизация";
Уведомление.ЗвуковоеОповещение = ЗвуковоеОповещение.ПоУмолчанию;

// Отправляем уведомление немедленно
ДоставляемыеУведомления.ДобавитьЛокальноеУведомление(Уведомление);

Такое уведомление появится в системной шторке устройства, даже если приложение свернуто, что максимально приближено к функционалу «большой» платформы.

Как написать универсальный код (Best Practice)

Чтобы ваша конфигурация корректно работала во всех средах (и в тонком клиенте на ПК, и в мобильном клиенте, и в мобильном приложении), рекомендуется использовать инструкции препроцессора для разделения логики. Разберем, как правильно структурировать код:


#Если МобильныйКлиент ИЛИ ТонкийКлиент Тогда
    // Здесь используем красивое всплывающее окно
    ПоказатьОповещениеПользователя("Успех!", , "Операция выполнена");
#ИначеЕсли МобильноеПриложениеКлиент Тогда
    // В автономном приложении используем локальное уведомление или Сообщить
    Сообщить("Операция выполнена");
    // Или вызываем системное уведомление:
    Уведомление = Новый ДоставляемоеУведомление;
    Уведомление.Текст = "Операция выполнена";
    ДоставляемыеУведомления.ДобавитьЛокальноеУведомление(Уведомление);
#КонецЕсли

Важный нюанс: Обратите внимание, что проверка #Если МобильныйКлиент отделена от #Если МобильноеПриложениеКлиент. Это ключевой момент для предотвращения ошибок компиляции, так как состав доступных методов в них различается.

Подведем итоги

Проанализировав ситуацию, мы пришли к следующим выводам:

  1. Метод ПоказатьОповещениеПользователя предназначен для Мобильного клиента и десктопных версий.
  2. В Мобильном приложении (автономном) данный метод отсутствует, что вызывает ошибку.
  3. Для вывода простых сообщений в мобильном приложении используйте Сообщить.
  4. Для важных уведомлений используйте ПоказатьПредупреждение.
  5. Для имитации всплывающих «пушей» используйте объект ДоставляемоеУведомление.

Используя эти подходы, вы сможете создавать надежные мобильные интерфейсы, которые не будут «падать» при попытке проинформировать пользователя о результатах работы программы.

← На главную