Как запретить проведение документа 1С, если не заполнен платежный календарь?

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

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

Анализ проблемы: почему текущий код блокирует всё?

Когда мы используем метод &После("ПередЗаписью"), наш код выполняется при любой попытке записи документа. Это включает в себя не только интерактивное нажатие кнопки «Провести», но и автоматическое обновление, пометку на удаление или распроведение. Если в коде просто вызвать ВызватьИсключение, система прервет любую операцию, даже ту, которая не требует заполнения платежного календаря. Это создает серьезные неудобства для пользователей.

Шаг 1: Ограничение области действия проверки

Первым делом нам необходимо убедиться, что наша логика срабатывает только тогда, когда пользователь осознанно пытается провести документ. В 1С для этого используется параметр РежимЗаписи. Нам нужно добавить проверку на соответствие РежимЗаписиДокумента.Проведение.

Рассмотрим, как правильно изменить условие в вашей процедуре:


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

Шаг 2: Правильная работа с параметром Отказ

Важно помнить, что процедура ПередЗаписью вызывается системой и может быть вызвана другими механизмами проверки. Если до выполнения вашего кода система уже установила Отказ = Истина (например, из-за ошибки в другом расширении или типовом модуле), ваш код не должен игнорировать этот факт.

Рекомендуется всегда начинать проверку с анализа статуса отказа:


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

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

Шаг 3: Почему лучше избегать ВызватьИсключение

Использование ВызватьИсключение вызывает прерывание транзакции с системной ошибкой. В 1С такой подход считается «грязным», так как он не дает пользователю возможности корректно обработать ситуацию и может привести к зависанию сеанса в случае ошибок в коде. Использование комбинации Отказ = Истина и Сообщить() является стандартом для таких задач.

Рекомендация: использование ОбработкиПроверкиЗаполнения

Если вы хотите сделать работу пользователя более удобной, рассмотрите перенос проверки из ПередЗаписью в ОбработкаПроверкиЗаполнения. Этот механизм позволяет:

  1. Подсветить поле, которое не заполнено (если мы добавим его в список проверяемых реквизитов).
  2. Вывести штатное сообщение 1С, которое пользователь точно не пропустит.
  3. Интегрироваться в стандартный интерфейс проверки документов.

При использовании этого метода вы можете программно добавлять поля в ПроверяемыеРеквизиты. Таким образом, платформа сама позаботится о том, чтобы документ не был записан, пока пользователь не заполнит необходимые данные, а вам не придется вручную управлять параметром Отказ во всех режимах записи.

Помните, что чистота кода и предсказуемость поведения системы — залог долгой и стабильной работы вашей конфигурации. Используйте предложенные методы, чтобы сделать ваше расширение профессиональным и удобным для конечного пользователя!

← На главную