Как установить или убрать обязательное заполнение реквизита на форме 1С?

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

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

Различие между проверкой на уровне объекта и на уровне формы

Прежде всего, проанализируем, где именно хранится настройка обязательности. В 1С существует иерархия проверок, и важно понимать, на каком уровне происходит контроль:

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

Визуальная индикация: свойство АвтоОтметкаНезаполненного

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

Чтобы включить или выключить визуальную отметку, мы можем обратиться к коллекции элементов формы. Например, в процедуре ПриСозданииНаСервере или при изменении другого поля:


// Включаем подчеркивание
Элементы.ИмяВашегоРеквизита.АвтоОтметкаНезаполненного = Истина;

// Выключаем подчеркивание
Элементы.ИмяВашегоРеквизита.АвтоОтметкаНезаполненного = Ложь;

Помните, что само по себе изменение этого свойства не влияет на массив ПроверяемыеРеквизиты. Если платформа настроена на проверку этого поля в метаданных, красная линия исчезнет, но при записи все равно возникнет ошибка «Поле не заполнено».

Программное управление проверкой через событие ОбработкаПроверкиЗаполнения

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

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

Пример 1: Как убрать обязательность реквизита, установленную в метаданных

Допустим, в конфигурации реквизит Контрагент является обязательным, но для определенной роли пользователей или при определенном условии мы хотим разрешить запись без него. В модуле объекта или модуля формы пишем следующий код:


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

Пример 2: Как сделать реквизит формы обязательным программно

Если у нас есть реквизит формы (не объекта), который должен проверяться только при определенных обстоятельствах, мы добавляем его в этот же массив:


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

Свойство «Проверка заполнения» у команд (кнопок)

Проанализируем еще один неочевидный момент. Бывает, что проверка срабатывает только при нажатии на конкретную кнопку, например «Провести и закрыть», но не срабатывает при нажатии на «Записать». Выясним причину этого поведения.

У каждой команды (кнопки) на форме есть свойство Проверка заполнения. Оно может принимать значения:

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

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

Нужно учитывать специфику типов данных. Для платформы 1С значение 0 (для чисел) или Ложь (для Булево) часто считается «заполненным» значением. Поэтому стандартная настройка «Выдавать ошибку» в метаданных для них может не работать так, как вы ожидаете.

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


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

Итоги: алгоритм поиска причины проверки

Если вам нужно убрать или добавить проверку, пройдите по следующим шагам:

  1. Проверьте свойство «Проверка заполнения» в метаданных самого реквизита (в дереве конфигурации).
  2. Посмотрите свойство «АвтоОтметкаНезаполненного» у элемента на форме — возможно, это просто визуальный эффект.
  3. Проанализируйте модуль формы и модуль объекта на наличие процедуры «ОбработкаПроверкиЗаполнения». Используйте глобальный поиск (Ctrl+Shift+F) по имени реквизита, чтобы найти, где он добавляется в массив или где происходит ручная проверка.
  4. В типовых конфигурациях (например, ERP, УТ 11, БП 3.0) проверка может быть вынесена в общие модули. Ищите вызовы типа ОбщегоНазначения.ПроверитьЗаполнениеРеквизитовОбъекта.

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

← На главную