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

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

«Неопределено» в 1С: что это за значение и как с ним работать

Что означает «Неопределено» в 1С, где встречается это значение, как проверить переменную на Неопределено и каких ошибок избегать в коде и отчётах.

Если вы видели в отчёте, реквизите документа или сообщении об ошибке слово «Неопределено», это не сбой программы, а специальное значение встроенного языка 1С. Оно обозначает отсутствие данных: переменная создана, но ей ничего не присвоено, функция не вернула результат, реквизит объекта не заполнен. Понимание того, откуда берётся «Неопределено» и как с ним обращаться, избавляет от большинства загадочных ошибок в доработках и отчётах.

Значение относится к примитивному типу Неопределено (Undefined). У него нет свойств и методов, его нельзя привести к числу или дате, и любая попытка обратиться к его реквизиту вызывает ошибку выполнения. При этом «Неопределено» не равно пустой строке, нулю или NULL — это отдельное состояние, и сравнивать его нужно только напрямую.

Ниже разобрано, где именно возникает «Неопределено», как проверять значение в коде и в запросах, чем оно отличается от NULL и пустых ссылок, и какие типичные ошибки приводят к падению процедур и искажению отчётов.

Откуда берётся значение «Неопределено»

Самый частый источник — объявленная, но не заполненная переменная. Если в процедуре написать Перем Результат; и до первого присваивания использовать её в условии, там окажется именно «Неопределено». Локальные переменные в 1С не инициализируются нулём или пустой строкой автоматически.

Второй источник — функции и методы, которые в некоторых ветках логики не возвращают значение. Если в функции оператор Возврат стоит только внутри условия и условие не выполнилось, функция вернёт «Неопределено». Классический пример из типовых конфигураций — метод НайтиПоСсылке и подобные поисковые функции, возвращающие «Неопределено», когда объект не найден.

Третий источник — обращение к реквизитам составного типа и к полям структур. Если в структуре нет ключа, а чтение идёт через Структура.Свойство("Ключ", Переменная), переменная получит «Неопределено». Также «Неопределено» возвращают некоторые методы работы с файлами, COM-объектами и внешними компонентами при неудачном вызове.

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

Единственный корректный способ — прямое сравнение:

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

// значение отсутствует, обрабатываем ситуацию

Иначе

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

КонецЕсли;

Нельзя проверять через ПустаяСтрока(), ЗначениеЗаполнено() или сравнение с пустой строкой: для «Неопределено» эти проверки ведут себя неочевидно. Функция ЗначениеЗаполнено(Неопределено) вернёт Ложь, что иногда используют как косвенную проверку, но прямое сравнение читается лучше и не маскирует намерение.

Для определения типа значения есть функция ТипЗнч() и перечисление Тип("Неопределено"):

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

// тип значения — Неопределено

КонецЕсли;

bsl
Функция НайтиКонтрагента(ИНН)
    Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты ГДЕ ИНН = &ИНН");
    Запрос.УстановитьПараметр("ИНН", ИНН);
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Ссылка;
    КонецЕсли;
    // если вернуть Неопределено явно — вызывающий код сможет проверить результат
    Возврат Неопределено;
КонецФункции

Чем «Неопределено» отличается от NULL, пустой строки и пустой ссылки

Путаница между этими значениями — главный источник ошибок. NULL существует только в языке запросов и означает отсутствие значения в поле результата запроса, чаще всего из-за левого соединения, по которому не нашлось пары. «Неопределено» — значение встроенного языка, в запросах оно не участвует как данные поля.

Пустая строка "" и ноль — вполне конкретные значения своих типов. Пустая ссылка (Справочники.Номенклатура.ПустаяСсылка()) — тоже значение определённого типа, просто не указывающее ни на один объект. «Неопределено» не имеет типа данных вообще, поэтому сравнение Неопределено = "" даст Ложь, а попытка сложить его с числом вызовет ошибку.

ЗначениеГде существуетКак проверитьТипичная причина появления
НеопределеноВстроенный языкЗначение = НеопределеноПеременная не заполнена, функция не вернула результат
NULLЯзык запросовПоле ЕСТЬ NULLНет строки в соединяемой таблице
Пустая строкаВездеПустаяСтрока(Значение)Реквизит строкового типа не заполнен
Пустая ссылкаВездеЗначение.Пустая() или ЗначениеЗаполнено()Ссылочный реквизит не заполнен

Типичные ошибки при работе с «Неопределено»

Самая опасная ошибка — обращение к свойству или методу значения «Неопределено». Строка вида Результат.Сумма, где Результат равен «Неопределено», завершит выполнение с ошибкой «Поле объекта не обнаружено». Такие падения часто проявляются только на редких данных, когда функция-поиск не нашла объект, поэтому проверку результата нужно ставить сразу после вызова.

