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

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

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

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

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

Во встроенном языке 1С есть несколько инструментов: универсальная функция ЗначениеЗаполнено(), функция ПустаяСтрока(), сравнение с пустыми значениями типов и проверка на Неопределено и NULL. У каждого способа своя область применения, и выбор зависит от типа проверяемого поля: строка, число, ссылка, дата или реквизит составного типа.

Ниже разобраны рабочие способы проверки с примерами кода, отличия для разных типов данных, проверка реквизитов формы и объекта, а также типичные ошибки, которые допускают даже опытные разработчики.

Функция ЗначениеЗаполнено — основной способ

Функция ЗначениеЗаполнено() — стандартный и рекомендуемый метод проверки. Она корректно обрабатывает большинство типов данных и избавляет от необходимости писать отдельные условия для строк, чисел и ссылок. Синтаксис предельно прост: функция принимает один параметр и возвращает булево значение.

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

// поле заполнено, продолжаем обработку

Иначе

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

КонецЕсли;

Функция считает значение незаполненным в следующих случаях: пустая строка или строка из одних пробелов, число 0, дата 01.01.0001, пустая ссылка любого объектного типа, значение Неопределено, NULL, пустое значение перечисления. Для булева типа значение Ложь считается незаполненным — это важно учитывать.

Проверку удобно выносить в отдельную функцию, если одно и то же условие используется в нескольких местах модуля. Это упрощает поддержку: при изменении логики править придётся одно место, а не все вхождения условия.

Проверка строк: ПустаяСтрока и нюансы пробелов

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

Если ПустаяСтрока(Наименование) Тогда

Сообщить("Наименование не заполнено");

КонецЕсли;

// эквивалентная ручная проверка

Если СокрЛП(Наименование) = "" Тогда

Сообщить("Наименование не заполнено");

КонецЕсли;

Для строк неограниченной длины и полей, полученных из внешних источников (файлов, веб-сервисов), полезно дополнительно отсекать неразрывные пробелы и символы табуляции. Стандартная СокрЛП() работает с обычными пробелами, а неразрывный пробел (символ 160) может остаться и сделать строку «визуально пустой», но формально заполненной.

Если поле вводится пользователем на форме, надёжнее проверять уже обработанное значение: ПустаяСтрока(СокрЛП(СтрЗаменить(Поле, Символ(160), " "))). Такая конструкция отсекает и обычные, и неразрывные пробелы по краям.

Проверка ссылок, чисел и дат

Ссылочные поля (контрагент, номенклатура, договор) проверяются либо через ЗначениеЗаполнено(), либо через метод Пустая() самой ссылки. Оба варианта корректны, но у ЗначениеЗаполнено есть преимущество: она не вызовет ошибку, если в переменной окажется Неопределено.

// два равнозначных варианта для ссылки

Если Контрагент.Пустая() Тогда

// ссылка пустая

КонецЕсли;

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

// ссылка пустая или Неопределено

КонецЕсли;

Числа считаются незаполненными при значении 0. Это создаёт ловушку: если ноль — допустимое рабочее значение (например, нулевая ставка или нулевой остаток), проверка через ЗначениеЗаполнено даст ложный результат. В таких случаях проверяйте бизнес-логику, а не «пустоту» числа.

Даты считаются пустыми при значении 01.01.0001 00:00:00. Проверка ЗначениеЗаполнено(ДатаДокумента) корректно отработает и для реквизита типа «Дата», и для даты в составе составного типа.

Сравнение способов проверки

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

Универсальный вариант для любых типов, безопасен при Неопределено. Не подходит, когда 0 или Ложь — осмысленные значения.

ПустаяСтрока()

Только для строк; сама отбрасывает пробелы. Не применима к другим типам.

Ссылка.Пустая()

Только для ссылок; вызовет ошибку, если в переменной Неопределено или значение другого типа.

Сравнение с Неопределено/NULL

Нужно для полей запросов и составных типов; не проверяет «пустоту» самого значения.

Проверка реквизитов объекта и данных формы

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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

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

ОбщегоНазначения.СообщитьПользователю(

"Не заполнен контрагент", , "Контрагент", "Объект", Отказ);

КонецЕсли;

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

В управляемой форме данные часто лежат в реквизитах формы, а объект доступен через Объект (для основного реквизита). Проверка выглядит так: ЗначениеЗаполнено(Объект.Комментарий). Если проверяется реквизит формы, созданный вручную, обращайтесь к нему напрямую по имени: ЗначениеЗаполнено(ЭтаФорма.АдресДоставки).

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

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

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

