Как запретить запись элемента справочника при неверном заполнении реквизитов в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки конфигураций на платформе 1С часто возникает задача: проверить корректность введенных пользователем данных и запретить сохранение элемента, если один из реквизитов не проходит валидацию. При этом важно не просто прервать процесс, но и сделать это корректно с точки зрения архитектуры платформы — уведомить пользователя о конкретной ошибке, не оставлять форму в подвешенном состоянии и избежать нежелательных диалогов сохранения при закрытии. Разберем основные подходы к решению этой задачи.

Способ 1. Использование обработчика «ОбработкаПроверкиЗаполнения» (рекомендуемый подход)

Наиболее правильным и стандартизированным методом валидации данных в 1С является переопределение платформенного события ОбработкаПроверкиЗаполнения в модуле объекта. Данный механизм автоматически вызывается при интерактивной записи и позволяет централизованно управлять проверками.

Рассмотрим, как реализовать проверку реквизита с выводом сообщения и отменой записи:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // Проверяем условие корректности реквизита
    Если Не РеквизитКорректен(Реквизит1) Тогда
        Отказ = Истина;
        
        // Формируем привязанное к полю сообщение об ошибке
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Значение реквизита заполнено некорректно!";
        Сообщение.Поле = "Объект.Реквизит1";
        Сообщение.УстановитьДанные(ЭтотОбъект);
        Сообщение.Сообщить();
    КонецЕсли;
    
КонецПроцедуры

Преимущества такого подхода:

  1. Подсветка поля: Платформа автоматически подсвечивает проблемный реквизит на форме красной рамкой и переводит на него фокус.
  2. Единая точка входа: Проверка срабатывает как при сохранении через кнопку на форме, так и при явном вызове метода ПроверитьЗаполнение().
  3. Гибкость: Можно исключать или добавлять реквизиты в массив ПроверяемыеРеквизиты динамически.

Способ 2. Отмена сохранения через событие «ПередЗаписью»

Если логика требует проверки не только заполненности, но и сложных условий сопоставления данных или блокировки записи на уровне транзакции, используют обработчики события ПередЗаписью.

Разберем два уровня валидации:

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

Управление модифицированностью формы и предотвращение нежелательных записей

Частая проблема при запрете записи — появление стандартного диалога платформы «Данные были изменены. Сохранить изменения?» при попытке закрыть форму с ошибочными данными. Если пользователь намеренно отказывается от сохранения некорректных значений, платформу необходимо уведомить об этом сбросом флага изменений.

Для этого используется свойство Модифицированность:


&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    
    // Если запись была отменена и сохранять ошибочные данные не требуется
    Если Не ДанныеКорректны() Тогда
        ЭтаФорма.Модифицированность = Ложь;
    КонецЕсли;
    
КонецПроцедуры

Проанализируем также ситуацию, когда при нажатии кнопки «Закрыть» происходит фоновая запись в регистры сведений:

  1. Проверьте события формы: Запись в регистры не должна вызываться в обработчиках ПередЗакрытием или ПриЗакрытии, если объект не был успешно сохранен.
  2. Проверьте подчиненные таблицы и регистры: Если на форме выведены динамические списки или наборы записей зависимых регистров, убедитесь, что для них отключено автосохранение текущей строки при потере фокуса.
  3. Откат изменений: При обнаружении неверного ввода в событии ПриИзменении элемента можно сразу восстановить старое значение из базы (Объект.Ссылка.Реквизит1) и сбросить свойство ЭтаФорма.Модифицированность = Ложь;, чтобы форма вернулась в чистое состояние.
← На главную