К статье
Практический материал

Разработка и Конфигурация · 10 мин

Что использовать в 1С вместо Сообщить: обзор альтернатив

Чем заменить Сообщить в 1С: СообщениеПользователю, Статус, ПоказатьОповещениеПользователя, журнал регистрации. Примеры кода, критерии выбора, типичные ошибки.

Команда Сообщить — самый старый способ вывести текст пользователю в 1С, и одновременно самый проблемный. Она не привязывается к объекту данных, нельзя указать поле формы, с которым связана ошибка, а при массовом выводе окно сообщений превращается в нечитаемый список. В управляемых формах и тонком клиенте у Сообщить есть и технические ограничения: текст уходит на клиент пачкой, без контекста.

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

Ниже разобраны все рабочие альтернативы с примерами кода, критериями выбора и типичными ошибками, которые встречаются при замене Сообщить в существующем коде.

Почему Сообщить считается устаревшим подходом

Главный недостаток Сообщить — отсутствие контекста. Текст просто попадает в панель сообщений, и пользователь не может по нему перейти к проблемному полю или документу. Если обработка выводит двести строк «Ошибка в строке 15», найти нужную строку в данных практически невозможно.

Вторая проблема — поведение в клиент-серверном режиме. Вызов Сообщить на сервере складывает текст в буфер, который сбрасывается на клиент только при возврате управления. При длительной серверной операции пользователь не видит ничего до её завершения, а потом получает всю пачку разом.

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

СообщениеПользователю — основная замена

Объект СообщениеПользователю создаётся в коде, заполняется текстом и настройками, после чего выводится методом Сообщить(). Ключевое отличие — свойства КлючДанных и Поле, которые связывают сообщение с конкретным объектом и реквизитом.

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Не заполнен склад отгрузки";

Сообщение.КлючДанных = Объект.Ссылка;

Сообщение.Поле = "Склад";

Сообщение.УстановитьДанные(Объект);

Сообщение.Сообщить();

При двойном клике по такому сообщению откроется форма объекта, а курсор встанет на поле «Склад». Для табличных частей путь к данным указывается через свойство ПутьКДанным с индексом строки, например Товары[2].Количество.

Если конфигурация построена на БСП, используйте готовую процедуру ОбщегоНазначения.СообщитьПользователю — она принимает текст, ключ данных, поле и путь к данным одним вызовом и дополнительно регистрирует ошибку для механизмов обмена данными.

bsl
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не заполнен склад отгрузки";
Сообщение.КлючДанных = Объект.Ссылка;
Сообщение.Поле = "Склад";
Сообщение.Сообщить();

Статус и индикатор для длительных операций

Когда нужно не сообщить об ошибке, а показать ход выполнения обработки, подходят Статус и Индикатор. Они выводят текст в строку состояния внизу окна и не засоряют панель сообщений.

Для НомерСтроки = 1 По ВсегоСтрок Цикл

Статус("Обработано " + НомерСтроки + " из " + ВсегоСтрок);

// обработка строки

КонецЦикла;

Важное ограничение: Статус работает только на клиенте. При вызове серверной процедуры статусная строка не обновляется до возврата на клиент, поэтому для длительных серверных операций используют длительные операции БСП с периодическим обратным вызовом, который уже на клиенте обновляет индикатор.

Не вызывайте Статус на каждой итерации при больших объёмах — обновление интерфейса замедляет обработку. Обновляйте статус раз в 50–100 итераций или по проценту выполнения.

ПоказатьОповещениеПользователя для фоновых уведомлений

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

ПоказатьОповещениеПользователя(

"Загрузка завершена",

ПолучитьНавигационнуюСсылку(ДокументСсылка),

"Загружено 1250 позиций",

БиблиотекаКартинок.Информация);

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

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

Сравнение способов вывода

СообщениеПользователю

Ошибки валидации и сообщения с привязкой к полю. Требует заполнения КлючДанных и Поле для перехода к реквизиту.

Статус

Прогресс длительной клиентской операции. Не работает на сервере, не сохраняется в истории.

ПоказатьОповещениеПользователя

Фоновые уведомления без блокировки работы. Исчезает автоматически, не для критических ошибок.

ЗаписьЖурналаРегистрации

Служебная диагностика для администраторов. Пользователь сообщение не увидит.

ВызватьИсключение

Критические ошибки, прерывающие операцию. Откатывает транзакцию.

Журнал регистрации и исключения

