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