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

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

Как удалить строку из массива в 1С

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

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

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

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

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

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

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

Массив.Добавить("Первая строка");

Массив.Добавить("Вторая строка");

Массив.Добавить("Третья строка");

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

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

// Теперь в массиве два элемента:

// индекс 0 — "Первая строка", индекс 1 — "Третья строка"

Сообщить(Массив.Количество()); // выведет 2

Обратите внимание: если передать в метод индекс, которого нет в массиве (отрицательный или больше либо равный количеству элементов), платформа выдаст ошибку выполнения. Поэтому перед удалением индекс стоит проверять.

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

На практике чаще известно не положение элемента, а его содержимое. Для этого используется связка двух методов: Найти() возвращает индекс первого найденного элемента, а Удалить() удаляет его по этому индексу.

Индекс = Массив.Найти("Вторая строка");

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

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

КонецЕсли;

Критически важно проверять результат метода Найти(): если значение в массиве отсутствует, метод вернёт Неопределено. Передача Неопределено в Удалить() приведёт к ошибке, поэтому проверка через Если ... Тогда обязательна.

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

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

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

Обход массива с конца

Классическое решение — идти по массиву от последнего элемента к первому. Тогда удаление текущего элемента не влияет на индексы тех, что ещё не проверены:

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

Индекс = Массив.Количество() - Инд;

Если Не ЗначениеЗаполнено(Массив[Индекс]) Тогда

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

КонецЕсли;

КонецЦикла;

Формирование нового массива

Альтернатива — не удалять элементы, а собрать новый массив только из нужных значений. Этот способ проще для чтения и безопаснее, особенно когда условий отбора несколько:

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

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

Если ЗначениеЗаполнено(Элемент) Тогда

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

КонецЕсли;

КонецЦикла;

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

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

Обход с конца и Удалить()

Подходит, когда нужно изменить именно исходный массив, на который могут быть другие ссылки. Требует аккуратности с индексами.

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

Проще и безопаснее, не зависит от сдвига индексов. Не подходит, если другой код должен увидеть изменения в исходном объекте массива.

Удаление всех элементов и очистка массива

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

Массив = Новый Массив; // массив очищен

Этот приём работает быстрее, чем последовательное удаление каждого элемента, и не требует контроля индексов. Однако он уместен, только если на исходный массив нет внешних ссылок: методы, которым массив был передан как параметр, продолжат работать со старым объектом.

Типичные ошибки при удалении элементов

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

  • Удаление по индексу без проверки границ — попытка удалить элемент, которого нет, завершает код ошибкой;
  • обход массива от начала к концу с удалением внутри цикла — элементы пропускаются из-за сдвига индексов;
  • использование результата Найти() без проверки на Неопределено;
  • ожидание, что Найти() удалит все одинаковые значения — метод возвращает только первое вхождение;
  • сравнение значений разных типов: строка «5» и число 5 считаются разными значениями, и Найти() вернёт Неопределено.
Типичные ошибки
01
Удаление в цикле Для Каждого — изменять коллекцию, по которой идёт итерация, нельзя: это приводит к ошибке или пропуску элементов
02
Нет проверки результата Найти() на Неопределено — программа падает при отсутствии значения
03
Смешение типов при поиске: число и строка с одинаковым написанием не считаются равными
04
Попытка удалить из массива, полученного из свойства объекта только для чтения, — изменения не сохранятся

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

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

Было = Массив.Количество();

// ... удаление ...

Сообщить("Удалено элементов: " + (Было - Массив.Количество()));

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

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

КонецЦикла;

В конфигураторе удобно использовать точку останова и окно «Вычислить выражение»: достаточно ввести имя переменной с массивом, чтобы увидеть все элементы и их индексы. Это надёжнее, чем вывод сообщений, при отладке сложной логики.

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

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

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

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

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

Не изменилось или уменьшилось больше, чем ожидалось

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

Нужный элемент отсутствует, остальные на месте

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

Удалён не тот элемент или остались лишние значения

Повторный вызов Найти() для удалённого значения
Норма

Возвращает Неопределено

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

Возвращает индекс — значит, удалено не всё или не то

Когда массив не подходит: альтернативные коллекции

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

Выбор коллекции стоит делать до написания основной логики: замена типа коллекции в готовом коде обычно требует переработки всех мест обращения к ней.

Маршрут решения

Как выбрать действие

Известен индекс элементаВызовите Массив.Удалить(Индекс), предварительно проверив границы
Известно только значениеНайдите индекс через Найти(), проверьте на Неопределено и удалите
Нужно удалить много элементов по условиюОбходите массив с конца или соберите новый массив без лишних элементов
Часто удаляете по значениюРассмотрите соответствие вместо массива
Итог

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

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

Часто задаваемые вопросы

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

Вызовите Массив.Удалить(Массив.Количество() - 1). Поскольку индексация начинается с нуля, индекс последнего элемента всегда на единицу меньше количества. Перед удалением убедитесь, что массив не пуст.

Можно ли удалить элемент массива внутри цикла Для Каждого?

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

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

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

Чем удаление из массива отличается от удаления строки таблицы значений?

У массива метод Удалить() принимает индекс (число), а у таблицы значений — сам объект строки таблицы. Кроме того, у таблицы значений есть методы поиска строк по отбору, которых у массива нет.

Что произойдёт, если удалить элемент по несуществующему индексу?

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

Как удалить элементы массива на управляемой форме?

Логика та же: метод Удалить(Индекс) доступен и в клиентском, и в серверном контексте. Если массив связан с данными формы, после изменения проверьте, что отображение на форме обновилось корректно.