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