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

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

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

Как привязать сообщение пользователю к элементу формы в 1С: объект СообщениеПользователю, свойство ПутьКДанным, метод УстановитьДанные, примеры кода и типичные ошибки.

Когда форма в 1С проверяет введённые данные и находит ошибку, пользователю нужно не просто показать текст, а указать, в каком именно поле проблема. Для этого объект СообщениеПользователю умеет привязываться к элементу формы: сообщение подсвечивает поле красной рамкой, а при двойном щелчке по сообщению курсор переходит в нужное поле. Без привязки сообщение выводится «в никуда» — в панель сообщений без указания источника, и пользователю приходится искать ошибку вручную.

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

Как устроен механизм привязки сообщений

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

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

Базовый пример: привязка к реквизиту объекта

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

&НаКлиенте

Процедура ПроверитьЗаполнение(Команда)

Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда

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

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

Сообщение.ПутьКДанным = "Объект.Контрагент";

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

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

КонецЕсли;

КонецПроцедуры

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

Результат проверяется визуально: после выполнения кода поле «Контрагент» обводится красной рамкой, в панели сообщений появляется текст, а двойной щелчок по нему активирует поле. Если рамки нет — почти всегда дело в неверном пути в ПутьКДанным.

Порядок действий
  1. 1
    Создайте объект: Сообщение = Новый СообщениеПользователю
  2. 2
    Заполните Сообщение.Текст понятным пользователю текстом
  3. 3
    Укажите Сообщение.ПутьКДанным = "Объект.ИмяРеквизита"
  4. 4
    Вызовите Сообщение.УстановитьДанные(ЭтотОбъект)
  5. 5
    Вызовите Сообщение.Сообщить() и проверьте подсветку поля на форме

Привязка к реквизиту формы и к колонке табличной части

Реквизит формы без объекта

Если поле на форме связано не с объектом, а с реквизитом формы (например, вспомогательный флаг или отбор), префикс Объект. не нужен — путь состоит только из имени реквизита:

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

Сообщение.Текст = "Укажите период отчёта";

Сообщение.ПутьКДанным = "ПериодОтчета";

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

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

Строка табличной части

Для табличной части путь включает имя таблицы, индекс строки и имя колонки. Индексация в пути — с нуля, поэтому для первой строки используется индекс 0:

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

Сообщение.Текст = "В строке 1 не указана цена";

Сообщение.ПутьКДанным = "Объект.Товары[0].Цена";

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

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

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

Привязка при проверке на сервере и вне формы

Проверки часто выполняются в серверных процедурах (&НаСервере) или в общих модулях, где переменная ЭтотОбъект формы недоступна. В этом случае привязка делается через КлючУникальности: форма передаёт свой УникальныйИдентификатор в серверную процедуру, а та присваивает его сообщению. Тогда сообщение «найдёт» нужную форму и подсветит поле в ней.

&НаСервере

Процедура ПроверитьНаСервере(ИдентификаторФормы)

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

Сообщение.Текст = "Сумма документа превышает лимит";

Сообщение.ПутьКДанным = "Объект.СуммаДокумента";

Сообщение.КлючУникальности = ИдентификаторФормы;

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

КонецПроцедуры

Обратите внимание: в серверном контексте метод УстановитьДанные() часто не вызывают, потому что данные формы как объект там недоступны — достаточно связки ПутьКДанным и КлючУникальности. При вызове из модуля объекта (например, в ОбработкаПроверкиЗаполнения) привязка к форме вообще не нужна: там достаточно указать Сообщение.Поле = "Контрагент" и вызвать УстановитьДанные(ЭтотОбъект) — платформа сама сопоставит поле с элементом формы при открытии.

Маршрут решения

Как выбрать способ привязки

Проверка выполняется в клиентской процедуре формыИспользуйте ПутьКДанным + УстановитьДанные(ЭтотОбъект)
Проверка в серверной процедуре формы или общем модулеПередайте УникальныйИдентификатор формы и задайте КлючУникальности
Проверка в модуле объекта (ОбработкаПроверкиЗаполнения)Используйте свойство Поле + УстановитьДанные(ЭтотОбъект), привязка к форме не нужна
Сообщение не связано с конкретным полемНе заполняйте ПутьКДанным — сообщение уйдёт в общую панель без подсветки

Проверка результата и отладка

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

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

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

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

Подсветка поля после Сообщить()
Норма

Поле обведено красной рамкой

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

Рамки нет — проверьте ПутьКДанным и вызов УстановитьДанные

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

Курсор переходит в нужное поле или строку таблицы

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

Ничего не происходит — путь не совпадает с данными формы

Место вывода сообщения
Норма

Сообщение в панели сообщений той же формы

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

Сообщение в другом окне — задайте КлючУникальности

Типичные ошибки и ограничения

Чаще всего разработчики забывают вызвать УстановитьДанные() — без него ПутьКДанным игнорируется, и сообщение выводится без привязки. Вторая частая ошибка — указание пути к элементу формы (имени элемента, например Контрагент1) вместо пути к данным. Привязка работает только по пути к данным, а не по имени элемента управления.

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

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

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

FAQ

Можно ли привязать сообщение к кнопке или надписи на форме?

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

Чем ПутьКДанным отличается от свойства Поле?

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

Почему сообщение появляется в другом открытом окне?

Потому что не задано свойство КлючУникальности. Присвойте ему УникальныйИдентификатор нужной формы — тогда сообщение будет показано строго в её окне, даже если открыто несколько экземпляров одной формы.

Работает ли привязка в обработке проверки заполнения?

Да, но там применяется другой подход: в ОбработкаПроверкиЗаполнения модуля объекта используют свойство Поле и УстановитьДанные(ЭтотОбъект), а в параметре Отказ устанавливают Истина. Платформа сама привяжет сообщение к полю при открытой форме.

Как привязать сообщение к строке динамического списка или дерева значений?

Для таблицы значений и дерева — реквизитов формы — путь строится так же, как для табличной части: ИмяРеквизита[Индекс].ИмяКолонки. Для динамического списка привязка к конкретной строке не поддерживается, так как строки списка не являются редактируемыми данными формы.

Можно ли программно убрать красную подсветку после исправления?

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

Итог

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

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