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

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

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

Анализ проблемы: почему сообщение не привязывается автоматически?

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


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

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

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

Решение 1: Использование метода УстановитьДанные()

Чтобы платформа смогла связать объект с формой "под капотом", мы применим встроенный метод УстановитьДанные(). Проанализируем правильный вариант кода:


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

Разберем подробнее, что изменилось и почему это работает:

  1. Передача объекта: Мы использовали СообщениеПользователю.УстановитьДанные(ЭтотОбъект). При вызове этого метода платформа автоматически вычисляет соответствие между объектом данных и открытой формой, самостоятельно заполняя скрытые свойства ПутьКДанным и КлючДанных.
  2. Отказ от Ссылки: Обратите внимание, мы передаем именно ЭтотОбъект, а не ЭтотОбъект.Ссылка. Если пользователь создает совершенно новый элемент справочника или документ, то его свойство Ссылка еще пустое. Передача самого объекта является наиболее универсальным и корректным подходом по стандартам 1С.
  3. Правильное имя поля: В свойстве Поле мы указали просто "Родитель". Поскольку мы вызываем сообщение из модуля объекта и привязываем его к данным этого же объекта, писать префикс "Объект.Родитель" не нужно — платформа подставит его сама.

Решение 2: Использование методов Библиотеки стандартных подсистем (БСП)

Если в вашей конфигурации встроена Библиотека стандартных подсистем (а это актуально для всех современных типовых конфигураций, таких как УНФ, ERP, УТ, БП), мы рекомендуем использовать готовые методы-обертки. Это значительно сокращает код и снижает вероятность ошибки.

Посмотрим на пример использования метода БСП:


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

Проанализируем преимущества данного подхода:

  1. Код сокращается до одной легко читаемой функции.
  2. В современных версиях БСП используется метод ОбщегоНазначения.СообщитьПользователю() (в более старых конфигурациях он мог называться ОбщегоНазначенияКлиентСервер.СообщитьПользователю()).
  3. Метод принимает параметр Отказ последним аргументом. Таким образом, он не только выводит привязанное сообщение, но и автоматически устанавливает Отказ = Истина, блокируя ошибочную запись данных в базу.

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

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

Посмотрим на пример:


// Предположим, ИндексСтроки - это индекс строки с ошибкой (начиная с 0)
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = "Укажите количество больше нуля!";
СообщениеПользователю.Поле = "Товары[" + ИндексСтроки + "].Количество";
СообщениеПользователю.УстановитьДанные(ЭтотОбъект);
СообщениеПользователю.Сообщить();

В этом случае при выводе сообщения система точно подсветит ячейку с ошибочным количеством в табличной части Товары.

Важное правило стандартов разработки 1С

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

Если же наша задача — просто проинформировать пользователя о каком-то фоновом событии (например, "Расчет стоимости успешно завершен" или "Данные загружены"), необходимо использовать метод ПоказатьОповещениеПользователя(). Такое уведомление плавно появится в правом нижнем углу экрана и исчезнет само по себе, не прерывая работу пользователя.

← На главную