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

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

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

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

В 1С «пустое значение» — это не одно состояние, а целое семейство: пустая строка, ноль, пустая ссылка, Неопределено, NULL в запросе, пустая дата. Начинающий разработчик часто пишет проверку вида Если Значение = "" Тогда и получает ошибку или ложный результат, потому что реальное значение оказалось пустой ссылкой или NULL. Поэтому корректная проверка начинается с понимания типа данных, который вы анализируете.

Основной инструмент — встроенная функция ЗначениеЗаполнено(). Она возвращает Истина, если значение заполнено, и Ложь — если оно пустое для своего типа: пустая строка, ноль, пустая дата, пустая ссылка, Неопределено. В большинстве прикладных задач достаточно конструкции Если Не ЗначениеЗаполнено(Реквизит) Тогда с последующим действием — сообщением, отказом или подстановкой значения по умолчанию.

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

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

Функция ЗначениеЗаполнено(Значение) — первый кандидат в любой ситуации. Она корректно обрабатывает примитивные типы (число, строка, дата, булево), ссылки на объекты и значение Неопределено. Пустым считается значение по умолчанию для типа: 0 для числа, пустая строка, дата '00010101', пустая ссылка соответствующего вида.

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

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

Возврат;

КонецЕсли;

Если ЗначениеЗаполнено(НомерДоговора) Тогда

// выполняем действия с заполненным номером

КонецЕсли;

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

bsl
Если Не ЗначениеЗаполнено(Объект.Склад) Тогда
    Отказ = Истина;
    Сообщить("Поле Склад обязательно для заполнения");
КонецЕсли;

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

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

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

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

Комментарий = "Без комментария";

КонецЕсли;

Разница с ЗначениеЗаполнено() принципиальна: строка из трёх пробелов для ПустаяСтрока() — пустая, а для ЗначениеЗаполнено() — заполненная. Перед сравнением строк на равенство часто применяют СокрЛП(), чтобы отсечь пробелы по краям: Если СокрЛП(Наименование) = "" Тогда. Такая связка надёжна при обработке данных из файлов и внешних систем.

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

Проверка ссылочных значений и Неопределено

Пустая ссылка — это не отсутствие объекта, а специальное значение конкретного вида ссылки. Проверить её можно двумя способами: через ЗначениеЗаполнено() или методом Пустая(): Если Документ.Пустая() Тогда. Второй вариант чуть быстрее и явно показывает намерение, но применим только к ссылкам.

Значение Неопределено возникает, когда переменной не присвоено значение, реквизит составного типа не заполнен или функция не вернула результат. Проверка — прямое сравнение: Если Результат = Неопределено Тогда. Типичная ситуация — поиск элемента через НайтиПоКоду() или НайтиПоНаименованию(): если элемент не найден, возвращается пустая ссылка, а вот Найти() в таблице значений возвращает Неопределено.

НайденнаяСтрока = ТаблицаТоваров.Найти(Артикул, "Артикул");

Если НайденнаяСтрока = Неопределено Тогда

Сообщить("Товар с артикулом " + Артикул + " не найден");

КонецЕсли;

Не путайте пустую ссылку с «битой» ссылкой на удалённый объект. Битая ссылка формально заполнена, но объект в базе отсутствует — проверяется запросом или попыткой получить объект с обработкой исключения. ЗначениеЗаполнено() такую ситуацию не выявит.

Проверка пустых значений в запросах: NULL и ЕСТЬNULL

В языке запросов 1С действуют правила, отличные от встроенного языка. Здесь существует NULL — результат левого соединения без совпадений или отсутствующего значения. ЗначениеЗаполнено() в запросе недоступна; вместо неё используются операторы ЕСТЬ NULL, ЕСТЬ НЕ NULL и функция ЕСТЬNULL().

ВЫБРАТЬ

ЕСТЬNULL(Остатки.Количество, 0) КАК Количество

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки КАК Остатки

ПО Товары.Ссылка = Остатки.Номенклатура

ГДЕ

ЕСТЬNULL(Остатки.Количество, 0) = 0

Для проверки пустой ссылки в запросе используется литерал ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Условие выглядит так: ГДЕ Документ.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Пустую дату проверяют через ЗНАЧЕНИЕ(ДатаВремя(1,1,1)) или сравнением с датой '00010101'.

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

Проверка таблиц, коллекций и реквизитов объекта

Для табличных частей и таблиц значений «пустота» означает отсутствие строк. Проверка выполняется через количество: Если Объект.Товары.Количество() = 0 Тогда. Для массивов и списков значений аналогично — Массив.Количество() = 0. Перед обходом коллекции циклом такая проверка позволяет сразу сообщить пользователю о проблеме, а не молча ничего не сделать.

Если нужно проверить, существует ли реквизит у объекта вообще (например, в универсальной обработке для разных видов документов), используйте метаданные: Объект.Метаданные().Реквизиты.Найти("Склад") — вернёт Неопределено, если реквизита нет. Только после этого обращайтесь к значению, иначе получите ошибку исполнения.

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

Типичные ошибки при проверке пустых значений

Самая частая ошибка — сравнение разнотипных значений. Выражение Если Дата = "" Тогда не выявит пустую дату: пустая дата — это '00010101', а не пустая строка. Аналогично сравнение ссылки с Неопределено не сработает для пустой ссылки. Всегда сверяйте проверку с фактическим типом реквизита в конфигураторе.

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

Типичные ошибки
01
Сравнение даты с пустой строкой вместо значения '00010101' — проверка никогда не срабатывает
02
Использование ЗначениеЗаполнено() для поля из левого соединения запроса — NULL она не обрабатывает
03
Сравнение Поле = NULL в запросе вместо ЕСТЬ NULL — условие не работает
04
Проверка ЗначениеЗаполнено() для числа, где 0 является допустимым значением — ложное срабатывание
05
Обращение к реквизиту без проверки его наличия в универсальном коде — ошибка исполнения

Как проверить, что код работает правильно

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

Для запросов используйте консоль запросов: выполните запрос на реальных данных и убедитесь, что строки с NULL обрабатываются так, как задумано. Проверьте, что итоговые суммы не «теряют» позиции из-за необработанных NULL в условиях соединения.

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

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

Пустое значение на входе
Норма

Срабатывает ветка обработки пустого значения

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

Код проходит дальше или падает с ошибкой

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

ПустаяСтрока() возвращает Истина

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

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

Поле из левого соединения
Норма

ЕСТЬNULL подставляет значение по умолчанию

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

Строки пропадают из результата запроса

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

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

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

Как проверить пустую дату в 1С?

Сравните значение с датой '00010101': Если Дата = '00010101000000' Тогда. В запросе используйте ЗНАЧЕНИЕ(ДатаВремя(1,1,1)). Функция ЗначениеЗаполнено() также корректно определяет пустую дату.

Почему ЗначениеЗаполнено не работает с полем из запроса?

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

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

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

Что вернёт Найти(), если элемент не найден?

Метод Найти() у таблиц значений, массивов и структур возвращает Неопределено. Проверяйте результат прямым сравнением: Если Результат = Неопределено Тогда. У справочников НайтиПоКоду() и НайтиПоНаименованию() возвращают пустую ссылку, а не Неопределено.

Можно ли проверить пустое значение без программирования?

Да. Для обязательных реквизитов достаточно включить свойство «Проверка заполнения» — «Выдавать ошибку» в палитре свойств реквизита в конфигураторе. Платформа сама будет блокировать запись с пустым значением, и писать код не потребуется.

Итог

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

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