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