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

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

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

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

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

Во встроенном языке 1С существует несколько способов проверки, и они не взаимозаменяемы: ЗначениеЗаполнено(), ПустаяСтрока(), сравнение с пустой ссылкой, проверка NULL и ЕСТЬ NULL в запросах. Каждый метод работает со своим набором типов и имеет ограничения. Универсального решения «на все случаи» нет — нужно понимать, какого типа реквизит проверяется.

Материал рассчитан на разработчиков и внедренцев, работающих с конфигурациями на платформе 1С:Предприятие 8.3. Примеры применимы как к типовым, так и к самописным конфигурациям, в обычных и управляемых формах.

Что считается пустым значением в 1С

Понятие «пустое значение» в 1С зависит от типа данных. Для строки это строка нулевой длины (при этом строка из одних пробелов формально не пустая). Для числа — ноль. Для даты — значение '00010101000000'. Для булева — Ложь. Для ссылочных типов — пустая ссылка соответствующего вида. Кроме того, существуют специальные значения Неопределено и NULL, которые тоже интерпретируются как отсутствие данных.

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

Универсальная проверка через ЗначениеЗаполнено()

Функция ЗначениеЗаполнено(Значение) — основной инструмент проверки. Она возвращает Истина, если значение содержательно заполнено, и Ложь для пустых ссылок, пустых строк, нулевых чисел, пустых дат, Неопределено и NULL. Это делает её безопасным выбором, когда тип реквизита составной или заранее неизвестен.

Типичный пример — проверка обязательного реквизита перед записью документа:

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

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

Отказ = Истина;

КонецЕсли;

У функции есть важная особенность: для числа 0 и даты '00010101' она вернёт Ложь. Если ноль для вашего реквизита — легитимное значение (например, нулевая ставка или нулевой остаток, который нужно отличать от «не задано»), ЗначениеЗаполнено не подходит — используйте проверку на Неопределено или отдельный признак заполненности.

Проверка строковых реквизитов

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

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

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

КонецЕсли;

Обратная ситуация — когда строка хранится в реквизите неограниченной длины и может содержать Неопределено. В этом случае ПустаяСтрока сработает корректно (для Неопределено вернёт Истина), но для надёжности часто пишут комбинированную проверку через ЗначениеЗаполнено, которая покрывает оба случая.

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

Для ссылок на справочники, документы, перечисления и другие объектные типы существует три рабочих способа. Первый — метод Пустая(): Если Объект.Склад.Пустая() Тогда. Второй — сравнение с явной пустой ссылкой через менеджер объекта:

Если Объект.Склад = Справочники.Склады.ПустаяСсылка() Тогда

// склад не указан

КонецЕсли;

Третий способ — та же ЗначениеЗаполнено. Все три варианта для ссылок эквивалентны по результату. Различие в читаемости и устойчивости: сравнение с конкретной пустой ссылкой явно фиксирует ожидаемый тип, а ЗначениеЗаполнено корректно отработает и для составного типа, и для Неопределено.

Частая ошибка — сравнение ссылки с Неопределено напрямую. Пустая ссылка не равна Неопределено, поэтому условие Если Объект.Склад = Неопределено никогда не сработает для реквизита ссылочного типа, хотя визуально поле в форме пустое.

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

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

В языке запросов 1С действуют другие правила. Пустую ссылку проверяют сравнением с конструкцией ЗНАЧЕНИЕ(...) или параметром:

ВЫБРАТЬ

Реализация.Ссылка

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

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

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

ГДЕ

Остатки.Количество ЕСТЬ NULL

Чтобы не проверять NULL отдельно, часто применяют функцию ЕСТЬNULL(Поле, ЗначениеПоУмолчанию), которая подменяет NULL заданным значением прямо в выборке. Это упрощает последующую обработку результата запроса в коде.

Сравнение вариантов

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

Универсальный метод для любых типов в коде. Ограничение: 0 и пустая дата считаются незаполненными.

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

Только строки. Не ловит строку из пробелов без СокрЛП.

Ссылка.Пустая() / сравнение с ПустаяСсылка()

Только ссылочные типы. Наглядно фиксирует тип, но не работает с Неопределено.

ЕСТЬ NULL в запросе

Единственный корректный способ проверки NULL в запросах. В коде на встроенном языке не применяется.

Проверка в форме и у динамических списков

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

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

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

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Укажите ответственного";

Сообщение.Поле = "Объект.Ответственный";

Сообщение.Сообщить();

Отказ = Истина;

КонецЕсли;

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

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

Порядок действий
  1. 1
    Определите тип реквизита в конфигураторе или отладчике
  2. 2
    Для составного или неизвестного типа используйте ЗначениеЗаполнено()
  3. 3
    Для строки добавьте СокрЛП, если пробелы считаются пустотой
  4. 4
    Для ссылки используйте Пустая() или сравнение с ПустаяСсылка()
  5. 5
    В запросе проверяйте пустую ссылку через ЗНАЧЕНИЕ(...), а NULL — через ЕСТЬ NULL
  6. 6
    Проверьте результат на тестовых данных: пустое значение, ноль, пробелы, заполненное значение

Проверка результата и границы безопасной работы

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

Изменения в коде проверок заполнения выполняйте на копии базы или в тестовом контуре. Ошибка в обработчике проверки может заблокировать запись документов у всех пользователей — это остановка работы, а не локальная неудобность. Если конфигурация типовая и находится на поддержке, доработки выполняйте через расширение, чтобы не потерять возможность обновления.

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

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

Пустое ссылочное поле
Норма

Проверка срабатывает, выводится сообщение

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

Документ записывается с пустой ссылкой

Числовой реквизит со значением 0
Норма

Поведение соответствует логике: 0 принят или отклонён осознанно

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

Ноль отклоняется, хотя является рабочим значением

Строка из пробелов
Норма

Считается пустой (если использован СокрЛП)

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

Проходит как заполненная

Запрос с левым соединением
Норма

NULL отбирается через ЕСТЬ NULL

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

Строки с NULL теряются или фильтр не работает

Часто задаваемые вопросы

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

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

Почему условие «Реквизит = Неопределено» не срабатывает для пустой ссылки?

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

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

Используйте метод Количество(): условие «Если Объект.Товары.Количество() = 0» означает, что табличная часть не содержит строк. Функция ЗначениеЗаполнено для табличных частей не применяется.

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

Для ссылочного реквизита добавьте условие «Реквизит = ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка)» с подходящим типом. Если поле может содержать NULL из-за соединения таблиц, добавьте условие «ИЛИ Реквизит ЕСТЬ NULL».

Строка из пробелов считается пустой?

Нет, функция ПустаяСтрока вернёт Ложь для строки из пробелов. Чтобы такая строка считалась пустой, применяйте ПустаяСтрока(СокрЛП(Значение)) — сокращение пробелов превратит её в строку нулевой длины.

Можно ли проверить реквизит составного типа одной функцией?

Да, ЗначениеЗаполнено корректно обрабатывает составные типы: она вернёт Ложь для пустой ссылки любого вида, пустой строки, нуля, пустой даты и Неопределено. Это основной способ проверки реквизитов, чей тип заранее не определён.

Итог

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

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