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