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