К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как программно сделать поле обязательным для заполнения в 1С

Способы программно сделать поле обязательным в 1С: свойство ПроверкаЗаполнения, ОбработкаПроверкиЗаполнения, условная обязательность, типичные ошибки и проверка результата.

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

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

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

Способ 1. Свойство «Проверка заполнения» у реквизита

Самый простой и надёжный вариант — установить свойство проверки заполнения непосредственно у реквизита в конфигураторе. Откройте объект (справочник, документ, план счетов и т.д.), выделите нужный реквизит и в палитре свойств найдите пункт «Проверка заполнения». Доступны значения: «Не проверять», «Выдавать ошибку», «Выдавать предупреждение».

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

Важно понимать границу применения: свойство задаётся статически и не может зависеть от других данных объекта. Если поле обязательно только в определённых условиях (например, «Договор обязателен, только если контрагент — юридическое лицо»), этого свойства недостаточно — нужна программная проверка.

Способ 2. Процедура ОбработкаПроверкиЗаполнения в модуле объекта

Когда обязательность зависит от условий или нужно вывести понятное сообщение с привязкой к конкретному полю, используется событие ОбработкаПроверкиЗаполнения в модуле объекта. Платформа вызывает его при записи, если у объекта включена проверка заполнения (по умолчанию включена).

Типовой пример для документа, где поле «Договор» обязательно только при определённом виде операции:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

// Условная обязательность: договор нужен только для операции "Продажа"

Если ВидОперации = Перечисления.ВидыОпераций.Продажа

И Не ЗначениеЗаполнено(Договор) Тогда

ТекстСообщения = НСтр("ru = 'Поле ""Договор"" не заполнено'");

ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ЭтотОбъект,

"Договор", "Объект", Отказ);

КонецЕсли;

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

Параметр Отказ, установленный в Истина, прерывает запись. Указание пути к данным ("Договор", "Объект") делает сообщение «кликабельным»: при двойном щелчке по ошибке курсор встанет на нужное поле формы. Если конфигурация не содержит БСП, вместо ОбщегоНазначения.СообщитьПользователю используйте объект СообщениеПользователю напрямую.

bsl
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Поле не заполнено";
Сообщение.Поле = "Договор";
Сообщение.ПутьКДанным = "Объект";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;

Как убрать стандартную проверку для отдельных реквизитов

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

ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(

ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);

Либо вручную найдите индекс элемента в массиве и удалите его методом Удалить(). Это стандартный приём при замене платформенной проверки собственной.

Способ 3. Обязательность только на форме

Иногда требование касается только конкретной формы: например, в упрощённой форме ввода одно поле обязательно, а в полной форме документа — нет. Тогда обязательность настраивается на уровне элемента формы, без изменения модели данных.

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

Программно на форме проверку делают в событии ОбработкаПроверкиЗаполненияНаСервере или перед записью:

&НаКлиенте

Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

Если Не ЗначениеЗаполнено(Объект.Комментарий) Тогда

ПоказатьПредупреждение(, "Заполните комментарий");

Отказ = Истина;

КонецЕсли;

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

Сравнение вариантов

Свойство «Проверка заполнения» реквизита

Подходит для безусловной обязательности. Работает при любом способе записи, не требует кода. Не поддерживает условия.

ОбработкаПроверкиЗаполнения в модуле объекта

Подходит для условной обязательности и сложных правил. Работает при любом способе записи. Требует кода и учёта обменов.

Проверка на форме

Подходит, когда требование относится к одной форме ввода. Не защищает данные при программной записи и обменах.

Как выбрать подходящий способ

Критерий выбора простой: ответьте на вопрос «должно ли правило действовать всегда, даже при загрузке данных извне?». Если да — реализуйте проверку на уровне объекта (свойство реквизита или модуль объекта). Если правило касается только удобства ввода в конкретной форме — ограничьтесь формой, чтобы не ломать интеграции.

Маршрут решения

Как выбрать действие

Поле обязательно всегда, без исключенийУстановите «Проверка заполнения» = «Выдавать ошибку» у реквизита в конфигураторе
Обязательность зависит от других полей или вида операцииРеализуйте проверку в ОбработкаПроверкиЗаполнения модуля объекта
Требование касается только одной формы вводаНастройте ОтметкуНезаполненного и проверку в событиях формы
Нужно только подсветить поле, но не блокировать записьИспользуйте «Выдавать предупреждение» или ОтметкуНезаполненного без установки Отказ

Проверка результата после внедрения

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

Контрольные точки

Как проверить результат

Запись с пустым полем
Норма

Запись отклонена, сообщение указывает на нужное поле

Тревожный признак

Объект записался или ошибка не привязана к полю

Запись с заполненным полем
Норма

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

Тревожный признак

Проверка срабатывает даже при заполненном значении

Обмен и программная запись
Норма

Интеграции работают как раньше

Тревожный признак

Обмены падают с ошибкой проверки заполнения

Условная обязательность
Норма

Проверка срабатывает только при заданном условии

Тревожный признак

Проверка требует поле всегда или никогда

Типичные ошибки и ограничения

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

Вторая ошибка — проверка только на клиенте в ПередЗаписью. Такой код легко обходится (например, при записи из списка документов без открытия формы) и не срабатывает при программной записи. Клиентская проверка — это удобство для пользователя, а не защита данных.

Типичные ошибки
01
{'name': 'Проверка только на форме', 'text': 'Правило не срабатывает при обмене, загрузке и программной записи — в базе появляются объекты с пустым полем'}
02
{'name': 'Включение проверки без анализа данных', 'text': 'Старые документы перестают перепроводиться, обмены падают с ошибкой'}
03
{'name': 'Дублирование проверок', 'text': 'Реквизит остался в массиве ПроверяемыеРеквизиты и проверяется вручную — пользователь видит два одинаковых сообщения'}
04
{'name': 'Отказ без сообщения', 'text': 'Установлен Отказ = Истина, но сообщение не выведено — пользователь не понимает, почему запись не проходит'}

Частые вопросы

Можно ли сделать поле обязательным без изменения конфигурации?

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

Почему проверка не срабатывает при программной записи объекта?

Проверьте, что запись выполняется методом Записать() с проверкой заполнения, а не через УстановитьСсылкуНового и прямое изменение без вызова стандартных механизмов. Также убедитесь, что у объекта не отключена проверка заполнения и что реквизит не удалён из массива ПроверяемыеРеквизиты в расширении или доработке.

Как сделать обязательным поле табличной части?

У реквизита табличной части также есть свойство «Проверка заполнения». Для условной проверки в ОбработкаПроверкиЗаполнения переберите строки табличной части в цикле и для каждой незаполненной выведите сообщение с путём вида "Объект.Товары[0].Номенклатура" — так ошибка привяжется к конкретной строке.

Чем «Выдавать предупреждение» отличается от «Выдавать ошибку»?

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

Как вывести сообщение об ошибке, если нет БСП?

Используйте объект СообщениеПользователю: создайте его через Новый, заполните свойства Текст, Поле, ПутьКДанным, вызовите УстановитьДанные(ЭтотОбъект) и Сообщить(), затем установите Отказ = Истина. Это работает в любой конфигурации без библиотек.

Итог

Что важно запомнить

Безусловную обязательность задаёт свойство «Проверка заполнения» реквизита, условную — процедура ОбработкаПроверкиЗаполнения в модуле объекта, а настройки формы подходят только для визуальных подсказок. Любую проверку на уровне объекта тестируйте на копии базы с учётом обменов и старых данных.