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

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

Как удалить элемент из массива в 1С

Как удалить элемент из массива в 1С: методы Удалить(), Найти(), удаление по индексу и значению, циклы, типичные ошибки и готовые примеры кода.

Массив в 1С — это упорядоченная коллекция значений, и удаление элементов из него выполняется встроенным методом Удалить(). Метод принимает индекс элемента, а не само значение, поэтому перед удалением обычно нужно определить позицию нужного элемента. Это ключевой момент, из-за которого у начинающих разработчиков возникает большинство ошибок.

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

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

Метод Удалить(): синтаксис и базовый пример

Метод Удалить() (в английском синтаксисе — Delete()) удаляет элемент массива по его индексу. Индексация в 1С начинается с нуля: первый элемент имеет индекс 0, последний — Количество() - 1.

Массив = Новый Массив;

Массив.Добавить("Яблоко");

Массив.Добавить("Груша");

Массив.Добавить("Слива");

// Удаляем элемент с индексом 1 ("Груша")

Массив.Удалить(1);

// Теперь в массиве: "Яблоко", "Слива"

После удаления все последующие элементы сдвигаются, а их индексы уменьшаются на единицу. Это важно учитывать, если вы удаляете несколько элементов подряд по заранее сохранённым индексам — после первого удаления сохранённые индексы перестанут быть актуальными.

Если передать в метод индекс, выходящий за границы массива (отрицательный или больше либо равный Количество()), платформа выдаст ошибку «Индекс находится за границами массива», и выполнение кода прервётся.

Удаление элемента по значению

Метода «удалить по значению» в 1С нет, поэтому задача решается в два шага: сначала значение ищется методом Найти(), затем найденный индекс передаётся в Удалить().

Если значение в массиве отсутствует, Найти() возвращает Неопределено. Передавать это значение в Удалить() нельзя — будет ошибка. Поэтому проверка результата поиска обязательна.

Индекс = Массив.Найти("Груша");

Если Индекс <> Неопределено Тогда

Массив.Удалить(Индекс);

КонецЕсли;

Метод Найти() возвращает индекс только первого вхождения значения. Если в массиве может быть несколько одинаковых элементов и нужно удалить все, поиск и удаление выполняют в цикле до тех пор, пока Найти() не вернёт Неопределено.

Порядок действий
  1. 1
    Проверьте, что массив создан и заполнен (Количество() > 0)
  2. 2
    Найдите индекс значения через Массив.Найти(Значение)
  3. 3
    Проверьте, что результат не равен Неопределено
  4. 4
    Вызовите Массив.Удалить(Индекс)
  5. 5
    Проверьте результат: Количество() уменьшилось на единицу

Удаление нескольких элементов по условию

Почему нельзя удалять в цикле «Для Каждого»

Распространённая ошибка — перебирать массив циклом Для Каждого Элемент Из Массив Цикл и удалять элементы внутри него. При удалении коллекция изменяется, итератор сбивается: часть элементов пропускается, а в ряде случаев возникает ошибка. Такой код работает непредсказуемо.

Обратный цикл — правильное решение

Надёжный способ — идти по массиву от конца к началу. Тогда удаление текущего элемента не влияет на индексы тех элементов, которые ещё предстоит проверить.

// Удаляем все пустые строки из массива

Для Индекс = -Массив.Количество() + 1 По 0 Цикл

ТекущийИндекс = -Индекс;

Если Массив[ТекущийИндекс] = "" Тогда

Массив.Удалить(ТекущийИндекс);

КонецЕсли;

КонецЦикла;

Альтернативный вариант — использовать переменную-счётчик с шагом минус один через цикл Пока. Суть та же: движение от последнего элемента к первому гарантирует, что сдвиг индексов после удаления не затронет ещё не проверенные позиции.

Альтернатива: сборка нового массива

Если условий фильтрации много или они сложные, часто проще создать новый массив и перенести в него только нужные элементы. Код получается короче и читается легче, а исходная коллекция не изменяется в процессе перебора.

НовыйМассив = Новый Массив;

Для Каждого Элемент Из Массив Цикл

Если Элемент <> "" Тогда

НовыйМассив.Добавить(Элемент);

КонецЕсли;

КонецЦикла;

Массив = НовыйМассив;

Сравнение вариантов

Обратный цикл с Удалить()

Подходит, когда нужно сохранить исходный объект массива (на него есть ссылки) и удаляется немного элементов

Сборка нового массива

Подходит при сложных условиях фильтрации и когда ссылки на исходный массив не важны; код проще и безопаснее

Удалить(Найти()) в цикле

Подходит для удаления всех вхождений одного конкретного значения

Удаление первого, последнего элемента и полная очистка

