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