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