Как исправить ошибку «Значение не является значением объектного типа (Добавить)» при работе с массивом в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе «1С:Предприятие 8» программисты часто сталкиваются с ситуацией, когда код кажется абсолютно верным, но система выдает ошибку исполнения. Одна из самых коварных ошибок — Значение не является значением объектного типа (Добавить). На первый взгляд может показаться, что проблема в данных, которые мы пытаемся добавить в коллекцию, но на самом деле причина кроется глубже. Разберем эту ситуацию подробно на примере добавления групп справочника в массив.

Анализ исходной ситуации

Рассмотрим фрагмент кода, который вызывает затруднение у разработчика:


МассивГрупп = Новый Массив; 
ИскомаяПапка = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию(СокрЛП(СтрокаГруппы.Представление)); 
МассивГрупп.Добавить(ИскомаяПапка);

При выполнении этого кода в модуле отчета (например, в процедуре ПриКомпоновкеРезультата) система сообщает, что метод Добавить не может быть вызван. Это означает, что переменная, стоящая слева от точки (в нашем случае МассивГрупп), не является объектом (массивом), а имеет значение Неопределено, NULL или относится к примитивному типу данных.

Причина №1: Визуально неразличимые опечатки (Омографы)

Проанализируем самую частую и «невидимую» причину — использование символов разной раскладки. В русском языке и латинице есть буквы, которые выглядят идентично: «а», «е», «р», «о», «с», «у», «х». Для компилятора 1С переменная МассивГрупп (все буквы русские) и МaссивГрупп (где «а» — латинская) — это два разных идентификатора.

Выясним, как это работает на практике:

  1. Вы объявляете массив: МассивГрупп = Новый Массив; (используя одну раскладку).
  2. Ниже по тексту вы вызываете метод: МaссивГрупп.Добавить(...) (случайно переключив раскладку на одной букве).
  3. Поскольку вторая переменная не была инициализирована, её значение равно Неопределено.
  4. Попытка вызвать метод у Неопределено закономерно приводит к ошибке объектного типа.

Совет: Чтобы быстро проверить это, попробуйте переписать имя переменной вручную в обеих строках или воспользуйтесь поиском по тексту (Ctrl+F). Если поиск находит только одну строку вместо двух — перед вами омограф.

Причина №2: Область видимости и контекст исполнения

Рассмотрим ситуацию, когда код выполняется в модуле объекта отчета. В 1С существует несколько областей, где может быть объявлена переменная:

Проанализируем код в контексте процедуры ПриКомпоновкеРезультата. Если вы создаете массив в одном условии Если... Тогда, а пытаетесь добавить в него данные в другом, и первое условие не выполнилось — объект не будет создан. Всегда проверяйте инициализацию переменной непосредственно перед использованием или в самом начале блока выполнения.

Причина №3: Особенности работы с группами справочников

Хотя ошибка «Значение не является значением объектного типа» указывает на проблему с самим массивом, важно правильно получать и данные для него. Разберем работу метода НайтиПоНаименованию. Если в справочнике НоменклатурныеГруппы существуют группа и элемент с одинаковым названием, метод вернет тот объект, который встретит первым в базе данных.

Для гарантированной работы с группами рекомендуется использовать проверку:


ИскомаяПапка = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию(НаименованиеГруппы);
Если Не ИскомаяПапка.Пустая() И ИскомаяПапка.ЭтоГруппа Тогда
    МассивГрупп.Добавить(ИскомаяПапка);
КонецЕсли;

Стоит отметить, что даже если ИскомаяПапка будет иметь значение ПустаяСсылка, метод Добавить у массива сработает. Ошибка объектного типа возникает только тогда, когда «сломан» сам контейнер (массив).

Причина №4: Типизация в коллекциях (Массив vs СписокЗначений)

Иногда разработчики путают объекты Массив и СписокЗначений. Несмотря на то, что у обоих есть метод Добавить, они ведут себя по-разному при передаче в запросы или параметры СКД. Если в коде переменной МассивГрупп было случайно присвоено значение другого типа (например, результат запроса, который вернул NULL), метод Добавить перестанет существовать для этой переменной.

Посмотрим на пример правильной диагностики типа переменной перед использованием:


// Перед добавлением проверим, действительно ли это массив
Если ТипЗнч(МассивГрупп) <> Тип("Массив") Тогда
    Сообщить("Ошибка: Переменная МассивГрупп не является массивом. Текущий тип: " + ТипЗнч(МассивГрупп));
    Возврат;
КонецЕсли;
МассивГрупп.Добавить(ИскомаяПапка);

Как предотвратить подобные ошибки в будущем?

Подведем итог и составим план действий для отладки подобных ситуаций:

  1. Используйте отладчик: Установите точку останова на строке с ошибкой. Посмотрите значение переменной в табло. Если тип значения Неопределено — ищите место инициализации.
  2. Проверка раскладки: Используйте функции текстовых редакторов или расширений конфигуратора для поиска латинских букв в русском тексте.
  3. Явное именование: Старайтесь называть переменные так, чтобы они не пересекались с именами реквизитов отчета или параметров СКД. Вместо МассивГрупп можно использовать СписокВыбранныхГруппНоменклатуры.
  4. Контроль типов: Если переменная передается через несколько процедур (особенно между клиентом и сервером), убедитесь, что она не теряет свой тип при преобразовании в структуру или помещении во временное хранилище.

Соблюдение этих правил и внимательное отношение к именованию переменных позволит вам избежать досадных ошибок и сэкономить время на отладке кода.

← На главную