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

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

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

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

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

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

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

Как работает механизм проверки заполнения в платформе

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

Проверка срабатывает в двух местах: интерактивно — при записи из формы, и программно — при вызове метода Записать(). При этом разработчик может сам инициировать проверку методом ПроверитьЗаполнение(), который возвращает Истина или Ложь. Именно этот метод неявно вызывается платформой внутри Записать().

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

Способ 1: полное отключение через параметр СтандартнаяОбработка

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

Пример для модуля объекта, когда проверку нужно снять полностью:

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

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

ПроверяемыеРеквизиты.Очистить();

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

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

Способ 2: точечное исключение отдельных реквизитов

Более безопасный подход — удалить из массива ПроверяемыеРеквизиты только те поля, которые не должны контролироваться в вашем сценарии. Остальные реквизиты продолжат проверяться штатно.

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

// При загрузке из обмена не требуем заполнения реквизита "Договор"

Если ОбменДанными.Загрузка Тогда

Индекс = ПроверяемыеРеквизиты.Найти("Договор");

Если Индекс <> Неопределено Тогда

ПроверяемыеРеквизиты.Удалить(Индекс);

КонецЕсли;

КонецЕсли;

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

Обратите внимание на типичную пару приёмов: поиск элемента через Найти() с проверкой на Неопределено (ревизит может отсутствовать в массиве, и тогда Удалить() вызовет ошибку) и обрамление условием ОбменДанными.Загрузка. Это стандартный признак того, что объект записывается механизмом обмена, и ослабление контроля применяется только в нём.

Для табличных частей в массиве указывается имя табличной части целиком (например, "Товары"), а не отдельной её колонки. Если нужно контролировать колонку выборочно, табличную часть исключают из массива и проверяют её строки вручную в этом же обработчике, добавляя сообщения через ОбщегоНазначения.СообщитьПользователю() или прямое присвоение Отказ = Истина.

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

Способ 3: запись в режиме ОбменДанными.Загрузка

Если задача — записать объект программно, минуя все проверки и бизнес-логику, используют свойство ОбменДанными.Загрузка = Истина перед вызовом Записать(). В этом режиме платформа пропускает большинство контрольных механизмов, включая проверку заполнения.

ДокОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

ДокОбъект.Дата = ТекущаяДатаСеанса();

// ... частичное заполнение

ДокОбъект.ОбменДанными.Загрузка = Истина;

ДокОбъект.Записать();

Этот режим предназначен для загрузки данных при обменах и миграциях. Он отключает не только проверку заполнения, но и многие обработчики записи, подписки на события и контроль итогов. Использовать его для обычной прикладной записи — ошибка: можно получить объект, который прошёл мимо всех проверок целостности и «развалил» связанные данные.

Сравнение вариантов отключения проверки

Очистка ПроверяемыеРеквизиты

Полное отключение для объекта. Подходит для служебных объектов; опасна для пользовательских документов

Удаление отдельных реквизитов

Точечное ослабление под конкретный сценарий. Рекомендуемый вариант в большинстве случаев

ОбменДанными.Загрузка = Истина

Обход всех проверок при программной записи. Только для обменов и миграций, не для штатной логики

Смена свойства в метаданных

Установка 'Не проверять' у реквизита в конфигураторе. Требует изменения конфигурации и снятия с поддержки

Отключение проверки в управляемой форме и расширении

В управляемой форме есть собственный обработчик ОбработкаПроверкиЗаполненияНаСервере (и клиент-серверный вариант), который срабатывает при записи из формы до обработчика объекта. Здесь доступен параметр СтандартнаяОбработка: установив его в Ложь, вы отключите стандартную проверку только для интерактивной записи через эту форму, не затрагивая программные записи из других мест.

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

&После("ОбработкаПроверкиЗаполнения")

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

Если ПользователиИнформационнойБазы.ТекущийПользователь().Имя = "Загрузчик" Тогда

ПроверяемыеРеквизиты.Очистить();

КонецЕсли;

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

Проверка результата и типичные ошибки

После внесения изменений проверьте оба сценария: объект должен записываться в целевом случае (например, при обмене) и по-прежнему блокироваться с понятным сообщением при ручном вводе с пустыми обязательными полями. Быстрая проверка — создать документ интерактивно, оставить реквизит пустым и нажать «Записать»: если условие в обработчике написано верно, появится стандартное сообщение о незаполненном поле.

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

Типичные ошибки
01
Удаление реквизита из массива без проверки Найти() — ошибка 'Индекс находится за границами массива', если реквизита в списке нет
02
Установка СтандартнаяОбработка = Ложь в модуле объекта — там такого параметра нет, это работает только в модуле формы
03
Использование ОбменДанными.Загрузка для обычной записи — отключаются подписки и контроль итогов, данные становятся неконсистентными
04
Отключение проверки безусловно — пользователи теряют защиту от пустых полей при ручном вводе
05
Правка типового модуля вместо расширения — изменения теряются при обновлении конфигурации
Контрольные точки

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

Запись в целевом сценарии (обмен, служебная обработка)
Норма

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

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

Сообщение о незаполненном реквизите появляется — условие в обработчике не сработало

Интерактивная запись с пустым реквизитом
Норма

Платформа выдаёт стандартное сообщение и блокирует запись

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

Объект записывается пустым — отключение применено слишком широко

Проведение документа после записи
Норма

Документ проводится, движения корректны

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

Ошибки проведения из-за пустых реквизитов — нужна своя проверка в обработчике

FAQ

Можно ли отключить проверку заполнения только для одного пользователя?

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

Чем отличается ПроверитьЗаполнение() от обработчика ОбработкаПроверкиЗаполнения?

ПроверитьЗаполнение() — метод, который программно запускает проверку и возвращает Истина или Ложь; его вызывает и сама платформа внутри Записать(). ОбработкаПроверкиЗаполнения — событие, которое срабатывает внутри этой проверки и позволяет изменить список контролируемых реквизитов или отменить запись через Отказ.

Почему после очистки ПроверяемыеРеквизиты проверка всё равно срабатывает?

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

Работает ли ОбменДанными.Загрузка для проведения документа?

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

Можно ли отключить проверку без изменения кода вообще?

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

Итог

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

Программно проверку заполнения убирают в обработчике ОбработкаПроверкиЗаполнения: очисткой или редактированием массива ПроверяемыеРеквизиты в модуле объекта, либо через СтандартнаяОбработка = Ложь в модуле формы. Применяйте отключение под условием, для типовых конфигураций используйте расширение, а режим ОбменДанными.Загрузка оставьте для обменов и миграций.