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