При разработке отчетов и обработок в 1С часто возникает ситуация, когда код, успешно работающий с данными, внезапно выдает исключение при отсутствии записей в выборке. Рассмотрим, почему возникает ошибка Значение не является значением объектного типа и как сделать ваш код надежным и устойчивым к пустым результатам запроса.
Ошибка Значение не является значением объектного типа обычно сигнализирует о попытке обратиться к свойству или методу переменной, которая не является объектом. В контексте работы с запросами чаще всего виновата переменная, которая должна содержать строку выборки (например, ТекСтрока), но оказалась равной Неопределено или NULL.
Когда запрос выполняется, но не возвращает ни одной записи, цикл обхода результата (Для каждого из...) не выполняется ни разу. Если после цикла вы пытаетесь обратиться к полям этой выборки, система не находит объекта, к которому можно обратиться через «точку», и прерывает выполнение программы.
Самый правильный архитектурный подход — проверять результат выполнения запроса на наличие данных сразу после его выполнения. Если данных нет, нет смысла пытаться выводить пустые или некорректные области в ТабличныйДокумент. Разберем этот подход по шагам:
Запрос.Выполнить().Выгрузить().Посмотрим на пример реализации:
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если ЗначениеЗаполнено(РезультатЗапроса) Тогда
// Формируем отчет, так как данные есть
ТабличныйДокумент = Новый ТабличныйДокумент;
// ... ваш код вывода шапки и строк ...
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьПодвал.Параметры.ВидГСМ = ТекСтрока.ГСМ;
ТабличныйДокумент.Вывести(ОбластьПодвал);
Иначе
// Обрабатываем ситуацию отсутствия данных
Предупреждение("За указанный период данных не найдено!");
КонецЕсли;
Если вам все же необходимо выводить форму даже при отсутствии данных, необходимо позаботиться о том, чтобы переменные, используемые в подвале или других областях, имели заранее заданное значение. Рассмотрим подробнее этот метод:
ВидГСМ = "";).ТекСтрока.Этот подход гарантирует, что даже если цикл обхода РезультатЗапроса не сработает, в Параметры области подвала будет передано «безопасное» пустое значение, а не Неопределено.
Если проблема возникает локально только в одной строке вывода, самый быстрый способ предотвратить сбой — принудительно задать пустое значение для параметра перед выводом. Это часто применяется в простых печатных формах.
Посмотрим на пример:
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
// Если мы не уверены в наличии данных, задаем значение по умолчанию
ОбластьПодвал.Параметры.ВидГСМ = "";
ТабличныйДокумент.Вывести(ОбластьПодвал);
Чтобы в будущем оперативно находить подобные места, проанализируем инструменты 1С:
Неопределено.ТипЗнч(), чтобы убедиться, что переменная содержит именно тот тип данных, который вы ожидаете.РезультатЗапроса всегда проверяйте наличие данных методом РезультатЗапроса.Пустой() перед началом циклической обработки.Применение этих методов позволит вам писать более качественный и стабильный код, который не будет «падать» при малейшем изменении входных данных. Помните, что надежность приложения начинается с обработки исключительных ситуаций, таких как пустые выборки!