Как реализовать обязательный выбор значения реквизита в документе, если тип Булево не подходит?

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

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

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

Почему тип Булево не подходит для обязательного заполнения

Главная техническая особенность Булево заключается в том, что оно не поддерживает значение Неопределено. Как только вы добавляете такой реквизит в документ, он инициализируется значением Ложь. В итоге, если пользователь забудет указать признак, документ по умолчанию будет считаться «не терморежимным». Чтобы избежать таких ошибок, рассмотрим альтернативные варианты реализации.

Решение 1: Использование перечисления (Рекомендуемый метод)

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

  1. Создайте Перечисление, например, с именем ТерморежимностьГруза.
  2. Добавьте в него значения: НеУказано, Требуется, НеТребуется.
  3. В свойствах документа установите реквизиту тип этого перечисления.
  4. В режиме 1С:Предприятие установите значение по умолчанию как НеУказано.

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


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

Решение 2: Использование числового реквизита

Если по каким-то причинам вы не хотите создавать новое перечисление, можно использовать числовой реквизит. Например, можно задать варианты выбора: 0 — не выбрано, 1 — требуется, 2 — не требуется. Однако этот метод считается менее профессиональным, так как он менее нагляден и сложнее поддерживается при усложнении логики.

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

Решение 3: Дополнительные реквизиты (БСП)

Если ваша конфигурация построена с использованием БСП (Библиотеки стандартных подсистем), вы можете воспользоваться механизмом ДополнительныеРеквизитыИСведения. Это позволит добавить признак без снятия конфигурации с поддержки.

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

Важные советы по оптимизации и архитектуре

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

Подводя итог, можно сказать, что использование Перечисления является «золотым стандартом». Оно обеспечивает строгую типизацию, легкую читаемость кода и возможность простого расширения логики, если в будущем бизнес-процесс усложнится.

← На главную