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

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

Как очистить фиксированный массив в 1С

Как очистить фиксированный массив в 1С: почему метод Очистить() не работает, рабочие способы через новый массив, обход значений и обработку ошибок с примерами кода.

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

Фиксированные массивы встречаются в типовых механизмах платформы: их возвращают многие функции БСП, методы работы со строками, коллекции свойств объектов метаданных и параметры обработчиков событий. Разработчик часто получает такой массив «на входе» и должен корректно обнулить его, отфильтровать или подготовить к повторному использованию. Ниже разобраны все рабочие приёмы с примерами кода и типичными ошибками.

Почему фиксированный массив нельзя очистить напрямую

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

Доступны только операции чтения: обращение по индексу, методы Количество(), Найти(), ВГраница() и обход в цикле Для Каждого. Любая попытка модификации вызывает ошибку времени выполнения, поэтому «очистка» всегда сводится к замене самого значения переменной, а не к изменению содержимого существующего объекта.

Способ 1. Присвоить переменной новый пустой массив

Самый простой и универсальный приём — заменить значение переменной новым пустым массивом. Если дальнейший код не требует именно фиксированного типа, достаточно обычного массива:

ФиксМассив = Новый Массив; // переменная "очищена"

Если по логике программы переменная должна оставаться фиксированным массивом (например, её тип проверяется дальше или значение передаётся в процедуру, ожидающую ФиксированныйМассив), создайте пустой фиксированный массив через конструктор:

ФиксМассив = Новый ФиксированныйМассив(Новый Массив);

После такого присваивания ФиксМассив.Количество() вернёт 0. Старый объект коллекции будет уничтожен сборщиком мусора, как только на него не останется ссылок. Это безопасная операция: она не затрагивает другие переменные, если только они не ссылались на тот же самый объект.

bsl
// Очистка фиксированного массива заменой значения
ФиксМассив = Новый ФиксированныйМассив(Новый Массив);
Если ФиксМассив.Количество() = 0 Тогда
    // массив успешно очищен
КонецЕсли;

Способ 2. Создать новый массив с отфильтрованными элементами

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

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

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

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

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

КонецЕсли;

КонецЦикла;

ФиксМассив = Новый ФиксированныйМассив(НовыйМассив);

Такой подход решает сразу две задачи: данные очищаются от лишнего, а тип коллекции сохраняется. Обратите внимание на порядок: сначала заполняется обычный массив, и только потом он оборачивается в фиксированный. Пытаться модифицировать исходную коллекцию внутри цикла обхода — бессмысленно и приведёт к ошибке.

Способ 3. Проверка типа перед очисткой

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

Если ТипЗнч(Коллекция) = Тип("ФиксированныйМассив") Тогда

Коллекция = Новый ФиксированныйМассив(Новый Массив);

ИначеЕсли ТипЗнч(Коллекция) = Тип("Массив") Тогда

Коллекция.Очистить();

КонецЕсли;

Такая развилка особенно актуальна в общих модулях, куда данные приходят из разных источников: часть функций БСП возвращает фиксированные коллекции, а прикладной код чаще работает с обычными массивами. Явная проверка типа делает поведение предсказуемым и упрощает отладку.

Очистка фиксированного массива в реквизитах и параметрах

Реквизит формы и модуля

Если фиксированный массив хранится в переменной модуля или реквизите, присваивание нового пустого массива выполняется точно так же — ограничений нет. Осторожность нужна только при работе с реквизитами формы: убедитесь, что тип реквизита допускает хранение произвольного значения, иначе присваивание может завершиться ошибкой преобразования.

Параметр процедуры, переданный по значению

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

Порядок действий
  1. 1
    Определите, где хранится фиксированный массив: локальная переменная, реквизит или параметр
  2. 2
    Решите, нужен ли на выходе именно ФиксированныйМассив или достаточно обычного массива
  3. 3
    Присвойте переменной Новый Массив либо Новый ФиксированныйМассив(Новый Массив)
  4. 4
    Если нужно вернуть результат из процедуры — используйте Возврат или параметр без Знач
  5. 5
    Проверьте результат через Количество() = 0

Типичные ошибки и как их избежать

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

Третья ошибка — ложное ожидание, что очистка одной переменной очистит данные везде. Например, если фиксированный массив был сохранён в дополнительном свойстве объекта или в параметре сеанса, замена локальной переменной ничего там не изменит — нужно явно обновить каждое место хранения.

Типичные ошибки
01
Вызов Очистить() у ФиксированныйМассив — ошибка исполнения, метод отсутствует у этого типа
02
Попытка удалить элементы в цикле обхода — коллекция неизменяема, нужен новый массив
03
Очистка только локальной переменной при хранении копии в реквизите или свойстве объекта — данные остаются
04
Возврат обычного массива туда, где вызывающий код ждёт ФиксированныйМассив — ошибка несоответствия типов

Сравнение подходов к очистке

ПодходРезультатКогда применять
Новый МассивПустой обычный массивТип коллекции дальше не важен
Новый ФиксированныйМассив(Новый Массив)Пустой фиксированный массивНужно сохранить исходный тип
Фильтрация в новый массивМассив без лишних элементовЧастичная очистка по условию
НеопределеноПеременная не содержит массиваПризнак «данных нет», требует проверок перед обращением

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

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

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

Количество() после очистки
Норма

Возвращает 0

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

Ошибка вызова метода — значит присвоено Неопределено или другой тип

ТипЗнч() переменной
Норма

ФиксированныйМассив или Массив — как задумано

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

Неопределено там, где код ожидает коллекцию

Обход Для Каждого
Норма

Цикл выполняется без ошибок, итераций нет

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

Исключение при входе в цикл

FAQ

Можно ли очистить фиксированный массив методом Очистить()?

Нет. У типа ФиксированныйМассив этого метода нет — коллекция неизменяема. Очистка выполняется присваиванием переменной нового пустого массива.

Чем ФиксированныйМассив отличается от обычного Массива?

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

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

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

Что лучше присвоить: пустой массив или Неопределено?

Обычно удобнее пустой массив: циклы и проверки Количество() = 0 работают без дополнительных условий. Неопределено оправдано, когда нужно явно отличать состояние «данных нет вообще», но тогда весь код обращения требует проверок.

Очистится ли массив в вызывающем коде, если я очистил параметр процедуры?

Нет, если параметр передан по значению (со словом Знач или по умолчанию для присваивания внутри). Чтобы изменение отразилось снаружи, верните новый массив через Возврат или используйте параметр-переменную.

Как узнать, что функция вернула именно фиксированный массив?

Проверьте тип конструкцией ТипЗнч(Значение) = Тип("ФиксированныйМассив"). Это надёжный способ выбрать правильный сценарий очистки в универсальном коде.

Итог

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

Фиксированный массив в 1С неизменяем: очистить его можно только заменой значения переменной на Новый Массив или Новый ФиксированныйМассив(Новый Массив). Для частичной очистки формируйте новый массив с отфильтрованными элементами и проверяйте результат через Количество().