Книга: Разработка интерфейса прикладных решений на платформе "1С:Предприятие 8"
Назад: Программная обработка проверки заполнения
Дальше: Проверка заполнения и функциональные опции

Вывод сообщений с привязкой к элементам формы

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

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

Примечание

Пример можно посмотреть в демонстрационной базе «Проверка заполнения», модуль документа Накладная, процедура ОбработкаПроверкиЗаполнения, снять комментарии для варианта «Пример 5».

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

Также нужно указать, с каким реквизитом формы будет связано это сообщение. Для этого используется свойство Поле (Сообщение.Поле = "Поставщик"). Таким образом мы указываем, что сообщение должно быть привязано к тому элементу формы, который отображает значение реквизита Поставщик.

Мы указали, к какому реквизиту привязать сообщение. Но неизвестно, в какой форме находится этот реквизит. Ведь наш код выполняется в модуле объекта, и у нас нет информации о каких-либо открытых формах.

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

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

Ну, и собственно для показа сообщения используется метод Сообщить().

Допустим, нужно проверить заполненность реквизита Поставщик (рис. 3.58).

Рис. 3.58. Реквизит «Поставщик», заполненность которого нужно проверить

Это можно выполнить следующим образом (листинг 3.45).

Листинг 3.45. Привязка сообщения к реквизиту объекта

Если Поставщик = Справочники.Поставщики.ПустаяСсылка() Тогда

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

Сообщение.Поле = "Поставщик"; // имя реквизита

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

Сообщение.Текст = "Нужно заполнить поставщика!";

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

 

Отказ = Истина; // не выполнять запись

 

КонецЕсли;

В результате, если поставщик не заполнен, мы будем иметь такое сообщение в форме (рис. 3.59).

Рис. 3.59. Сообщение о незаполненном реквизите

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

Теперь рассмотрим ситуацию, когда нужно сообщить об отсутствии строк в табличной части Товары (рис. 3.60).

Рис. 3.60. Табличная часть, заполненность которой нужно проверить

Это можно выполнить следующим образом (листинг 3.46).

Листинг 3.46. Привязка сообщения к табличной части

Если Товары.Количество() = 0 Тогда

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

Сообщение.Поле = "Товары"; // имя табличной части

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

Сообщение.Текст = "Нужно заполнить список полученных товаров!";

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

 

Отказ = Истина; // не выполнять запись

 

КонецЕсли;

Здесь в свойстве Поле указывается имя табличной части.

В результате, если табличная часть пуста, мы будем иметь такое сообщение в форме (рис. 3.61).

Рис. 3.61. Сообщение о незаполненной табличной части

Теперь, допустим, нужно сообщить о том, что в некоторой строке табличной части не заполнено какое-то поле – например, во второй строке пустое поле Цена (рис. 3.62).

Рис. 3.62. Реквизит табличной части, заполненность которого нужно проверить

Это можно выполнить следующим образом (листинг 3.47).

Листинг 3.47. Привязка сообщения к реквизиту табличной части

Если Товары[1].Цена = 0 Тогда

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

Сообщение.Поле = "Товары[1].Цена"; // индекс строки табличной части и имя поля

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

Сообщение.Текст = "Нужно написать цену товара!";

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

 

Отказ = Истина; // не выполнять запись

 

КонецЕсли;

Здесь в свойстве Поле указывается путь к нужному полю табличной части. Сначала с помощью индекса указывается строка (Товары[1]), затем через точку указывается поле в этой строке (Цена).

В результате, если цена не заполнена, мы будем иметь такое сообщение в форме (рис. 3.63).

Рис. 3.63. Сообщение о незаполненном реквизите табличной части

В ситуации, когда нужно самостоятельно проверять заполненность каких-либо реквизитов формы (а не реквизитов объекта), все обстоит несколько проще. Такие проверки нужно делать в обработчике события формы Обработка проверки заполнения на сервере.

Поскольку код этого обработчика выполняется в контексте формы, нет необходимости устанавливать для сообщения данные (Сообщение.УстановитьДанные(…)). Достаточно лишь указать имя реквизита формы, к данным которого будет привязано сообщение.

Примечание

Пример можно посмотреть в демонстрационной базе «Проверка заполнения», модуль формы документа Накладная, снять комментарии с процедуры ОбработкаПроверкиЗаполненияНаСервере.

Например, нужно проверить реквизит формы Ответственный (рис. 3.64).

Рис. 3.64. Реквизит формы, заполненность которого нужно проверить

Это может выглядеть следующим образом (листинг 3.48).

Листинг 3.48. Привязка сообщения к реквизиту формы

Если СокрЛП(Ответственный) = "" Тогда

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

Сообщение.Поле = "Ответственный";

Сообщение.Текст = "Нужно написать фамилию ответственного!";

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

 

// Удалить ответственного из массива проверяемых реквизитов,

// чтобы платформа не проверяла его автоматически еще раз.

ИндексОтветственного = ПроверяемыеРеквизиты.Найти("Ответственный");

Если ИндексОтветственного <> Неопределено Тогда

ПроверяемыеРеквизиты.Удалить(ИндексОтветственного);

 

КонецЕсли;

 

КонецЕсли;

В результате, если ответственный не заполнен, мы будем иметь такое сообщение в форме (рис. 3.65).

Рис. 3.65. Сообщение о незаполненном реквизите формы

Назад: Программная обработка проверки заполнения
Дальше: Проверка заполнения и функциональные опции