Как сделать реквизит необязательным к заполнению в 1С:Предприятие 8? Разбор интерактивных и программных методов

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

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

Шаг 1. Разбираемся в архитектуре: Элемент формы, Реквизит формы и Реквизит объекта

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

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

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

Шаг 2. Интерактивная настройка в Конфигураторе

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

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

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

Шаг 3. Визуальное оформление обязательности на форме

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

Шаг 4. Программное управление проверкой заполнения (Динамическая обязательность)

Часто в реальных задачах обязательность заполнения зависит от условий. Например, реквизит Договор должен быть обязательным только в том случае, если сумма сделки превышает определенный лимит, или поле ПричинаОтмены становится обязательным только при установке статуса «Отклонен».

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

Вариант А. Управление проверкой в модуле объекта

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

Проанализируем ситуацию, когда нам нужно программно исключить реквизит Статус из списка проверяемых (сделать его необязательным):


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

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


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

Вариант Б. Управление проверкой в модуле формы

Если мы работаем с реквизитами формы, не связанными с объектом базы данных, проверка настраивается в модуле формы в событии ОбработкаПроверкиЗаполненияНаСервере. Логика работы с массивом проверяемых реквизитов здесь абсолютно аналогична работе в модуле объекта.

Шаг 5. Тонкости поведения платформы: Интерактивная запись против программной

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

Если запись объекта выполняется программно из кода:


НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Заполнение реквизитов...
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);

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


НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Заполнение реквизитов...

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

Шаг 6. Как платформа понимает, что значение «не заполнено»?

При проверке заполнения система использует стандартную функцию платформы ЗначениеЗаполнено(). Значение считается пустым (незаполненным), если оно совпадает с дефолтным системным значением для своего типа данных:

Использование готовых механизмов БСП (Библиотеки Стандартных Подсистем)

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

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

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

← На главную