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