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