Программная проверка заполнения
страницаПрограммная проверка заполнения
В режиме «Конфигуратор»
Иногда бывает нужно самостоятельно производить проверку заполнения реквизита в соответствии с программной логикой. В этом случае, если для реквизита установлено свойство Проверка заполнения в значение Выдавать ошибку, нужно удалить этот реквизит из массива проверяемых реквизитов и выполнить проверку программным путем. Или же если для реквизита не установлена проверка заполнения, можно программно добавить реквизит в массив проверяемых реквизитов.
Программная проверка заполнения объектов конфигурации выполняется в обработчике ОбработкаПроверкиЗаполнения(), который нужно поместить в модуле объекта. Этот обработчик вызывается автоматически при сохранении любой формы или при проведении документов. Программную проверку объектов интерактивного ввода нужно делать именно в этом обработчике, а не при записи объекта.
Откроем модуль документа ОказаниеУслуги и поместим в нем следующую процедуру (листинг 27.4).
Листинг 27.4. Обработчик события «ОбработкаПроверкиЗаполнения»
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Индекс = ПроверяемыеРеквизиты.Найти("ПереченьНоменклатуры.НаборСвойств");
Если Индекс <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;
Индекс = 0;
Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
Если Не ЗначениеЗаполнено(ТекСтрокаПереченьНоменклатуры.НаборСвойств) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "В строке " + Строка(Индекс+1) + " списка Перечень номенклатуры не заполнена колонка Набор свойств";
Сообщение.Поле = "ПереченьНоменклатуры[" + Строка(Индекс) + "].НаборСвойств";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Индекс = Индекс + 1;
КонецЦикла;
КонецПроцедуры
Сначала мы находим реквизит табличной части НаборСвойств в массиве ПроверяемыеРеквизиты. Этот массив передается в обработчик и содержит массив проверяемых реквизитов, которым мы установили свойство Проверка заполнения в значение Выдавать ошибку во время разработки конфигурации. Если он найден, то удаляем его, так как мы будем выполнять проверку самостоятельно.
Затем мы в цикле обходим строки табличной части документа и формируем сообщения об ошибке только в том случае, если номенклатура в табличной части является материалом и для нее не заполнена колонка НаборСвойств.
Параметр Отказ мы устанавливаем в значение Истина. Это значит, что документ не будет проведен, если найден хоть один незаполненный реквизит НаборСвойств для номенклатуры, являющейся материалом. Если этот параметр закомментировать, сообщения об ошибке будут выдаваться, но документ будет проведен.
Для упрощения примера мы опять здесь используем обращение ПереченьНоменклатуры.Номенклатура.ВидНоменклатуры, хотя оптимальнее использовать запрос. Об этом подробно рассказывалось на занятии № 14, поэтому мы не будем здесь рассматривать этот вопрос.