Частные случаи удаления встречаются постоянно, и для них есть короткие устойчивые конструкции:

  • Удалить первый элемент: Массив.Удалить(0); — перед вызовом проверьте, что массив не пуст.
  • Удалить последний элемент: Массив.Удалить(Массив.Количество() - 1); — та же проверка на пустоту обязательна.
  • Удалить все элементы: Массив.Очистить(); — метод не требует проверок и безопасно работает даже с пустым массивом.

Для реализации очереди или стека на базе массива комбинируйте Добавить() с удалением первого или последнего элемента. При интенсивной работе с началом массива учитывайте, что удаление нулевого элемента вызывает сдвиг всех остальных — на очень больших массивах в цикле это может сказаться на производительности.

Особенности при работе с таблицами значений и списками

Массив — не единственная коллекция в 1С, и методы удаления у них различаются. Если в переменной на самом деле таблица значений или список значений, применяйте правильные методы, иначе получите ошибку «Метод объекта не обнаружен».

КоллекцияУдаление по индексуОсобенности
МассивУдалить(Индекс)Поиск индекса через Найти(Значение)
Список значенийУдалить(Индекс) или Удалить(Элемент)Можно удалить сразу по ссылке на элемент списка
Таблица значенийУдалить(Строка)Принимает строку таблицы, а не числовой индекс
Фиксированный массивНедоступноИзменять нельзя, только создать новый массив на его основе

Отдельно отметим фиксированный массив (ФиксированныйМассив): он неизменяем, и методов Удалить() и Добавить() у него нет. Чтобы получить изменённую версию, создайте обычный массив из фиксированного, выполните операции и при необходимости сформируйте новый фиксированный массив.

Типичные ошибки
01
Вызов Удалить(Найти(Значение)) без проверки на Неопределено — ошибка выполнения, если значения нет в массиве
02
Удаление элементов внутри цикла Для Каждого — пропуск элементов и непредсказуемый результат
03
Использование сохранённых индексов после первого удаления — индексы сдвигаются, удаляется не тот элемент
04
Попытка удалить из фиксированного массива — метод отсутствует, код падает с ошибкой
05
Удаление из пустого массива без проверки Количество() > 0 — ошибка выхода за границы массива

Проверка результата и отладка

После удаления убедитесь, что результат соответствует ожиданию. Простейший способ — сравнить значение Количество() до и после операции: оно должно уменьшиться ровно на число удалённых элементов.

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

Для Каждого Элемент Из Массив Цикл

Сообщить(Элемент);

КонецЦикла;

При отладке в конфигураторе поставьте точку останова после удаления и посмотрите содержимое массива через «Вычислить выражение» (Shift+F9). Так видно не только количество, но и порядок оставшихся элементов, что помогает поймать ошибки со сдвигом индексов.

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

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

Количество() после удаления
Норма

Уменьшилось на число удалённых элементов

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

Не изменилось — удаление не выполнилось, проверьте условие

Содержимое массива
Норма

Удалён именно нужный элемент, порядок остальных сохранён

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

Удалён другой элемент — сбились индексы после предыдущего удаления

Выполнение кода
Норма

Код отработал без исключений

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

Ошибка «Индекс за границами массива» — нет проверки индекса или результата Найти()

Итог

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

Удаление из массива выполняется методом Удалить(Индекс). Значение сначала ищут через Найти() с обязательной проверкой на Неопределено. Массовое удаление по условию делают обратным циклом или сборкой нового массива, а полную очистку — методом Очистить(). Фиксированные массивы изменять нельзя.

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

Как удалить элемент массива по значению, а не по индексу?

Прямого метода нет. Используйте связку: найдите индекс через Массив.Найти(Значение), проверьте, что результат не равен Неопределено, и передайте его в Массив.Удалить(Индекс). Без проверки код упадёт с ошибкой, если значения в массиве нет.

Как удалить все одинаковые элементы из массива?

Организуйте цикл: пока Массив.Найти(Значение) не вернёт Неопределено, удаляйте найденный индекс. Альтернатива — собрать новый массив, добавляя в него только элементы, не равные удаляемому значению.

Почему при удалении в цикле пропускаются элементы?

При удалении элемента все последующие сдвигаются на одну позицию, а счётчик цикла продолжает расти, поэтому следующий после удалённого элемент оказывается пропущенным. Решение — обратный цикл от конца массива к началу или сборка нового массива.

Чем отличается Очистить() от присваивания Новый Массив?

Очистить() опустошает существующий объект, и все переменные, ссылающиеся на него, увидят пустой массив. Присваивание Новый Массив создаёт отдельный объект: другие переменные продолжат работать со старым массивом и прежними данными.

Можно ли удалить элемент из фиксированного массива?

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

Как удалить последний элемент массива без ошибки?

Сначала проверьте, что массив не пуст: Если Массив.Количество() > 0. Затем вызовите Массив.Удалить(Массив.Количество() - 1). Без проверки на пустом массиве получите ошибку выхода индекса за границы.