Разработка и Конфигурация · 12 мин
Как в 1С сделать поля обязательными для заполнения
Как в 1С сделать поля обязательными: настройка проверки заполнения в конфигураторе, обработчики событий, код проверки, типовые механизмы и частые ошибки.
Контроль заполнения реквизитов — одна из базовых задач при настройке 1С. Если пользователи могут сохранить документ без номенклатуры, контрагента или договора, в учёте появляются «пустые» записи, отчёты искажаются, а обмены с другими системами завершаются ошибками. Платформа 1С:Предприятие предлагает несколько уровней решения: от простого свойства «Проверка заполнения» в конфигураторе до программных проверок в обработчиках событий.
Выбор способа зависит от того, есть ли у вас доступ к конфигуратору, типовая это конфигурация или самописная, и нужно ли проверять реквизит всегда или только при определённых условиях. Простое обязательное поле делается без единой строки кода, а сложная логика «обязательно, если выбран такой-то вид операции» реализуется в модуле объекта. Ниже разобраны все рабочие варианты с конкретными действиями.
Перед любыми изменениями конфигурации сделайте резервную копию информационной базы. Даже безобидное изменение свойства реквизита требует обновления конфигурации базы данных, а на рабочей базе это выполняется при отсутствии активных сеансов пользователей.
Какие способы сделать поле обязательным существуют в 1С
Платформа 1С:Предприятие 8.3 даёт четыре практических механизма контроля заполнения. Первый — свойство реквизита «Проверка заполнения», которое задаётся в конфигураторе и работает полностью автоматически. Второй — обработчик события «ОбработкаПроверкиЗаполнения» в модуле объекта, где проверку можно описать кодом с любыми условиями. Третий — контроль на уровне формы через обработчики и оформление, который влияет только на интерактивный ввод. Четвёртый — типовые механизмы конфигураций, например настройки обязательности в отдельных прикладных объектах.
Принципиальная разница между ними — надёжность. Свойство реквизита и обработчик в модуле объекта срабатывают при любой записи: из формы, из обработки загрузки, из обмена данными, из внешнего кода. Проверка на форме легко обходится программной записью, поэтому как единственная защита она не подходит. Если данные в базу могут попадать не только руками пользователя, опирайтесь на проверки уровня объекта.
Сравнение вариантов
Подходит для безусловно обязательных реквизитов. Не требует кода, но нужен доступ к конфигуратору и изменение конфигурации.
Подходит для условной обязательности и сложных правил. Требует написания кода и изменения конфигурации.
Подходит как визуальная подсказка пользователю. Не защищает от программной записи, использовать только как дополнение.
Подходят, когда нельзя менять конфигурацию. Возможности ограничены тем, что предусмотрел разработчик.
Настройка свойства «Проверка заполнения» в конфигураторе
Это основной и рекомендуемый способ для реквизитов, которые должны быть заполнены всегда. Откройте конфигуратор, найдите нужный объект (справочник, документ, регистр) в дереве конфигурации и раскройте ветку «Реквизиты». Вызовите палитру свойств реквизита (правый клик — «Свойства») и найдите свойство «Проверка заполнения».
У свойства есть несколько значений. «Не проверять» — контроль отключён. «Выдавать ошибку» — при попытке записи с пустым значением платформа выведет сообщение и не даст сохранить объект. «Выдавать предупреждение» — запись разрешена, но пользователь увидит предупреждение; этот вариант подходит для желательных, но не критичных полей. Значение «Выдавать ошибку» — то, что нужно для строго обязательного поля.
После изменения свойства сохраните конфигурацию и выполните обновление конфигурации базы данных (клавиша F7 или меню «Конфигурация — Обновить конфигурацию базы данных»). Проверьте результат: откройте объект в режиме предприятия, оставьте поле пустым и попробуйте записать — должно появиться сообщение о незаполненном реквизите с указанием поля на форме.
- 1Сделайте резервную копию информационной базы
- 2Откройте конфигуратор и найдите нужный объект в дереве конфигурации
- 3Откройте свойства реквизита и установите «Проверка заполнения» = «Выдавать ошибку»
- 4Сохраните конфигурацию и обновите конфигурацию базы данных
- 5Проверьте в режиме предприятия: запись с пустым полем должна блокироваться с понятным сообщением
Условная обязательность через обработчик ОбработкаПроверкиЗаполнения
Свойство «Проверка заполнения» не умеет учитывать контекст: оно либо требует значение всегда, либо никогда. На практике часто нужно другое — например, поле «Договор» обязательно только для документов с определённым видом операции, а поле «Склад» — только если не выбрана схема дропшиппинга. Такие правила описываются кодом.
В модуле объекта (для документа или справочника) создайте обработчик ОбработкаПроверкиЗаполнения. Внутри него доступен параметр Отказ — установка его в Истина запрещает запись. Сообщение пользователю выводится через объект СообщениеПользователю с привязкой к конкретному полю формы, чтобы программа подсветила проблемный реквизит.
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидОперации = Перечисления.ВидыОпераций.Продажа Тогда
Если Не ЗначениеЗаполнено(Договор) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не заполнен реквизит ""Договор""";
Сообщение.Поле = "Договор";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Обратите внимание на параметр ПроверяемыеРеквизиты — это массив имён реквизитов, которые платформа проверит автоматически по свойству «Проверка заполнения». Если ваша условная логика конфликтует со стандартной проверкой, можно удалить имя реквизита из массива и контролировать его только кодом. Это типовой приём в конфигурациях на БСП.
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Договор"));Обязательные поля в табличных частях и на форме
Реквизиты табличных частей (например, «Количество» или «Цена» в таблице «Товары») настраиваются тем же свойством «Проверка заполнения» — оно задаётся отдельно для каждой колонки в ветке «Табличные части» объекта. При записи документа платформа проверит каждую строку и укажет номер строки с ошибкой. Для условной проверки строк код в ОбработкаПроверкиЗаполнения пишется с перебором табличной части в цикле.
Отдельная ситуация — визуальная подсветка обязательных полей на форме. В управляемых формах у элемента формы есть свойство «АвтоотметкаНезаполненного»: если оно включено, платформа автоматически подчёркивает красным поля, связанные с реквизитами, у которых задана проверка заполнения. Включать отметку вручную через свойство «ОтметкаНезаполненного» без реальной проверки не стоит — пользователь увидит красное подчёркивание, но система позволит записать пустое значение, что создаёт ложное ощущение контроля.
Если нужно проверять заполнение только при интерактивной работе (например, подсказать менеджеру, но не ломать обмен данными), используйте обработчик формы «ОбработкаПроверкиЗаполненияНаСервере» или клиентскую проверку перед записью. Помните: такая проверка не сработает при программной записи объекта.
Что делать, если конфигурация типовая и на поддержке
Изменение свойств реквизитов и модулей типовой конфигурации требует включения возможности изменения и частичного снятия объектов с поддержки. Это осложняет будущие обновления: при обновлении конфигурации изменённые объекты могут потребовать ручного сравнения и объединения. Поэтому перед доработкой оцените, нельзя ли решить задачу штатными средствами.
В типовых конфигурациях (например, «1С:Бухгалтерия», «1С:Управление торговлей») часть обязательности уже задана разработчиком и меняется настройками: функциональные опции, настройки видов документов, параметры учётной политики. Проверьте разделы администрирования — иногда нужное поведение включается флажком. Для расширения возможностей без изменения основной конфигурации используйте механизм расширений: в расширении можно переопределить обработчик ОбработкаПроверкиЗаполнения через аннотацию &После или &Вместо и добавить свою проверку, не трогая типовой код.
Расширение — предпочтительный путь для обязательных полей в типовых решениях: оно не нарушает поддержку, обновления проходят штатно, а ваша логика сохраняется. Ограничение — в расширении нельзя изменить свойство «Проверка заполнения» существующего реквизита напрямую, поэтому проверку реализуют кодом в заимствованном обработчике.
Как выбрать действие
Проверка результата и типичные ошибки
После настройки проверьте механизм во всех сценариях записи: интерактивное создание объекта, копирование существующего, проведение документа, групповая обработка и, если используется, обмен данными. Убедитесь, что сообщение об ошибке понятно пользователю и курсор встаёт на проблемное поле. Проверьте также обратную ситуацию: корректно заполненный объект должен записываться без лишних сообщений.
Частая ошибка — забыть про уже существующие данные. Если в базе есть документы с пустым реквизитом, после включения проверки их нельзя будет перепровести или отредактировать без заполнения поля. Перед включением строгой проверки выполните обработку заполнения исторических данных или хотя бы оцените их объём запросом. Вторая типичная ошибка — проверка только на форме: объект записывается пустым через обмен, и контроль оказывается иллюзорным.
Третья распространённая проблема — конфликт собственного кода со стандартной проверкой: реквизит есть в массиве ПроверяемыеРеквизиты, и платформа выдаёт свою ошибку до того, как отработала ваша условная логика. Решение — удалить имя реквизита из массива в начале обработчика. И наконец, не делайте обязательными поля, которые система заполняет автоматически позже (например, при проведении): пользователь не сможет сохранить объект до момента, когда значение появится само.
FAQ
Можно ли сделать поле обязательным без доступа к конфигуратору?
Штатного универсального способа нет: обязательность реквизита — это свойство метаданных. Без конфигуратора можно использовать только те настройки, которые предусмотрела конкретная типовая конфигурация (функциональные опции, настройки видов объектов), либо попросить администратора добавить расширение конфигурации — это не требует снятия с поддержки.
Почему после включения проверки старые документы не перепроводятся?
Проверка заполнения срабатывает при любой записи объекта, включая перепроведение старых документов. Если в них обязательное поле пустое, запись блокируется. Решение — заранее заполнить реквизит в исторических данных групповой обработкой или временно использовать вариант «Выдавать предупреждение».
Как сделать обязательной колонку табличной части, например «Серию» только для серийных товаров?
Свойство «Проверка заполнения» работает для колонки в целом и условий не учитывает. Для условной обязательности в строках переберите табличную часть в обработчике ОбработкаПроверкиЗаполнения и для каждой строки проверьте условие (например, признак ведения учёта по сериям у номенклатуры), выводя сообщение с указанием номера строки.
Чем отличается «Выдавать ошибку» от «Выдавать предупреждение»?
«Выдавать ошибку» полностью блокирует запись объекта с пустым реквизитом. «Выдавать предупреждение» показывает сообщение, но позволяет сохранить объект. Второй вариант подходит для полей, заполнение которых желательно, но не критично для учёта.
Будет ли работать проверка при обмене данными между базами?
Свойство «Проверка заполнения» и обработчик в модуле объекта срабатывают при любой записи, включая загрузку через обмены. Однако в некоторых механизмах обмена проверка может быть намеренно отключена параметрами загрузки — это зависит от настроек конкретного обмена, и такой сценарий стоит протестировать отдельно.
Как подсветить обязательное поле красным на форме?
Если у реквизита задана проверка заполнения, включите у элемента формы свойство «АвтоотметкаНезаполненного» — платформа сама подчеркнёт пустое поле. Ручная установка «ОтметкаНезаполненного» без реальной проверки даёт только визуальный эффект и не блокирует запись.
Что важно запомнить
Обязательное поле в 1С надёжнее всего делается свойством «Проверка заполнения» = «Выдавать ошибку» или кодом в ОбработкаПроверкиЗаполнения — эти механизмы работают при любом способе записи. Для типовых конфигураций используйте расширения, а перед включением строгой проверки заполните исторические данные.