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