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