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

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

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

Как создать фиксированный массив в 1С: синтаксис ФиксированныйМассив, отличия от обычного массива, проверка типа, типичные ошибки и практические примеры кода.

Фиксированный массив в 1С — это коллекция, содержимое которой нельзя изменить после создания: нельзя добавить или удалить элементы, а также присвоить элементу новое значение. Такой тип применяется там, где данные должны оставаться неизменными на протяжении всего времени использования, например при передаче наборов параметров между процедурами или при возврате результатов из функций.

Встроенный язык 1С не позволяет создать фиксированный массив «с нуля» конструктором, как обычный массив через Новый Массив. Основной способ — создать обычный массив, заполнить его и затем зафиксировать с помощью конструктора Новый ФиксированныйМассив. Также фиксированные массивы возвращают некоторые методы платформы, например методы работы со строками и коллекциями.

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

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

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

Попытка вызвать у фиксированного массива методы модификации или выполнить присваивание ФиксМассив[0] = НовоеЗначение приведёт к ошибке времени выполнения. Поэтому перед передачей коллекции в код, который не должен её менять, фиксация служит защитой от случайной порчи данных.

ОперацияМассивФиксированныйМассив
Чтение по индексу, обход в циклеДаДа
Количество(), ВГраница(), Найти()ДаДа
Добавить(), Вставить(), Удалить()ДаНет
Присваивание элементу по индексуДаНет
Создание конструкторомНовый МассивНовый ФиксированныйМассив(Массив)

Создание фиксированного массива из обычного

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

ОбычныйМассив = Новый Массив;

ОбычныйМассив.Добавить("Январь");

ОбычныйМассив.Добавить("Февраль");

ОбычныйМассив.Добавить("Март");

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

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

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

Порядок действий
  1. 1
    Создайте обычный массив: ОбычныйМассив = Новый Массив
  2. 2
    Заполните его методом Добавить() или в цикле
  3. 3
    Зафиксируйте: ФиксМассив = Новый ФиксированныйМассив(ОбычныйМассив)
  4. 4
    Проверьте тип: ТипЗнч(ФиксМассив) = Тип("ФиксированныйМассив")

Создание массива с фиксированным размером

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

// Массив на 12 элементов, все — Неопределено

МесячныеИтоги = Новый Массив(12);

МесячныеИтоги[0] = 150000; // индексация с нуля

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

Откуда ещё берутся фиксированные массивы

Ряд методов платформы возвращает именно фиксированные массивы, и это частая причина неожиданных ошибок у разработчиков. Например, функция СтрРазделить() возвращает обычный массив, но некоторые методы работы со свойствами объектов метаданных и универсальные коллекции могут отдавать фиксированные варианты.

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

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

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

// Только чтение

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

// Можно модифицировать

КонецЕсли;

Как получить изменяемую копию

Обратное преобразование делается вручную: создаётся новый обычный массив, и элементы копируются в цикле. Конструктор Новый Массив не принимает фиксированный массив как источник для копирования напрямую.

Изменяемый = Новый Массив;

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

Изменяемый.Добавить(Элемент);

КонецЦикла;

Типичные ошибки
01
Вызов Добавить() у фиксированного массива — ошибка времени выполнения; сначала проверьте тип через ТипЗнч()
02
Присваивание ФиксМассив[0] = Значение — запрещено; измените данные до фиксации или создайте новый фиксированный массив
03
Путаница между Новый Массив(10) и фиксированным массивом — первый лишь задаёт размер, но остаётся изменяемым
04
Ожидание, что изменение исходного массива после фиксации отразится на фиксированном — объекты независимы

Когда фиксированный массив оправдан, а когда нет

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

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

Для хранения пар «ключ-значение» массив вообще не подходит — рассмотрите Структуру, Соответствие или их фиксированные аналоги ФиксированнаяСтруктура и ФиксированноеСоответствие, которые создаются по тому же принципу.

Сравнение вариантов

Обычный массив

Подходит для наполнения, фильтрации и сортировки; не защищён от случайных изменений

ФиксированныйМассив

Подходит для возврата неизменяемых наборов из функций; нельзя модифицировать после создания

Массив с заданным размером

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

Проверка результата и отладка

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

Сообщить("Тип: " + ТипЗнч(ФиксМассив));

Сообщить("Элементов: " + ФиксМассив.Количество());

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

Сообщить(Элемент);

КонецЦикла;

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

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

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

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

Возвращает ФиксированныйМассив

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

Возвращает Массив — фиксация не выполнена

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

Совпадает с числом элементов исходного массива

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

Ноль или меньше ожидаемого — проверьте заполнение до фиксации

Обход в цикле Для Каждого
Норма

Все элементы читаются без ошибок

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

Ошибка обращения по индексу — проверьте границы

Часто задаваемые вопросы

Можно ли создать фиксированный массив без обычного массива?

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

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

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

Сохраняется ли порядок элементов при фиксации?

Да, порядок полностью соответствует порядку элементов в исходном массиве на момент вызова конструктора. Сортировать фиксированный массив после создания нельзя — сортировку выполняйте до фиксации.

Можно ли передать фиксированный массив между клиентом и сервером?

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

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

Фиксированный массив хранит упорядоченный список значений с доступом по индексу, а фиксированная структура — набор именованных пар «ключ-значение» с доступом по имени свойства. Создаются оба типа по схожему принципу: из обычного массива или обычной структуры соответственно.

Итог

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

Фиксированный массив создаётся только из заполненного обычного массива конструктором Новый ФиксированныйМассив. После фиксации коллекция доступна только для чтения, а изменить данные можно лишь через создание новой копии.