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