Как программно отключить проверку заполнения реквизитов при записи или проведении документа в 1С?

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

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

Основной механизм: ОбработкаПроверкиЗаполнения

Для гибкого управления проверками в модуле объекта существует стандартный обработчик ОбработкаПроверкиЗаполнения. Разберем по шагам, как он работает. Когда срабатывает проверка, платформа формирует массив ПроверяемыеРеквизиты, в который помещает имена всех реквизитов (их полный список можно увидеть через информер по метаданным), у которых в метаданных стоит пометка об обязательности. Если мы удалим элемент из этого массива, платформа "забудет", что его нужно проверять.

Проанализируем пример кода, который позволяет исключить проверку конкретного реквизита:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // Определим индекс реквизита в массиве
    ПорядковыйНомер = ПроверяемыеРеквизиты.Найти("Организация");
    
    // Если реквизит найден — удаляем его из проверки
    Если ПорядковыйНомер <> Неопределено Тогда
        ПроверяемыеРеквизиты.Удалить(ПорядковыйНомер);
    КонецЕсли;

КонецПроцедуры

Передача условий через ДополнительныеСвойства

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

Рассмотрим ситуацию: на форме документа мы программно инициируем запись и хотим пропустить проверку. Сначала подготовим объект в модуле формы:


// Код в модуле формы
&НаСервере
Процедура ЗаписатьБезПроверкиНаСервере()
    ОбъектДокумент = РеквизитФормыВЗначение("Объект");
    ОбъектДокумент.ДополнительныеСвойства.Вставить("ПропуститьПроверку", Истина);
    ОбъектДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецПроцедуры

Теперь в модуле объекта мы можем прочитать этот флаг и принять решение об очистке массива проверок:


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

КонецПроцедуры

Особенности проверки табличных частей

Если нам нужно отключить проверку реквизита, находящегося внутри табличной части, важно соблюдать синтаксис обращения. Имя реквизита в массиве ПроверяемыеРеквизиты для табличной части строится по принципу: ИмяТабличнойЧасти.ИмяРеквизита. Посмотрим на пример для табличной части Товары и реквизита Количество:


Индекс = ПроверяемыеРеквизиты.Найти("Товары.Количество");
Если Индекс <> Неопределено Тогда
    ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;

Важный нюанс: Если вы хотите отключить проверку всей табличной части целиком (когда платформа ругается на отсутствие строк в таблице), то в массив нужно искать просто строку с именем этой таблицы, например, ПроверяемыеРеквизиты.Найти("Товары").

Альтернативный способ: Параметр метода Записать

Существует способ полностью обойти вызов события ОбработкаПроверкиЗаполнения при программной работе с документом. У метода Записать() есть второй параметр ПроверитьЗаполнение. Если установить его в значение Ложь, система проигнорирует любые настройки метаданных.

Разберем пример:


// Объект документа будет записан без каких-либо проверок заполнения
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись, Ложь);

Однако помните, что этот метод работает только при программном вызове. Если пользователь нажмет кнопку "Провести" в интерфейсе, платформа все равно инициирует стандартный цикл проверок.

Режим обмена данными

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

Подведем итоги

Мы рассмотрели несколько способов управления проверками:

  1. Удаление конкретных элементов из массива ПроверяемыеРеквизиты в модуле объекта.
  2. Использование ДополнительныеСвойства для передачи контекста из формы в модуль.
  3. Правильное обращение к реквизитам табличных частей через точку.
  4. Использование параметра Ложь в методе Записать() для полного подавления проверок.

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

← На главную