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

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

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

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

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

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

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

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

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

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

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

Когда обязательность зависит от условий, свойства метаданных недостаточно. Например, поле «Договор» обязательно только для операций с покупателями, а «Склад» — только когда в табличной части есть товары. Такие проверки размещают в обработчике ОбработкаПроверкиЗаполнения модуля объекта.

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

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

// Убираем стандартную проверку договора

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

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

ПроверяемыеРеквизиты,

ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("Договор"));

КонецЕсли;

// Собственная условная проверка

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

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

ОбщегоНазначения.СообщитьПользователю(

НСтр("ru = 'Поле ""Договор"" не заполнено'"),

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

КонецЕсли;

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

Обратите внимание на привязку сообщения: третий параметр СообщитьПользователю — объект, четвёртый — путь к данным. Благодаря этому сообщение подсвечивает проблемное поле на форме, а не просто выводится в панель сообщений. Если конфигурация без БСП, вместо ОбщегоНазначения.СообщитьПользователю используйте объект СообщениеПользователю напрямую.

Способ 3. ОтметкаНезаполненного на управляемой форме

Иногда требуется только визуально выделить поле как обязательное — с красной подчёркивающей линией — без жёсткой блокировки записи. Для этого у элементов формы есть свойства ОтметкаНезаполненного и АвтоОтметкаНезаполненного. Установить их можно в конфигураторе или программно в обработчике ПриСозданииНаСервере.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Элементы.Склад.ОтметкаНезаполненного = Истина;

Элементы.Склад.АвтоОтметкаНезаполненного = Ложь;

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

Свойство АвтоОтметкаНезаполненного управляет автоматикой: если оно включено, платформа сама показывает отметку, когда у реквизита задана проверка заполнения. Устанавливая его в Ложь и управляя ОтметкаНезаполненного вручную, вы получаете полный контроль — например, можете подсвечивать поле только при определённом состоянии документа.

Важно понимать ограничение: отметка на форме — это только подсказка пользователю. Она не блокирует запись и не работает при программном изменении объекта. Для реальной защиты данных комбинируйте её с проверкой в модуле объекта.

Сравнение способов

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

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

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

Условная обязательность и сложные правила. Защищает данные при любом способе записи, требует кода в модуле объекта.

ОтметкаНезаполненного на форме

Только визуальная подсказка. Гибко управляется, но не блокирует запись и не срабатывает при обменах.

Способ 4. Подписки на события и расширения

Если типовую конфигурацию нельзя изменять (режим полной поддержки, обновления от поставщика), проверки добавляют через подписку на событие ОбработкаПроверкиЗаполнения. В конфигураторе создаётся подписка, указывается источник (например, «ДокументОбъект.РеализацияТоваровУслуг») и общий модуль с обработчиком — логика внутри аналогична модулю объекта.

Более современный путь — расширение конфигурации. В расширении можно заимствовать модуль объекта и дописать обработчик с аннотацией &После("ОбработкаПроверкиЗаполнения"), либо создать подписку внутри расширения. Конфигурация при этом остаётся на поддержке и обновляется штатно.

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

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

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

&НаКлиенте

Процедура ВидОперацииПриИзменении(Элемент)

УстановитьВидимостьИОбязательность();

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

&НаСервере

Процедура УстановитьВидимостьИОбязательность()

ЭтоПродажа = (Объект.ВидОперации =

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

Элементы.Договор.ОтметкаНезаполненного = ЭтоПродажа;

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

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

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

Одна из распространённых ошибок — проверка только на форме. Разработчик ставит отметку незаполненного и проверяет поле в ПередЗаписью формы, но забывает, что документы создаются обменами, загрузками из Excel и внешними обработками. Итог — пустые значения в базе и сбои в отчётах. Правило простое: бизнес-контроль размещается в модуле объекта, форма лишь дублирует подсказку.

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

Отдельно отметим числовые поля: для них «пустое» значение — это ноль, и ЗначениеЗаполнено(0) вернёт Ложь. Если ноль — допустимое рабочее значение (например, нулевая ставка), жёсткая проверка заполнения окажется неуместной; используйте составной тип или отдельный признак.

Типичные ошибки
01
Проверка только на форме — обмены и внешние обработки записывают пустые данные
02
Сравнение с пустой строкой вместо ЗначениеЗаполнено() — ссылочные типы проверяются неверно
03
Жёсткая проверка числового поля — ноль трактуется как незаполненное значение
04
Сообщение без привязки к реквизиту — пользователь не видит, какое поле заполнить
05
Включение проверки без дозаполнения старых данных — документы перестают проводиться
Контрольные точки

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

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

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

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

Объект записывается или сообщение не указывает на поле

Программная запись из обработки или обмена
Норма

Проверка срабатывает и вне формы

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

Через обмен записываются пустые значения

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

При смене условия проверка включается и отключается корректно

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

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

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

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

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

Чем ОтметкаНезаполненного отличается от проверки заполнения?

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

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

В конфигураторе откройте табличную часть объекта, выделите нужный реквизит и установите «Проверка заполнения» — «Выдавать ошибку». Для условной проверки перебирайте строки табличной части в ОбработкаПроверкиЗаполнения и привязывайте сообщение к пути вида «Товары[Индекс].Номенклатура».

Почему проверка не срабатывает при обмене данными?

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

Как выдать предупреждение вместо ошибки?

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

Как проверить заполнение по условию из другого объекта?

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

Итог

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

Статическая обязательность задаётся свойством «Проверка заполнения», условная — обработчиком ОбработкаПроверкиЗаполнения в модуле объекта, а подсветка на форме — через ОтметкаНезаполненного. Реальный контроль данных всегда размещайте на уровне объекта, а не только формы.