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