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