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