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

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

Как проверить заполнение реквизита в 1С 8

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

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

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

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

Штатная проверка через свойство «Проверять заполнение»

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

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

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

Программная проверка через ЗначениеЗаполнено()

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

Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда

Сообщить("Не заполнен контрагент в документе!");

Возврат;

КонецЕсли;

Функция корректно работает со всеми примитивными типами и ссылками. Для строки она вернёт Ложь, если строка пустая, но учтите: строка из одних пробелов считается заполненной. Если нужно отсечь и такой вариант, предварительно примените СокрЛП():

Если НЕ ЗначениеЗаполнено(СокрЛП(Объект.Комментарий)) Тогда

// строка пустая или состоит из пробелов

КонецЕсли;

Для вывода сообщения пользователю с привязкой к полю формы вместо Сообщить() лучше использовать объект СообщениеПользователю — тогда сообщение подсветит конкретный реквизит на форме, а не просто попадёт в панель сообщений.

Метод ПроверитьЗаполнение() и обработчик ОбработкаПроверкиЗаполнения

Метод ПроверитьЗаполнение() программно запускает штатную проверку объекта: он возвращает Истина, если все реквизиты с включённой проверкой заполнены и пользовательские проверки пройдены. Это удобно, когда объект нужно проверить до записи — например, при проверке данных, полученных из файла или веб-сервиса.

Если НЕ НовыйДокумент.ПроверитьЗаполнение() Тогда

// есть незаполненные обязательные реквизиты

Возврат;

КонецЕсли;

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

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

Если ВидОперации = Перечисления.ВидыОпераций.ВнутреннееПеремещение Тогда

// договор не обязателен — убираем из проверки

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

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

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

КонецЕсли;

КонецЕсли;

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

Порядок внедрения условной проверки
  1. 1
    Определите, при каких условиях реквизит обязателен или наоборот не нужен
  2. 2
    Откройте модуль объекта и добавьте обработчик ОбработкаПроверкиЗаполнения
  3. 3
    Скорректируйте массив ПроверяемыеРеквизиты или добавьте свою проверку с Отказ = Истина
  4. 4
    Протестируйте запись объекта во всех режимах: интерактивно, программно, при проведении
  5. 5
    Проверьте, что сообщения об ошибках понятны пользователю и указывают на нужное поле

Проверка заполнения в запросе

Когда нужно найти объекты с незаполненным реквизитом в большой выборке, проверку выполняют в запросе — это на порядки быстрее, чем перебор ссылок в цикле. Подход зависит от типа реквизита. Для ссылочных типов сравнивают с пустой ссылкой через функцию ЗНАЧЕНИЕ(), для строк — с пустой строкой, для чисел — с нулём.

ВЫБРАТЬ

Номенклатура.Ссылка КАК Ссылка

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

Номенклатура.ЕдиницаИзмерения = ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка)

Отдельный нюанс — значения NULL. Они появляются при левых соединениях и у реквизитов составного типа, когда хранимое значение не соответствует ни одному из типов. Сравнение с пустой ссылкой такие записи не найдёт: нужно явно проверять ЕСТЬ NULL или использовать ЕСТЬNULL() для приведения к конкретному значению.

Универсальный вариант для составного реквизита — комбинировать оба условия: ГДЕ Реквизит ЕСТЬ NULL ИЛИ Реквизит = ЗНАЧЕНИЕ(...). Для сложных случаев удобно привести реквизит через ВЫРАЗИТЬ(... КАК Справочник.Имя) и сравнить результат с пустой ссылкой.

Способы проверки и где они работают

Свойство «Проверять заполнение»

Настраивается без кода, срабатывает при стандартной записи. Не подходит для условной обязательности и не защищает от загрузок с отключенной проверкой.

ЗначениеЗаполнено()

Ручная проверка в любом месте кода, гибкие условия. Требует писать и сопровождать код, сообщения нужно формировать самостоятельно.

ПроверитьЗаполнение()

Программный вызов штатной проверки до записи. Работает только для объектов, не применим к отдельным значениям.

Проверка в запросе

Быстрый поиск незаполненных реквизитов в больших выборках. Требует учёта NULL и составных типов.

Проверка на форме и диагностика заполнения у пользователя

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

