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