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

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

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

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

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

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

Ниже разобраны все рабочие способы с примерами кода, типичными ошибками и критериями выбора. Материал ориентирован на управляемые и обычные формы актуальных версий платформы 1С:Предприятие 8.3, но большинство приёмов работает и в более ранних релизах линейки 8.

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

В 1С «пустота» зависит от типа данных. Для строки это строка нулевой длины "", для числа — 0, для даты — '00010101' (1 января 0001 года), для булево — Ложь. Для ссылочных типов (справочники, документы, перечисления, планы счетов) пустое значение — это специальная пустая ссылка, а не отсутствие объекта.

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

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

Универсальная проверка: функция ЗначениеЗаполнено()

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

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

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

Возврат;

КонецЕсли;

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

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

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

Для ссылочных реквизитов есть два подхода. Первый — сравнение с пустой ссылкой конкретного типа:

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

// товар не указан

КонецЕсли;

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

Отдельная ловушка — «битые» ссылки: реквизит заполнен, ссылка не пустая, но объект в базе удалён. При обращении к реквизитам такой ссылки через точку платформа вернёт NULL-подобное поведение в запросах или ошибку в коде. Проверить существование объекта можно запросом с условием Ссылка = &Ссылка — если выборка пуста, объекта нет. Метод ПолучитьОбъект() для битой ссылки вернёт Неопределено, но использовать его массово в циклах нельзя: он тянет объект целиком и сильно замедляет обработку.

Проверка строк, чисел, дат и Неопределено

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

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

Комментарий = "Не указан";

КонецЕсли;

Для чисел и дат специальных функций нет: число сравнивается с 0, дата — с пустой датой '00010101' или Дата(1,1,1). Здесь важно помнить про семантику: нулевое количество в строке документа может быть валидным значением, и заменять проверку на ЗначениеЗаполнено() нельзя — иначе вы отбросите легитимные нули.

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

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

Проверка на NULL в запросах

В языке запросов 1С действуют правила трёхзначной логики: NULL не равен никакому значению, и сравнение Поле = NULL или Поле = Неопределено всегда даёт ложь. Поэтому для проверки используется специальный оператор:

ВЫБРАТЬ

Заказы.Номенклатура,

Цены.Цена

ИЗ

Документ.ЗаказКлиента.Товары КАК Заказы

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК Цены

ПО Заказы.Номенклатура = Цены.Номенклатура

ГДЕ

Цены.Цена ЕСТЬ NULL

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

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

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

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

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

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

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

Сравнение с ПустаяСсылка() или метод Пустая()

Ссылочные типы, когда важно отличить именно незаполненную ссылку, а не любое пустое состояние

= Неопределено

Параметры, ключи структур, результаты поиска. Не ловит NULL из запросов

ЕСТЬ NULL / ЕСТЬNULL()

Только в тексте запроса; единственный корректный способ работы с NULL при соединениях

Проверка коллекций и табличных частей

Массивы, таблицы значений и табличные части проверяются не на «пустое значение», а на количество элементов. Условие Если Массив = Неопределено сработает только если переменной вообще не присваивали коллекцию; созданный, но пустой массив — не Неопределено. Правильная проверка:

Если ТаблицаТоваров.Количество() = 0 Тогда

Сообщить("Нет строк для обработки");

КонецЕсли;

Для табличных частей документов есть метод Количество(), а у выборки из запроса — проверка через Выборка.Следующий() (если вернуло Ложь на первом вызове, записей нет) либо РезультатЗапроса.Пустой(). Метод Пустой() у результата запроса — самый читаемый способ убедиться, что запрос ничего не вернул, до того как выгружать таблицу.

Пошаговый алгоритм выбора проверки

Когда вы не уверены, какой способ применить, удобно идти по фиксированной последовательности: сначала определить тип значения, затем контекст (код или запрос), затем семантику нуля и пустой строки для конкретного поля.

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

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

Условие на пустоту
Норма

Срабатывает на пустом значении и не срабатывает на заполненном

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

Не срабатывает никогда — вероятно, сравнение с несовместимым типом

Обработка NULL из запроса
Норма

NULL заменён через ЕСТЬNULL() или отфильтрован через ЕСТЬ NULL

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

В выборке видны пустые ячейки, сравнение с Неопределено их не ловит

Числовые поля
Норма

Нулевые значения обрабатываются по бизнес-правилу, а не отбрасываются автоматически

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

Строки с нулём пропадают из отчёта или обработки

После внедрения проверки обязательно протестируйте её на реальных данных базы, а не только на идеальных тестовых примерах. Именно в рабочих базах встречаются строки из пробелов, битые ссылки и NULL после соединений, которые не воспроизводятся на чистой демобазе.

Итог

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

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

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

Чем отличается Неопределено от NULL в 1С?

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

Почему условие «Если Реквизит = "" Тогда» не срабатывает?

Почти всегда потому, что реквизит не строкового типа. Пустая ссылка справочника или документа не равна пустой строке, равно как Неопределено и NULL. Проверьте тип реквизита в конфигураторе или через ТипЗнч() в отладчике и используйте ЗначениеЗаполнено() либо сравнение с пустой ссылкой.

Как проверить, что запрос ничего не вернул?

У объекта РезультатЗапроса есть метод Пустой(): Если Результат.Пустой() Тогда ... КонецЕсли. Альтернатива — проверить первый вызов Выборка.Следующий(): если он сразу вернул Ложь, записей нет. Сравнивать выборку с Неопределено не нужно — пустая выборка всё равно является объектом.

Считает ли ЗначениеЗаполнено() пустой строку из пробелов?

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

Как проверить, что ссылка указывает на реально существующий объект?

Самая надёжная проверка — запросом: выбрать запись по условию Ссылка = &Ссылка и посмотреть, пуст ли результат. Метод ПолучитьОбъект() для несуществующего объекта вернёт Неопределено, но при массовой обработке его использовать не стоит из-за обращения к базе на каждый вызов.

Что использовать в СКД для замены пустых значений?

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