Почему программная установка обязательности полей выгоднее ручной?
В 1С:Предприятие обязательные поля часто настраивают через конфигуратор — это быстро, но не всегда удобно. Представьте: вам нужно сделать обязательным поле «Дата оплаты» только для документов с суммой свыше 100 000 рублей, или скрыть обязательность поля «Контрагент» для определённой роли пользователей. Вручную такие условия не настроить — здесь на помощь приходит программное управление.
Программный подход даёт гибкость: вы можете динамически менять обязательность полей в зависимости от Условий, Ролей пользователей или даже Данных других полей. Например, в документе «Заказ покупателя» поле «Адрес доставки» станет обязательным только если выбран способ доставки «Курьер». Такие сценарии невозможно реализовать без кода.
Ещё один плюс — автоматизация проверок при обновлении конфигурации. Если обязательность поля задана программно, она не слетит при переносе изменений между базами или после обновления платформы. Это критично для крупных проектов, где ручные настройки легко потерять.
Способ 1: Использование свойства «Обязательность» в модуле формы
Самый распространённый метод — управление свойством Обязательность непосредственно в модуле формы. Подходит для большинства стандартных задач, где нужно сделать поле обязательным при открытии формы или при изменении других данных.
Пример кода для формы документа «Реализация товаров», где поле «Склад» должно быть обязательным, если сумма документа превышает 50 000 рублей:
Процедура ПриОткрытии()
Если Объект.СуммаДокумента > 50000 Тогда
ЭлементыФормы.Склад.Обязательность = Истина;
Иначе
ЭлементыФормы.Склад.Обязательность = Ложь;
КонецЕсли;
КонецПроцедуры
Важно: этот метод работает только для управляемых форм. Если вы используете обычные формы (устаревший формат), придётся применять другие подходы, например, обработку события ПередЗаписью.
- ✅ Простота реализации — достаточно 2-3 строк кода.
- 🔄 Динамическое изменение обязательности при изменении других полей.
- 📌 Работает только для управляемых форм (в обычных формах используйте
ПередЗаписью). - ⚠️ Не срабатывает, если поле скрыто через свойство
Видимость = Ложь.
Способ 2: Проверка в обработчике «ПередЗаписью»
Если нужно сделать поле обязательным только при записи (например, для валидации данных перед сохранением), используйте обработчик ПередЗаписью. Этот метод универсален и работает как для управляемых, так и для обычных форм.
Пример для документа «Поступление товаров», где поле «Поставщик» должно быть заполнено, если в табличной части есть хотя бы одна строка:
Процедура ПередЗаписью(Отказ, РежимЗаписи)
Если НЕ ЗначениеЗаполнено(Объект.Поставщик) И Объект.Товары.Количество() > 0 Тогда
Сообщить("Укажите поставщика!", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Преимущество этого способа — гарантированная проверка перед сохранением, даже если пользователь обошёл клиентские ограничения (например, через прямой ввод данных в базу). Однако есть и минус: пользователь узнает об ошибке только при попытке сохранить документ, а не сразу при вводе.
⚠️ Внимание: В обработчикеПередЗаписьюне используйтеПрерватьилиВызватьИсключение— это может привести к некорректному поведению формы. Всегда устанавливайтеОтказ = Истина.
Убедиться, что обработчик есть в модуле объекта (документа/справочника)|Проверить, что поле не скрыто от пользователя (иначе сообщение об ошибке будет непонятным)|Тестировать на пустых и заполненных данных|Добавить понятный текст ошибки для пользователя-->
Способ 3: Динамическая обязательность через условия (условное оформление)
Для сложных сценариев, где обязательность зависит от нескольких условий, удобно использовать условное оформление. Этот метод позволяет визуально выделять обязательные поля (например, красным цветом) и одновременно делать их обязательными для заполнения.
Пример для справочника «Контрагенты», где поле «ИНН» становится обязательным, если выбран тип «Юридическое лицо»:
Процедура ПриИзмененииТипаКонтрагента(Элемент)
Если Объект.ТипКонтрагента = Перечисление.ТипыКонтрагентов.ЮридическоеЛицо Тогда
ЭлементыФормы.ИНН.Обязательность = Истина;
ЭлементыФормы.ИНН.УсловноеОформление.ЦветФона = ВебЦвет.СветлоКрасный;
Иначе
ЭлементыФормы.ИНН.Обязательность = Ложь;
ЭлементыФормы.ИНН.УсловноеОформление.ЦветФона = Неопределено;
КонецЕсли;
КонецПроцедуры
| Способ | Подходит для | Плюсы | Минусы |
|---|---|---|---|
Свойство Обязательность |
Управляемые формы | Простота, динамическое изменение | Не работает в обычных формах |
ПередЗаписью |
Все типы форм | Гарантированная проверка перед сохранением | Ошибка обнаруживается только при записи |
| Условное оформление | Управляемые формы | Визуальное выделение + обязательность | Требует дополнительного кода для сброса стилей |
Для условного оформления можно использовать не только цвет фона, но и ЦветТекста, ШрифтНачертание (жирный/курсив) или даже Подсказку с пояснением, почему поле стало обязательным.
Способ 4: Обязательность через механизм ограничений (для платформы 8.3.14+)
Начиная с версии 1С:Предприятие 8.3.14, появился механизм ограничений на данные, который позволяет задавать обязательность полей на уровне метаданных. Это особенно удобно для регламентированных отчётов или документов с жёсткими правилами заполнения.
Пример ограничения для документа «Счёт-фактура», где поле «Номер» должно быть заполнено всегда:
Ограничение ОбязательноеПолеНомер По Номер
Условие
ЗначениеЗаполнено(Номер) = Ложь
Сообщение
"Номер счёта-фактуры должен быть заполнен!"
Серьезность
Ошибка
КонецОграничения
- 🔧 Работает на уровне данных, а не интерфейса — проверка срабатывает даже при программном изменении объекта.
- 📋 Поддерживает многострочные сообщения об ошибках с форматированием.
- 🚫 Не работает в версиях платформы ниже 8.3.14.
- ⚙️ Требует правки конфигурации (нельзя задать динамически в runtime).
⚠️ Внимание: Ограничения на данные могут замедлить работу системы, если их слишком много или они содержат сложные условия. Тестируйте производительность на больших объёмах данных.
Способ 5: Программная обязательность для реквизитов шапки и табличных частей
Если нужно сделать обязательным поле в шапке документа или строке табличной части, подходы немного отличаются. Для табличных частей часто используют обработчик ПриИзменении или ПередДобавлением.
Пример для табличной части «Товары» в документе «Реализация», где поле «Количество» должно быть заполнено:
Процедура ТоварыПередДобавлением(Элемент, НоваяСтрока, Копирование)
Если НЕ ЗначениеЗаполнено(НоваяСтрока.Количество) Тогда
Сообщить("Укажите количество товара!", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Для реквизитов шапки подойдёт любой из предыдущих методов, но важно учитывать последовательность событий. Например, если обязательность поля зависит от другого поля, проверку нужно размещать в обработчике ПриИзменении этого поля, а не в ПриОткрытии.
Что делать, если поле обязательно, но пользователь не видит его на форме?
Если поле скрыто через свойство Видимость = Ложь, но при этом обязательно для заполнения, 1С выдаст ошибку при записи, даже если пользователь физически не мог его заполнить. Чтобы избежать этого:
1. Проверяйте видимость поля перед установкой обязательности.
2. Используйте ЭлементыФормы.ИмяПоля.Видимость для динамического управления отображением.
3. В сообщении об ошибке уточняйте, где находится поле (например: "Заполните поле 'Адрес' в блоке 'Доставка'").
Типичные ошибки и как их избежать
Даже опытные разработчики 1С иногда сталкиваются с проблемами при настройке обязательных полей. Вот наиболее распространённые ошибки и способы их решения:
- Ошибка: Поле обязательно, но пользователь не видит его на форме.
Решение: Проверьте свойство
Видимостьи связку с ролями. ИспользуйтеЭлементыФормы.ИмяПоля.Видимость = Истинаперед установкой обязательности. - Ошибка: Обязательность срабатывает не вовремя (например, при открытии формы, а не при изменении данных).
Решение: Перенесите код в правильный обработчик:
ПриИзменениидля динамических проверок илиПередЗаписьюдля финальной валидации. - Ошибка: Сообщение об ошибке неинформативно (например, просто "Ошибка записи").
Решение: Всегда указывайте конкретное поле и условие, почему оно обязательно:
Сообщить("Для юридических лиц обязательно указать ИНН!", СтатусСообщения.Важное);
Ещё одна частая проблема — циклические зависимости, когда обязательность одного поля зависит от другого, а то, в свою очередь, от первого. В таких случаях используйте флаг-разделитель или выносите проверки в отдельную процедуру.
Если обязательность поля зависит от сложной логики (например, от данных из регистра сведений), вынесите проверку в отдельную функцию и кэшируйте результат. Это ускорит работу формы, особенно при большом количестве полей.
FAQ: Ответы на частые вопросы
Можно ли сделать поле обязательным только для определённой роли пользователей?
Да, для этого в обработчике проверки (например, ПередЗаписью) добавьте проверку роли:
Если НЕ ЗначениеЗаполнено(Объект.Контрагент) И Пользователь.РольНазначена("МенеджерПоПродажам") Тогда
Сообщить("Менеджеры должны указывать контрагента!");
Отказ = Истина;
КонецЕсли;
Альтернативно можно управлять видимостью и обязательностью поля через права доступа.
Как сделать обязательным поле в печатной форме?
Обязательность в печатных формах настраивается иначе — через макет и условное оформление. Если речь о проверке перед печатью, используйте обработчик ПередВыводом:
Процедура ПечатнаяФормаПередВыводом(Элемент, ДанныеДляВывода, СтандартнаяОбработка)
Если НЕ ЗначениеЗаполнено(Объект.ДатаДокумента) Тогда
Сообщить("Укажите дату документа перед печатью!");
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Почему обязательность не срабатывает в мобильном клиенте 1С?
В мобильном клиенте некоторые обработчики (например, ПриОткрытии) могут работать иначе. Проверьте:
- Используете ли вы управляемые формы (обычные формы в мобильном клиенте не поддерживаются).
- Не блокируются ли события из-за оптимизаций мобильной платформы (попробуйте использовать
ПередЗаписью). - Обновлена ли мобильная платформа до актуальной версии (в старых версиях были баги с обязательностью полей).
Как массово сделать поля обязательными для всех документов определенного типа?
Для массового изменения используйте обработку конфигурации или расширение. Пример кода для расширения, которое делает поле «Комментарий» обязательным во всех документах:
Для Каждого Документ Из Метаданные.Документы Цикл
Если НЕ Документ.Реквизиты.Найти("Комментарий") = Неопределено Тогда
Документ.Реквизиты.Комментарий.Обязательность = Истина;
КонецЕсли;
КонецЦикла;
Внимание: такой код нужно выполнять в Конфигураторе с правами администратора.
Можно ли отменить обязательность поля, заданную в конфигураторе, программно?
Да, программно можно переопределить обязательность, даже если она задана в метаданных. Например:
ЭлементыФормы.ПолеИзКонфигуратора.Обязательность = Ложь;
Однако это временное изменение — после переоткрытия формы или обновления конфигурации настройка из метаданных вернётся.
Для динамической обязательности полей в 1С используйте комбинацию методов: Обязательность в модуле формы для визуальных подсказок + ПередЗаписью для гарантированной проверки перед сохранением.