Почему в управляемых формах 1С нужно использовать СообщениеПользователю вместо Сообщить?

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

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

Ограничения метода Сообщить() и требования стандартов

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

Главный недостаток метода Сообщить() заключается в том, что он просто выводит текстовую строку в панель сообщений. При этом платформа не связывает сообщение с конкретными реквизитами формы или строки табличной части, что заставляет пользователя вручную искать поле с некорректными данными.

Интерактивные возможности объекта СообщениеПользователю

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

  1. Визуальная подсветка ошибки: если заполнены свойства Поле и ПутьКДанным, элемент управления обводится красной рамкой, сигнализируя о проблеме прямо на форме.
  2. Автоматический переход к редактированию: при клике пользователем на текст в панели сообщений фокус ввода немедленно перемещается в соответствующее поле или ячейку табличной части.
  3. Маршрутизация между окнами: если свойство КлючДанных заполнено и не совпадает с ключевым значением основного реквизита текущей формы, платформа автоматически откроет нужную форму объекта, спозиционирует сообщение в ней и перенесет связанные оповещения.

Посмотрим на классический пример валидации данных в модуле объекта с использованием метода УстановитьДанные():


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Поле ""Склад"" обязательно для заполнения!";
Сообщение.Поле = "Склад";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;

Метод УстановитьДанные() избавляет от необходимости вручную вычислять свойства КлючДанных и ПутьКДанным: достаточно передать объект, и платформа настроит привязку автоматически.

Если требуется указать на конкретную строку табличной части, сформируем путь к данным с указанием индекса строки:


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не указана цена для позиции номенклатуры";
Сообщение.Поле = "Цена";
Сообщение.ПутьКДанным = "Объект.Товары[" + Формат(ИндексСтроки, "ЧГ=0") + "].Цена";
Сообщение.Сообщить();

Адресация и работа в многооконном режиме

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

Для гарантированной доставки используется свойство ИдентификаторНазначения. Передав в него уникальный идентификатор конкретной формы (например, полученный через УникальныйИдентификатор формы), мы обеспечиваем вывод ошибки строго в том окне, из которого было запущено действие.

Работа с фоновыми заданиями и программный перехват

Разберем поведение платформы при выполнении серверных регламентных и длительных операций. В фоновых заданиях пользовательский интерфейс отсутствует, поэтому вызов Сообщить() теряется в общем потоке системного журнала или игнорируется.

Вызовы СообщениеПользователю помещаются в системную очередь сообщений сеанса. Это дает ключевые преимущества:

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

Упрощение кода с помощью Библиотеки стандартных подсистем (БСП)

Чтобы избежать написания громоздких конструкций из 4–5 строк кода для каждого предупреждения, разработчики конфигураций на базе БСП используют готовые методы модуля ОбщегоНазначенияКлиентСервер.

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


ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
    "Не заполнен контрагент",
    ЭтотОбъект,
    "Контрагент",
    ,
    Отказ
);

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

Всплывающие уведомления: ПоказатьОповещениеПользователя

В ситуациях, когда необходимо просто проинформировать пользователя об успешном завершении операции (например, при нажатии «Провести и закрыть», когда форма документа исчезает), стандартные сообщения не подходят, так как окно закрывается вместе со своим списком ошибок.

Для таких сценариев используется глобальный метод клиентского контекста ПоказатьОповещениеПользователя():


ПоказатьОповещениеПользователя(
    "Проведение документа",
    ПолучитьНавигационнуюСсылку(Объект.Ссылка),
    "Документ успешно проведен и закрыт",
    БиблиотекаКартинок.Успешно
);

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

← На главную