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

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

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

Понимание механизма проверки

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

Важно помнить, что проверка может выполняться в нескольких местах:

Для надежности реализации рекомендуем выполнять эту логику именно в модуле объекта, так как это гарантирует работу проверки не только при интерактивной записи, но и при программном проведении или записи документа.

Решение проблемы через удаление из массива

Основная ошибка при работе с этим массивом заключается в попытке удаления элемента без проверки его существования. Метод Удалить() требует индекс (число), а если передать туда Неопределено (когда реквизит не найден), система выдаст ошибку «Несоответствие типов». Давайте рассмотрим правильный подход к модификации массива.

Пошаговая реализация универсальной процедуры

Создадим процедуру, которая безопасно удаляет переданный список реквизитов из массива проверяемых. Это позволит избежать ошибок и сделает код легко читаемым.


Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт
    Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл
        // Ищем индекс реквизита в основном массиве
        ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива);
        // Удаляем только в том случае, если реквизит был найден
        Если ПорядковыйНомер <> Неопределено Тогда
            МассивРеквизитов.Удалить(ПорядковыйНомер);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Теперь эту логику мы можем вызвать в процедуре ОбработкаПроверкиЗаполнения вашего документа. Рассмотрим пример использования:


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

Как быть с табличными частями?

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

  1. Отключить свойство «Проверка заполнения» у самого реквизита в Конфигураторе (или исключить его через массив, как показано выше).
  2. Реализовать собственную проверку в цикле в процедуре ОбработкаПроверкиЗаполнения или ПередЗаписью.

Пример ручной проверки в цикле:


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

Основные выводы

Подводя итог нашей работы, выделим главные правила:

← На главную