Если задача стоит не в разработке, а в контроле данных — найти все документы или элементы справочника с пустым реквизитом — не обязательно писать код. В типовых конфигурациях есть стандартные средства: групповое изменение реквизитов (обработка «Групповое изменение реквизитов»), универсальный отчёт с отбором по пустому значению или консоль запросов для администратора. В отборах динамических списков и отчётов на СКД доступны виды сравнения «Не заполнено» и «Заполнено».

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

Контрольные точки

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

Запись объекта с пустым реквизитом
Норма

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

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

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

Сообщение об ошибке
Норма

Указано конкретное поле, сообщение привязано к реквизиту формы

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

Общее сообщение без привязки — пользователь не понимает, что исправить

Проверка в запросе
Норма

Найдены все объекты с пустыми и NULL-значениями

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

Часть записей пропущена — не учтён NULL или составной тип

Загрузка через обмен
Норма

Незаполненные обязательные реквизиты выявляются при загрузке

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

Пустые значения попадают в базу мимо проверки

Типичные ошибки и ограничения

Самая частая ошибка — сравнение значения с Неопределено вместо использования ЗначениеЗаполнено() или пустой ссылки. Неопределено — это отсутствие значения, а не пустое значение конкретного типа; такое сравнение почти никогда не даёт ожидаемого результата для реквизитов объекта.

Вторая распространённая проблема — игнорирование NULL в запросах. Записи с NULL не попадают ни в условие равенства, ни в условие неравенства, и отчёт «тихо» теряет часть данных. Третья ошибка — проверка только на клиенте: её легко обойти, и в базу попадают некорректные данные. Наконец, избыточная обязательность реквизитов без учёта видов операций приводит к тому, что пользователи вводят «заглушки» вроде точки или прочерка, что портит аналитику.

Типичные ошибки
01
Сравнение с Неопределено вместо ЗначениеЗаполнено() — проверка не срабатывает для пустых ссылок и строк
02
Игнорирование NULL в запросах — часть незаполненных записей теряется из выборки
03
Проверка только на клиенте — данные обходят контроль при программной записи
04
Проверка строки без СокрЛП — строка из пробелов считается заполненной
05
Безусловная обязательность реквизита для всех видов операций — пользователи вводят фиктивные значения

FAQ

Чем отличается ЗначениеЗаполнено() от сравнения с пустой ссылкой?

ЗначениеЗаполнено() универсальна: она корректно определяет пустоту для любого типа — строки, числа, даты, ссылки. Сравнение с пустой ссылкой работает только для конкретного ссылочного типа и требует точного указания типа. Для реквизитов составного типа безопаснее использовать ЗначениеЗаполнено().

Как проверить заполнение реквизита табличной части?

В модуле объекта переберите строки табличной части в цикле и проверьте каждую через ЗначениеЗаполнено(). Альтернатива — установить свойство «Проверять заполнение» у реквизита табличной части в конфигураторе: платформа проверит все строки автоматически и укажет номер строки в сообщении.

Почему запрос не находит записи с пустым реквизитом?

Скорее всего, значение реквизита равно NULL, а не пустой ссылке. NULL возникает при левых соединениях и у составных типов. Добавьте в условие проверку «Реквизит ЕСТЬ NULL» или используйте функцию ЕСТЬNULL() для приведения значения к конкретному типу.

Можно ли сделать реквизит обязательным только для некоторых видов операций?

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

Как вывести сообщение с привязкой к полю формы?

Используйте объект СообщениеПользователю: заполните свойства Текст, Поле (имя реквизита) и при необходимости ПутьКДанным, затем вызовите метод Сообщить(). Такое сообщение подсвечивается у конкретного поля формы, а не только в панели сообщений.

Сработает ли проверка при обмене данными?

Зависит от настроек обмена. Многие механизмы обмена записывают объекты с отключённой проверкой заполнения, чтобы не прерывать загрузку. Если критично не допустить пустых значений, добавьте контроль в правила конвертации или в обработчики загрузки, а после обмена выполняйте контрольный запрос по обязательным реквизитам.

Итог

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

Для обязательных реквизитов используйте свойство «Проверять заполнение», для произвольных проверок в коде — ЗначениеЗаполнено(), для программной проверки объекта — ПроверитьЗаполнение(), для поиска пустых значений в выборках — запрос с учётом NULL. Критичные проверки дублируйте на сервере, а изменения механизмов проверки тестируйте на копии базы.