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

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

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

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

Значение Неопределено в 1С — это специальное состояние, означающее, что переменной, реквизиту или результату функции не присвоено никакое значение. Проверка на Неопределено нужна практически в каждом модуле: при поиске элементов справочников, обработке результатов запросов, чтении данных из форм и работе с возвращаемыми значениями функций.

Ошибки, связанные с необработанным Неопределено, относятся к самым частым причинам падения кода: попытка обратиться к свойству или методу у неопределённого значения вызывает исключение «Поле объекта не обнаружено» или «Значение не является значением объектного типа». Поэтому корректная проверка — базовый навык разработчика.

Ниже разобраны основные способы проверки, их отличия от проверки на пустое значение, работа в запросах и типичные ошибки, которые приводят к ложным срабатываниям.

Что такое Неопределено и когда оно появляется

Неопределено — это литерал встроенного языка, обозначающий отсутствие значения. Его не нужно путать с пустой ссылкой, пустой строкой или нулём: это разные состояния. Пустая ссылка — вполне определённое значение конкретного типа, а Неопределено — отсутствие значения как такового.

Типичные ситуации, в которых возникает Неопределено:

  • метод НайтиПоКоду(), НайтиПоНаименованию() или НайтиПоРеквизиту() не нашёл элемент;
  • функция не вернула значение через Возврат;
  • реквизит составного типа не заполнен;
  • обращение к свойству структуры, которого в ней нет (при использовании Свойство() с переменной-результатом);
  • элемент формы или параметр сеанса не инициализирован.

Понимание источника Неопределено важно, потому что способ обработки зависит от контекста: иногда достаточно присвоить значение по умолчанию, а иногда отсутствие результата — штатная ситуация, требующая отдельной ветки логики.

Базовая проверка через сравнение

Самый прямой способ — оператор равенства. Встроенный язык поддерживает сравнение с литералом Неопределено напрямую:

Результат = Справочники.Номенклатура.НайтиПоКоду("000001");

Если Результат = Неопределено Тогда

Сообщить("Элемент не найден");

Иначе

Сообщить("Найден: " + Результат);

КонецЕсли;

Для проверки на заполненность используется обратное условие — оператор неравенства:

Если Результат <> Неопределено Тогда

// работаем с найденным значением

КонецЕсли;

Также доступна функция ТипЗнч() в сочетании с Тип("Неопределено"), но на практике прямое сравнение читается лучше и работает быстрее. Функция ТипЗнч() оправдана, когда нужно различать несколько возможных типов значения, а не только проверить на Неопределено.

Функция ЗначениеЗаполнено и её границы

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

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

ВызватьИсключение "Не указан контрагент";

КонецЕсли;

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

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

Сравнение способов проверки

Сравнение с Неопределено

Точная проверка одного состояния. Подходит, когда пустая ссылка и Неопределено должны обрабатываться по-разному.

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

Универсальная проверка на любую пустоту. Подходит для валидации реквизитов, но не различает причину пустоты.

ТипЗнч() = Тип("Неопределено")

Громоздкий вариант, оправдан только при разборе нескольких возможных типов значения.

Проверка в запросах: NULL и НЕОПРЕДЕЛЕНО

В языке запросов 1С нет значения Неопределено в том виде, в каком оно существует во встроенном языке. Отсутствие данных при соединении таблиц выражается через NULL, и проверяется конструкцией ЕСТЬ NULL:

ВЫБРАТЬ

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

Остатки.КоличествоОстаток

ИЗ

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

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

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

ГДЕ

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

Для замены NULL на значение по умолчанию прямо в запросе используется функция ЕСТЬNULL():

ВЫБРАТЬ

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

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

Проверка свойств структуры и параметров функций

При работе со структурами обращение к несуществующему свойству через точку вызывает исключение. Безопасный способ — метод Свойство(), который возвращает Неопределено, если ключа нет:

ЗначениеСкидки = Неопределено;

Если Параметры.Свойство("Скидка", ЗначениеСкидки) Тогда

// свойство есть, работаем со значением

Иначе

ЗначениеСкидки = 0; // значение по умолчанию

КонецЕсли;

Для параметров функций с необязательным заполнением принято объявлять значение по умолчанию прямо в заголовке: Функция РассчитатьЦену(Товар, Скидка = Неопределено). Внутри функции первым шагом проверяют параметр и задают рабочее значение. Это защищает от падения при вызове функции с частичным набором аргументов.

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

Порядок безопасной обработки результата поиска
  1. 1
    Вызовите метод поиска (НайтиПоКоду, НайтиПоНаименованию) и сохраните результат в переменную.
  2. 2
    Проверьте результат: Если Результат = Неопределено Тогда — обработайте отсутствие элемента отдельной веткой.
  3. 3
    Если элемент найден, проверьте, не является ли он пустой ссылкой, когда это важно для логики.
  4. 4
    Только после проверок обращайтесь к свойствам и методам найденного объекта.
  5. 5
    Убедитесь, что ветка «не найдено» не оставляет переменную в состоянии, которое используется дальше без проверки.

Типичные ошибки при проверке на Неопределено

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

Вторая группа — преждевременное обращение к свойствам. Код вида Если Результат.Сумма > 0 Тогда упадёт с исключением, если Результат равен Неопределено: платформа вычисляет обращение к свойству до проверки условия. Сначала проверка, потом обращение.

Третья группа — ложная уверенность после ЗначениеЗаполнено(). Функция вернёт Истина для даты, булева значения и других типов, где «заполненность» не гарантирует осмысленность данных для конкретной логики.

Типичные ошибки
01
Сравнение с пустой строкой вместо Неопределено — проверка не срабатывает, ошибка остаётся скрытой.
02
Обращение к свойству результата до проверки на Неопределено — исключение в момент выполнения.
03
Использование ГДЕ Поле = NULL в запросе — запрос молча возвращает пустой результат.
04
Замена точной проверки на ЗначениеЗаполнено там, где 0 является допустимым значением.
05
Отсутствие ветки обработки: проверка есть, но при Неопределено код продолжает использовать старое значение переменной.

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

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

Полезный приём при отладке — временный вывод типа значения: Сообщить(ТипЗнч(Результат)). Если ожидалась ссылка, а выводится «Неопределено» — значит, проблема выше по коду, в источнике данных, а не в проверке.

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

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

Ветка обработки Неопределено
Норма

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

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

Код падает с ошибкой «Поле объекта не обнаружено»

Проверка в запросе
Норма

ЕСТЬ NULL корректно отбирает строки без связанных данных

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

Запрос возвращает пустой результат при заведомо существующих данных

Различение пустоты
Норма

Пустая ссылка и Неопределено обрабатываются по отдельным веткам, если логика этого требует

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

Оба состояния попадают в одну ветку, хотя должны обрабатываться по-разному

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

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

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

Почему сравнение с Неопределено не срабатывает для ссылки?

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

Можно ли использовать Неопределено в запросе как параметр?

Передать Неопределено как параметр запроса можно, но сравнивать поля с ним в условии ГДЕ бессмысленно — в запросах отсутствие данных проверяется через ЕСТЬ NULL. Параметр со значением Неопределено чаще используют как признак отключения отбора через конструкцию с ИЛИ.

Что вернёт функция, если в ней нет оператора Возврат?

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

Как проверить на Неопределено реквизит составного типа?

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

Есть ли проверка на Неопределено в СКД и выражениях компоновки?

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

Итог

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

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