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

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

При разработке и доработке конфигураций в среде «1С:Предприятие» часто возникает задача изменить логику валидации данных. Например, в типовой конфигурации реквизит табличной части документа настроен как обязательный для заполнения, однако в рамках определенного бизнес-процесса или при конкретном виде операции заполнять его не требуется. Попытка изменить свойство метаданных напрямую из встроенного языка приводит к ошибке, так как дерево метаданных в режиме исполнения доступно только для чтения. Разберем, как правильно отключить стандартную проверку реквизита программным путем.

Ограничения платформы и принцип работы механизма проверки

Проанализируем, как платформа «1С:Предприятие» выполняет валидацию реквизитов. Свойство Проверка заполнения, установленное в конфигураторе для реквизита объекта или табличной части в значение Выдавать ошибку, инициирует автоматическое наполнение массива ПроверяемыеРеквизиты перед записью документа.

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

Где переопределять состав проверяемых реквизитов: модуль объекта или форма?

Выясним разницу между обработчиками валидации, так как от выбора места переопределения зависит надежность работы решения:

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

Пошаговое исключение реквизита табличной части из проверки

Рассмотрим порядок действий для удаления реквизита табличной части из стандартной проверки. Обратите внимание на синтаксис: реквизиты табличных частей в массиве ПроверяемыеРеквизиты регистрируются в виде составной строки формата "ИмяТабличнойЧасти.ИмяРеквизита".

Разберем пример реализации в модуле объекта документа:


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

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

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

Использование стандартных функций БСП

В типовых конфигурациях (таких как «1С:Бухгалтерия предприятия 3.0», «1С:ERP», «1С:Управление торговлей») присутствует библиотека стандартных подсистем (БСП). Для безопасного и компактного удаления реквизитов из проверки можно использовать готовые методы общих модулей:


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

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

Реализация условной проверки строк табличной части

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

Разберем пример условной валидации с выводом понятного сообщения пользователю:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // Отключаем стандартную проверку платформы
    ОбщегоНазначенияКлиентСервер.УдалитьИзМассива(ПроверяемыеРеквизиты, "Товары.Номенклатура");
    
    // Выполняем выборочную проверку строк
    Для Каждого СтрокаТЧ Из Товары Цикл
        
        Если СтрокаТЧ.Услуга = Ложь И Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
            
            Отказ = Истина;
            
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Для материальных ценностей поле ""Номенклатура"" обязательно к заполнению.";
            Сообщение.Поле = "Товары[" + Формат(Товары.Индекс(СтрокаТЧ), "ЧГ=0") + "].Номенклатура";
            Сообщение.УстановитьДанные(ЭтотОбъект);
            Сообщение.Сообщить();
            
        КонецЕсли;
        
    КонецЦикла;

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

Управление визуальным отображением на форме

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Отключение визуального выделения незаполненного поля в табличной части
    Элементы.ТоварыСчетУчета.АвтоОтметкаНезаполненного = Ложь;
    Элементы.ТоварыСчетУчета.ОтметкаНезаполненного = Ложь;

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

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

← На главную