← Назад к вопросам

Обработчик ПередЗаписью с проверкой поля

1.0 Junior🔥 291 комментариев
#Объекты метаданных#Стандарты разработки

Условие

Реализуйте обработчик события "ПередЗаписью()" для документа с проверкой обязательного заполнения поля.

Требования:

  • Проверить заполненность реквизита "Контрагент"
  • Проверить, что сумма документа больше нуля
  • Проверить, что табличная часть не пустая
  • При ошибке — отменить запись и показать сообщение пользователю

Пример кода (структура)

Процедура ПередЗаписью(Отказ)
    // Проверка контрагента
    Если НЕ ЗначениеЗаполнено(Контрагент) Тогда
        Сообщить("Не заполнен контрагент!");
        Отказ = Истина;
    КонецЕсли;
    // Другие проверки...
КонецПроцедуры

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение: Обработчик ПередЗаписью с валидацией

Полная реализация

Процедура ПередЗаписью(Отказ)
    
    // Проверка обязательных реквизитов документа
    ПроверитьОбязательныеРеквизиты(Отказ);
    
    // Если уже есть ошибка, прерываем дальнейшие проверки
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    
    // Проверка табличной части
    ПроверитьТабличнуюЧасть(Отказ);
    
КонецПроцедуры

Процедура ПроверитьОбязательныеРеквизиты(Отказ)
    
    // Проверка заполненности контрагента
    Если НЕ ЗначениеЗаполнено(Контрагент) Тогда
        ОбщегоНазначения.СообщитьОбОшибке("Не заполнен реквизит \"Контрагент\"!");
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    
    // Проверка суммы документа (должна быть > 0)
    РассчитатьСумму();
    
    Если СуммаДокумента <= 0 Тогда
        ОбщегоНазначения.СообщитьОбОшибке(
            СтроковыеФункции.ПодставитьПараметрыСтроки(
                "Сумма документа должна быть больше нуля (текущее значение: %1)",
                СуммаДокумента
            )
        );
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    
КонецПроцедуры

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

Процедура РассчитатьСумму()
    
    СуммаДокумента = 0;
    
    Для каждого СтрокаТовара Из Товары Цикл
        СуммаДокумента = СуммаДокумента + СтрокаТовара.Сумма;
    КонецЦикла;
    
КонецПроцедуры

Ключевые моменты

Порядок проверок:

  • Проверяем обязательные реквизиты (контрагент)
  • Проверяем сумму документа
  • Проверяем табличную часть
  • На каждом шаге останавливаемся при ошибке

Правильное использование параметра Отказ:

  • Устанавливаем Отказ = Истина для отмены записи
  • Используем Возврат для прерывания выполнения процедуры
  • Все проверки выполняются перед записью в БД

Информативные сообщения об ошибках:

  • Используем ОбщегоНазначения.СообщитьОбОшибке() вместо Сообщить()
  • Указываем номер строки в ошибке табличной части
  • Показываем конкретное значение суммы при ошибке
Обработчик ПередЗаписью с проверкой поля | PrepBro