В запросах функция ЗначениеЗаполнено недоступна — там свои механизмы. Для ссылок используется сравнение с пустой ссылкой через ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка), для строк — сравнение с пустой строкой, для полей, которые могут быть NULL (например, при левом соединении), — оператор ЕСТЬ NULL или функция ЕСТЬNULL().

ВЫБРАТЬ

Продажи.Контрагент,

Продажи.Сумма

ИЗ

РегистрНакопления.Продажи КАК Продажи

ГДЕ

Продажи.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)

И НЕ Продажи.Договор ЕСТЬ NULL

Ошибка новичков — сравнивать поле из левого соединения с пустой ссылкой, забывая про NULL. Если соединение не нашло пару, поле будет NULL, а условие Поле = ПустаяСсылка вернёт не Истина и не Ложь, а NULL — и строка выпадет из результата. Всегда оборачивайте такие поля в ЕСТЬNULL() или явно обрабатывайте ЕСТЬ NULL.

Проверка полей составного типа и значения Неопределено

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

Если нужно не просто проверить заполненность, а понять, какой именно тип выбран, используйте ТипЗнч() совместно с проверкой заполненности: сначала убедитесь, что значение заполнено, затем анализируйте тип. Обратный порядок опасен: вызов метода у пустой ссылки или Неопределено приведёт к ошибке выполнения.

Типичные ошибки
01
Проверка строки сравнением с "" без СокрЛП — строка из пробелов считается заполненной, и в базу попадают «пустые» наименования.
02
Вызов Ссылка.Пустая() у переменной, которая может быть Неопределено, — падение с ошибкой «Метод объекта не обнаружен».
03
Использование ЗначениеЗаполнено для числа, где 0 — рабочее значение, — ложные сообщения о незаполненности.
04
Игнорирование NULL в запросах с левыми соединениями — строки молча выпадают из выборки.
05
Проверка только шапки документа без табличных частей — проводятся документы с пустыми строками.

Проверка результата и отладка

После внедрения проверки обязательно протестируйте граничные случаи: полностью пустое поле, поле с пробелами, поле со значением 0, пустая ссылка, заполненное значение. Убедитесь, что сообщение понятно пользователю и привязано к конкретному полю формы — иначе пользователь не поймёт, что исправлять.

Для отладки удобно временно выводить проверяемое значение через Сообщить() или точку останова в конфигураторе. Проверяйте фактический тип значения через ТипЗнч() — нередко оказывается, что в переменной не тот тип, который ожидался, и проверка работает «не так» именно поэтому.

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

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

Пустое поле при записи
Норма

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

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

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

Поле, заполненное пробелами
Норма

Считается незаполненным

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

Проходит проверку и сохраняется

Заполненное поле
Норма

Запись проходит без лишних сообщений

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

Ложное срабатывание проверки

Частые вопросы

Чем ЗначениеЗаполнено отличается от ПустаяСтрока?

ЗначениеЗаполнено работает с любыми типами и возвращает Истина для заполненного значения. ПустаяСтрока работает только со строками и возвращает Истина для пустой строки. Для строк обе применимы, но логика инвертирована: ЗначениеЗаполнено(Строка) = НЕ ПустаяСтрока(Строка).

Как проверить, заполнен ли реквизит формы, а не объекта?

Обратитесь к реквизиту формы напрямую по имени: ЗначениеЗаполнено(ЭтаФорма.ИмяРеквизита) или просто ЗначениеЗаполнено(ИмяРеквизита) в модуле формы. Не путайте с реквизитами объекта, которые доступны через Объект.ИмяРеквизита.

Почему ЗначениеЗаполнено(0) возвращает Ложь, если ноль — нормальное значение?

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

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

Сравните поле с пустым значением соответствующего типа: ЗНАЧЕНИЕ(Справочник.Имя.ПустаяСсылка) для ссылок, пустая строка для строк. Для полей из соединений дополнительно обработайте NULL через ЕСТЬNULL() или условие ЕСТЬ NULL.

Что делать, если поле выглядит пустым, но проверка говорит, что оно заполнено?

Скорее всего, в поле пробелы, неразрывные пробелы или другие невидимые символы. Посмотрите длину строки через СтрДлина() и очистите значение через СокрЛП с предварительной заменой символа 160 на обычный пробел.

Где правильно размещать проверку обязательных полей документа?

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

Итог

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

Используйте ЗначениеЗаполнено как универсальный способ, ПустаяСтрока — для строк, сравнение с пустой ссылкой и ЕСТЬ NULL — в запросах. Помните про особые случаи: ноль, Ложь, пробелы и NULL в соединениях. Проверку обязательных полей размещайте в ОбработкаПроверкиЗаполнения и тестируйте на граничных значениях.