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