Техническую диагностику — ошибки обмена, параметры запросов, стек вызовов — пользователю показывать не нужно. Для этого служит ЗаписьЖурналаРегистрации: информация сохраняется в журнале, доступном администратору через конфигуратор или консоль.

ЗаписьЖурналаРегистрации(

"Обмен с сайтом.Загрузка заказов",

УровеньЖурналаРегистрации.Ошибка,

, ,

ОписаниеОшибки());

Если ошибка делает продолжение операции бессмысленным, вызывайте исключение: ВызватьИсключение "Не удалось получить курс валюты". Внутри транзакции исключение откатит все изменения, что защищает данные от частичной записи. Текст исключения пользователь увидит в окне ошибки, поэтому формулируйте его понятно, без внутренних кодов.

Практический порядок замены в существующем коде

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

Отладочные вызовы не заменяйте, а удаляйте либо переводите в журнал регистрации с уровнем «Информация» — иначе в рабочей базе останется мусорный вывод, который видят пользователи.

Порядок замены Сообщить
  1. 1
    Найдите все вызовы Сообщить через глобальный поиск по конфигурации
  2. 2
    Классифицируйте каждый вызов: ошибка, прогресс, уведомление, отладка
  3. 3
    Ошибки валидации переведите на СообщениеПользователю с КлючДанных и Поле
  4. 4
    Прогресс замените на Статус или Индикатор, уведомления — на ПоказатьОповещениеПользователя
  5. 5
    Отладочный вывод удалите или перенесите в журнал регистрации
  6. 6
    Проверьте работу в тонком клиенте: сообщения должны приходить с привязкой к полям

Как проверить результат и типичные ошибки

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

Типичные ошибки
01
Оставить Сообщить в серверной процедуре — пользователь получит всю пачку сообщений только после завершения операции
02
Не заполнить КлючДанных и Поле — сообщение теряет главное преимущество, переход к реквизиту не работает
03
Использовать ПоказатьОповещениеПользователя для критических ошибок — окно исчезает, и ошибку пропускают
04
Вызывать Статус на каждой итерации большого цикла — обработка заметно замедляется
05
Писать технические детали ошибки пользователю вместо журнала регистрации — текст пугает и не помогает

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

Контрольные точки

Как проверить результат

Двойной клик по сообщению
Норма

Открывается форма объекта, курсор на нужном поле

Тревожный признак

Ничего не происходит или открывается пустая форма

Серверная процедура с сообщениями
Норма

Сообщения приходят с привязкой после выполнения

Тревожный признак

Панель сообщений пуста или текст без контекста

Длительная обработка
Норма

Статус обновляется, интерфейс не зависает

Тревожный признак

Статус появляется только в конце операции

Частые вопросы

Работает ли Сообщить в управляемых формах?

Да, вызов не запрещён и текст отображается в панели сообщений. Проблема не в работоспособности, а в отсутствии привязки к данным и в пакетной доставке с сервера. Для нового кода использовать его не рекомендуется.

Чем заменить Сообщить в фоновом задании?

Напрямую — ничем: у фонового задания нет пользовательского интерфейса. Пишите в журнал регистрации через ЗаписьЖурналаРегистрации, а результат возвращайте вызывающему коду, который уже на клиенте покажет оповещение или сообщение.

Как вывести сообщение по строке табличной части?

Заполните у СообщениеПользователю свойства КлючДанных (ссылка на объект) и Поле либо ПутьКДанным в формате «Товары[2].Количество» — индекс строки начинается с нуля. При клике по сообщению откроется форма с позиционированием на этой строке.

Что выбрать: ПоказатьПредупреждение или СообщениеПользователю?

Предупреждение — модальное окно, блокирующее работу до нажатия кнопки. Используйте его только когда без реакции пользователя продолжать нельзя. Для обычных ошибок заполнения полей достаточно СообщениеПользователю — оно не прерывает работу.

Нужно ли заменять Сообщить в старых внешних обработках?

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

Как временно отладить код без Сообщить?

Используйте отладчик конфигуратора с точками останова и табло — это точнее любого текстового вывода. Если отладчик недоступен (рабочая база), пишите в журнал регистрации с уровнем «Информация» и читайте через отбор по событию.

Итог

Что важно запомнить

Сообщить заменяют по сценарию: СообщениеПользователю — для ошибок с привязкой к полям, Статус — для прогресса, ПоказатьОповещениеПользователя — для фоновых уведомлений, журнал регистрации — для диагностики, ВызватьИсключение — для критических сбоев. Ключ к качественной замене — заполнение КлючДанных и Поле.