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

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

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

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

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

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

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

Замена значения по известному индексу

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

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

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

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

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

Массив[1] = "Заменён";

// Теперь массив содержит: "Первый", "Заменён", "Третий"

Альтернатива — метод Установить(), который делает то же самое, но читается явнее в длинных выражениях:

Массив.Установить(1, "Заменён");

Оба варианта равнозначны по результату. Разница только в стиле: квадратные скобки короче, метод Установить() иногда удобнее при передаче массива как параметра или в обобщённом коде. Перед заменой убедитесь, что индекс существует:

Индекс = 1;

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

Массив[Индекс] = "Заменён";

КонецЕсли;

Замена по значению: сначала найти, потом заменить

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

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

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

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

КонецЕсли;

Метод Найти() сравнивает значения по равенству. Для строк сравнение учитывает регистр символов: «Товар» и «товар» — разные значения. Для ссылок на объекты базы данных сравнение идёт по идентичности ссылки, что обычно удобно при работе со списками документов или элементов справочников.

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

Порядок действий при замене по значению
  1. 1
    Вызовите Массив.Найти(ИскомоеЗначение) и сохраните результат в переменную
  2. 2
    Проверьте, что результат не равен Неопределено
  3. 3
    Присвойте новое значение по найденному индексу
  4. 4
    Проверьте результат: выведите элемент массива по индексу или количество замен

Массовая замена всех вхождений значения

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

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

Если Массив[Индекс] = "СтароеЗначение" Тогда

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

КонецЕсли;

КонецЦикла;

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

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

Замена значений в массиве структур и объектов

Частая ситуация: массив содержит структуры, например строки отобранных данных. Замена поля внутри структуры выполняется через обращение по индексу и затем к ключу:

МассивСтрок[0].Сумма = 1500;

Это работает, потому что структура передаётся по ссылке: изменение поля через элемент массива меняет саму структуру, хранящуюся в массиве. То же справедливо для таблиц значений, списков значений и других объектов внутри массива.

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

Альтернативы: Вставить, Удалить и другие коллекции

Иногда задача формулируется как «заменить», но фактически требуется другое действие. Метод Вставить(Индекс, Значение) не заменяет элемент, а добавляет новый, сдвигая последующие вправо. Если цель — замена, использование Вставить() без удаления старого элемента приведёт к дублю.

Если массив используется как список уникальных значений с частым поиском и заменой, рассмотрите соответствие: замена по ключу выполняется одной операцией Соответствие.Вставить(Ключ, НовоеЗначение) без поиска по всей коллекции. Для пар «ключ-значение» это быстрее и проще.

Сравнение вариантов замены

Присваивание по индексу: Массив[Индекс] = Значение

Подходит, когда позиция известна. Требует проверки границ массива.

Метод Установить(Индекс, Значение)

Равнозначен присваиванию; удобен в обобщённом коде и длинных выражениях.

Найти + присваивание

Подходит, когда известно значение, но не позиция. Обязательна проверка на Неопределено.

Цикл по индексам с условием

Подходит для замены всех вхождений или замены по сложному условию.

Соответствие вместо массива

Подходит, если замена идёт по ключу и порядок элементов не важен.

Типичные ошибки и проверка результата

Большинство проблем при замене связано не с самим присваиванием, а с неверным определением позиции или непониманием семантики коллекций.

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

Отдельный случай — фиксированные массивы. Например, свойства некоторых объектов платформы возвращают ФиксированныйМассив, в котором замена элементов запрещена: попытка присваивания вызовет ошибку. Решение — скопировать содержимое в обычный массив, выполнить замену и работать с копией:

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

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

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

КонецЦикла;

НовыйМассив[0] = "Заменён";

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

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

Значение по целевому индексу
Норма

Массив[Индекс] возвращает новое значение

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

Старое значение на месте — замена не выполнилась

Количество элементов
Норма

Количество() не изменилось после замены

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

Массив вырос — вероятно, использован Вставить() вместо замены

Число замен в цикле
Норма

Счётчик замен соответствует ожидаемому количеству вхождений

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

Счётчик равен нулю — значение не найдено, проверьте регистр и тип данных

FAQ

Чем отличается Массив[Индекс] = Значение от Массив.Установить(Индекс, Значение)?

Функционально — ничем, оба варианта заменяют элемент по позиции. Присваивание через скобки короче и привычнее, метод Установить() иногда удобнее в обобщённом коде, где массив передаётся как параметр. Выбор — вопрос стиля команды.

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

Никак — в пустом массиве нет элементов для замены. Проверьте Массив.Количество() = 0 и при необходимости добавьте элемент методом Добавить(). Попытка обратиться к Массив[0] в пустом массиве вызовет ошибку выхода за границы.

Почему Найти() не находит значение, которое точно есть в массиве?

Чаще всего причины три: разный регистр строк, наличие неразрывных пробелов или лишних символов в строке, либо несовпадение типов (например, число 5 и строка "5" — разные значения). Проверьте типы через ТипЗнч() и очистите строки функцией СокрЛП().

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

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

Как заменить значение в массиве, хранящемся в реквизите формы?

Получите массив из реквизита, выполните замену и при необходимости запишите его обратно присваиванием реквизита. Если реквизит объявлен как «Произвольный» или массив получен из значения, изменения копии могут не отразиться в форме без явной перезаписи реквизита.

Итог

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

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