Вторая ошибка — использование «Неопределено» в арифметике и конкатенации. Выражение Неопределено + 10 или "Итог: " + Неопределено вызывает ошибку преобразования типа. Если переменная может остаться незаполненной, инициализируйте её значением по умолчанию (0, "") ещё при объявлении.

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

Типичные ошибки
01
Обращение к реквизиту Неопределено без проверки — ошибка «Поле объекта не обнаружено» и остановка обработки
02
Проверка через ПустаяСтрока() или сравнение с пустой строкой — условие не срабатывает, дефект уходит дальше по коду
03
Передача Неопределено как параметра запроса и сравнение с полем — результат запроса пуст или неожидан
04
Возврат Неопределено из функции без проверки в вызывающем коде — ошибка всплывает далеко от источника

«Неопределено» в отчётах и на формах

В отчётах на СКД слово «Неопределено» в ячейке обычно означает, что поле ресурса или группировки получило значение, которое система не смогла представить: например, вычисляемое поле вернуло «Неопределено», или в параметрах виртуальной таблицы передано незаполненное значение составного типа. Проверьте выражения вычисляемых полей и значения параметров.

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

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

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

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

Функция поиска объекта
Норма

Возвращает ссылку или явное Неопределено, вызывающий код проверяет результат

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

Возвращает Неопределено только иногда, проверки нет — периодические падения

Переменная перед использованием
Норма

Инициализирована при объявлении или проверена сравнением с Неопределено

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

Используется до первого присваивания

Поле в отчёте СКД
Норма

Вычисляемое выражение всегда возвращает значение одного типа

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

В ячейках появляется слово «Неопределено»

Порядок действий при ошибке, связанной с «Неопределено»

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

Дальше проследите источник значения: откуда переменная получила данные, какая функция её вернула, какие условия могли не выполниться. Чаще всего причина — не найденный объект в базе или ветка логики без возврата значения.

Порядок действий
  1. 1
    По тексту ошибки определите модуль и номер строки, где произошло обращение к Неопределено
  2. 2
    Найдите переменную в этом выражении и проследите, какая функция или присваивание её заполняют
  3. 3
    Проверьте ветки логики функции-источника: все ли пути выполнения заканчиваются оператором Возврат
  4. 4
    Добавьте проверку «Если Значение = Неопределено Тогда» с осмысленной реакцией: сообщение, значение по умолчанию или пропуск итерации
  5. 5
    Повторите сценарий на тех же данных и убедитесь, что ошибка не воспроизводится
Маршрут решения

Как выбрать действие

Функция может не найти объект в базеВозвращайте Неопределено явно и проверяйте результат в точке вызова
Переменная участвует в арифметике или строковой операцииИнициализируйте её нулём или пустой строкой при объявлении
Проблема в поле результата запроса после левого соединенияИспользуйте ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) в тексте запроса
Ошибка возникает редко и только на рабочих данныхДобавьте проверку на Неопределено перед обращением к свойствам объекта

Когда «Неопределено» — норма, а когда признак дефекта

Само по себе значение «Неопределено» — легальный и полезный инструмент: оно позволяет различать «значение не задано» и «задано пустое значение». Возврат «Неопределено» из функции поиска — осознанный контракт, стандартный для типовых конфигураций.

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

Итог

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

«Неопределено» — значение отсутствия данных во встроенном языке 1С. Проверяется только прямым сравнением, не равно NULL, нулю и пустой строке. Обращение к его свойствам и использование в операциях вызывает ошибку, поэтому результат функций поиска всегда проверяйте до использования.

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

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

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

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

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

Почему функция возвращает «Неопределено», хотя оператор Возврат в ней есть?

Проверьте, все ли ветки логики достигают оператора Возврат. Если Возврат стоит внутри условия или цикла и ни одно условие не выполнилось, функция завершится без возврата значения и вернёт «Неопределено». Добавьте Возврат в конец тела функции со значением по умолчанию.

Как вывести «Неопределено» в сообщение без ошибки?

Функция Строка() корректно преобразует «Неопределено» в строку «Неопределено», поэтому Сообщить(Строка(Значение)) безопасен. Ошибка возникнет только при попытке сложить «Неопределено» со строкой напрямую через оператор «+» без явного преобразования.

Что делать, если в отчёте СКД в ячейке отображается «Неопределено»?

Проверьте выражения вычисляемых полей и ресурсов: одно из них возвращает «Неопределено» при определённых данных. Также посмотрите параметры виртуальных таблиц — незаполненный параметр составного типа может давать такой эффект. Оберните проблемное выражение в проверку или задайте значение по умолчанию.

Сработает ли ЗначениеЗаполнено() для проверки на «Неопределено»?

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