Как исправить ошибку «Слишком много фактических параметров» и адаптировать оповещения для мобильного приложения 1С?

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

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

Анализ причин возникновения ошибок

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

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

Способ 1. Корректное использование метода Сообщить

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


Процедура ПоказатьОповещение(ДлительнаяОперация)
    
    Оповещение = ДлительнаяОперация.ОповещениеПользователя;
    Если Не Оповещение.Показать Тогда
        Возврат;
    КонецЕсли;
    
    ТекстСообщения = ?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'"));
    Если ЗначениеЗаполнено(Оповещение.Пояснение) Тогда
        ТекстСообщения = ТекстСообщения + Символы.ПС + Оповещение.Пояснение;
    КонецЕсли;
    
    Сообщить(ТекстСообщения);
    
КонецПроцедуры

Способ 2. Использование объекта СообщениеПользователю

Посмотрим на более универсальный подход платформы 1С:Предприятие. Объект СообщениеПользователю поддерживается на мобильной платформе и позволяет выводить структурированные уведомления:


Процедура ПоказатьОповещение(ДлительнаяОперация)
    
    Оповещение = ДлительнаяОперация.ОповещениеПользователя;
    Если Не Оповещение.Показать Тогда
        Возврат;
    КонецЕсли;
    
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'"));
    Если ЗначениеЗаполнено(Оповещение.Пояснение) Тогда
        Сообщение.Текст = Сообщение.Текст + " (" + Оповещение.Пояснение + ")";
    КонецЕсли;
    Сообщение.Сообщить();
    
КонецПроцедуры

Способ 3. Разделение логики с помощью инструкций препроцессора

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


Процедура ПоказатьОповещение(ДлительнаяОперация)
    
    Оповещение = ДлительнаяОперация.ОповещениеПользователя;
    Если Не Оповещение.Показать Тогда
        Возврат;
    КонецЕсли;
    
    ТекстОповещения = ?(Оповещение.Текст <> Неопределено, Оповещение.Текст, НСтр("ru = 'Действие выполнено'"));
    
    #Если МобильноеПриложениеКлиент Или МобильноеПриложениеСервер Тогда
        Если ЗначениеЗаполнено(Оповещение.Пояснение) Тогда
            ТекстОповещения = ТекстОповещения + " - " + Оповещение.Пояснение;
        КонецЕсли;
        Сообщить(ТекстОповещения);
    #Иначе
        ПоказатьОповещениеПользователя(ТекстОповещения, Оповещение.НавигационнаяСсылка, Оповещение.Пояснение);
    #КонецЕсли
    
КонецПроцедуры

Рекомендации по написанию чистого кода

  1. Не переопределяйте зарезервированные имена. Объявление переменных вида ТекущаяДата = ТекущаяДата(); ухудшает читаемость кода и может приводить к скрытым ошибкам при последующих обращениях к системной функции ТекущаяДата(). Рекомендуется использовать имена МоментВремени или ТекущийМомент.
  2. Проверяйте модули на синтаксис мобильного приложения. При включении общих модулей в мобильное приложение регулярно запускайте синтаксическую проверку конфигуратора в режиме проверки мобильного клиента и сервера, чтобы своевременно локализовать неподдерживаемые конструкции БСП.
← На главную