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