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