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