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

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

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

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

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

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

Прямое присвоение значения по индексу

Основной способ изменить элемент массива — обратиться к нему по индексу и присвоить новое значение. Индексы в 1С начинаются с нуля: первый элемент — Массив[0], второй — Массив[1] и так далее.

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

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

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

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

Массив[1] = "Апрель"; // теперь второй элемент равен "Апрель"

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

Значение может быть любого типа: строка, число, дата, ссылка на объект базы, структура или даже другой массив. Тип нового значения не обязан совпадать с типом старого.

Изменение элемента в цикле

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

// НЕ сработает: изменится только локальная переменная

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

Элемент = Элемент * 2; // массив не изменился

КонецЦикла;

// Правильно: обращение по индексу

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

Массив[Индекс] = Массив[Индекс] * 2;

КонецЦикла;

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

Изменение вложенных значений: структуры и объекты в массиве

Если элемент массива — структура или ссылочный объект, менять его можно двумя разными способами, и важно понимать разницу. Первый — заменить элемент целиком: Массив[0] = НоваяСтруктура. Второй — изменить свойство существующего объекта: Массив[0].Цена = 100.

СтрокаДанных = Новый Структура("Товар, Цена", "Кабель", 150);

Массив.Добавить(СтрокаДанных);

Массив[0].Цена = 200; // изменилось свойство структуры внутри массива

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

Проверка границ массива перед изменением

Обращение к несуществующему индексу вызывает ошибку «Индекс находится за границами массива». Перед присвоением убедитесь, что индекс в допустимом диапазоне — от нуля до Количество() - 1.

Индекс = 5;

Если Индекс >= 0 И Индекс < Массив.Количество() Тогда

Массив[Индекс] = НовоеЗначение;

Иначе

// индекс вне массива — обработать ситуацию

КонецЕсли;

Отдельный случай — пустой массив. У него Количество() равно нулю, и любое обращение по индексу приведёт к ошибке. Если массив мог не заполниться, проверяйте его длину до начала работы.

Безопасное изменение элемента
  1. 1
    Убедитесь, что массив создан и заполнен: Массив.Количество() > 0
  2. 2
    Вычислите или получите индекс нужного элемента
  3. 3
    Проверьте, что индекс в диапазоне от 0 до Количество() - 1
  4. 4
    Присвойте новое значение: Массив[Индекс] = Значение
  5. 5
    Проверьте результат, прочитав элемент обратно или выведя в сообщение

Альтернативы: вставка, удаление и замена диапазона

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

МетодЧто делаетМеняет ли длину массива
Массив[Инд] = ЗнЗаменяет значение по индексуНет
Вставить(Инд, Зн)Вставляет элемент, сдвигая остальныеДа, +1
Установить(Инд, Зн)Аналог присвоения по индексуНет
Удалить(Инд)Удаляет элемент со сдвигомДа, −1

Метод Установить() работает так же, как присвоение через квадратные скобки, — выбор между ними вопрос стиля. А вот путать замену со вставкой нельзя: Вставить() раздвигает массив, и все последующие индексы смещаются.

Замена или вставка

Присвоение по индексу

Подходит, когда позиция известна и длина массива должна остаться прежней

Вставить()

Подходит, когда нужно добавить значение в середину без потери существующих элементов

Удалить() + Добавить()

Подходит для переноса элемента в конец или полной перестройки массива

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

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

Типичные ошибки
01
Обращение к Массив[Количество()] — последний допустимый индекс на единицу меньше, возникает ошибка выхода за границы
02
Присвоение переменной цикла «Для Каждого» вместо обращения по индексу — массив остаётся без изменений
03
Изменение массива одновременно с его перебором при удалении элементов — сдвиг индексов приводит к пропуску элементов
04
Ожидание, что структура в массиве — копия: изменение её свойств затрагивает все места, где она используется

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

Итог

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

Элемент массива изменяется присвоением по индексу с нулевой нумерацией. В цикле «Для Каждого» менять нужно через Массив[Индекс], а не через переменную цикла. Всегда проверяйте границы массива и помните, что объекты внутри массива хранятся по ссылке.

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

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

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

Почему массив не меняется, хотя я присваиваю значение в цикле «Для Каждого»?

Переменная цикла получает копию значения элемента, а не ссылку на ячейку массива. Используйте цикл со счётчиком Для Индекс = 0 По Массив.Количество() - 1 и присваивайте через Массив[Индекс].

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

Да. Массив передаётся по ссылке, поэтому изменения элементов внутри процедуры видны в вызывающем коде. Но если внутри процедуры присвоить параметру новый массив через Параметр = Новый Массив, связь с исходным массивом потеряется.

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

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

Чем присвоение по индексу отличается от метода Установить()?

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