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