При переходе на управляемые формы и платформу 1С:Предприятие 8.3 многие разработчики продолжают по привычке вызывать метод Сообщить(), считая создание объекта СообщениеПользователю избыточным усложнением кода. Разберем детально, почему традиционный метод считается устаревшим, какие преимущества дает использование специализированного объекта платформы и как писать компактный код без лишних строк.
Проанализируем технические особенности устаревшего подхода. Метод Сообщить() сохранен исключительно для обратной совместимости с обычным приложением (толстым клиентом) и для временной технологической отладки. В соответствии со стандартами разработки фирмы «1С» использование метода Сообщить() в управляемом приложении запрещено во всех прикладных сценариях, даже когда текст не привязывается к элементам интерфейса.
Главный недостаток метода Сообщить() заключается в том, что он просто выводит текстовую строку в панель сообщений. При этом платформа не связывает сообщение с конкретными реквизитами формы или строки табличной части, что заставляет пользователя вручную искать поле с некорректными данными.
Рассмотрим, как работает механизм информирования в управляемом интерфейсе при использовании объекта СообщениеПользователю. Платформа предоставляет ряд интерактивных возможностей:
Поле и ПутьКДанным, элемент управления обводится красной рамкой, сигнализируя о проблеме прямо на форме.КлючДанных заполнено и не совпадает с ключевым значением основного реквизита текущей формы, платформа автоматически откроет нужную форму объекта, спозиционирует сообщение в ней и перенесет связанные оповещения.Посмотрим на классический пример валидации данных в модуле объекта с использованием метода УстановитьДанные():
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Поле ""Склад"" обязательно для заполнения!";
Сообщение.Поле = "Склад";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
Метод УстановитьДанные() избавляет от необходимости вручную вычислять свойства КлючДанных и ПутьКДанным: достаточно передать объект, и платформа настроит привязку автоматически.
Если требуется указать на конкретную строку табличной части, сформируем путь к данным с указанием индекса строки:
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не указана цена для позиции номенклатуры";
Сообщение.Поле = "Цена";
Сообщение.ПутьКДанным = "Объект.Товары[" + Формат(ИндексСтроки, "ЧГ=0") + "].Цена";
Сообщение.Сообщить();
В сложных сценариях при одновременной работе пользователя в нескольких окнах возникает проблема корректной доставки уведомлений. При асинхронных вызовах или фоновых операциях серверное сообщение может по ошибке отобразиться в текущем активном окне, а не в исходном документе.
Для гарантированной доставки используется свойство ИдентификаторНазначения. Передав в него уникальный идентификатор конкретной формы (например, полученный через УникальныйИдентификатор формы), мы обеспечиваем вывод ошибки строго в том окне, из которого было запущено действие.
Разберем поведение платформы при выполнении серверных регламентных и длительных операций. В фоновых заданиях пользовательский интерфейс отсутствует, поэтому вызов Сообщить() теряется в общем потоке системного журнала или игнорируется.
Вызовы СообщениеПользователю помещаются в системную очередь сообщений сеанса. Это дает ключевые преимущества:
ФоновоеЗадание.ПолучитьСообщенияПользователю() и отображать пользователю накопленные предупреждения и ход выполнения.ПолучитьСообщенияПользователю() можно программно анализировать ошибки внутри транзакций или модульных тестов без участия интерфейса.Сообщить().Чтобы избежать написания громоздких конструкций из 4–5 строк кода для каждого предупреждения, разработчики конфигураций на базе БСП используют готовые методы модуля ОбщегоНазначенияКлиентСервер.
Посмотрим на компактную реализацию вывода ошибки:
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
"Не заполнен контрагент",
ЭтотОбъект,
"Контрагент",
,
Отказ
);
Данный вызов не только формирует объект СообщениеПользователю с корректными привязками данных в одну строку, но и автоматически устанавливает переданную переменную Отказ в значение Истина.
В ситуациях, когда необходимо просто проинформировать пользователя об успешном завершении операции (например, при нажатии «Провести и закрыть», когда форма документа исчезает), стандартные сообщения не подходят, так как окно закрывается вместе со своим списком ошибок.
Для таких сценариев используется глобальный метод клиентского контекста ПоказатьОповещениеПользователя():
ПоказатьОповещениеПользователя(
"Проведение документа",
ПолучитьНавигационнуюСсылку(Объект.Ссылка),
"Документ успешно проведен и закрыт",
БиблиотекаКартинок.Успешно
);
Этот метод отображает отдельное всплывающее окно в правом нижнем углу экрана платформы, которое автоматически затухает через несколько секунд и не привязано к жизненному циклу закрытой формы.