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