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

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

Фиксированный массив в 1С: назначение, отличия и практика применения

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

Фиксированный массив (ФиксированныйМассив) — это разновидность коллекции в языке 1С, содержимое которой нельзя изменить после создания. Элементы можно читать по индексу, перебирать в цикле, проверять количество, но нельзя добавить, удалить или заменить ни один элемент. Такая «заморозка» сделана намеренно: она гарантирует, что данные, переданные в процедуру или полученные из системного механизма, останутся в исходном виде на всём пути их использования.

Разработчики чаще всего сталкиваются с фиксированным массивом не потому, что создали его сами, а потому что платформа вернула его из типового механизма: из параметров сеанса, из обработчиков ожидания, из структур настроек, из параметров формы. Попытка выполнить Добавить() или присвоить значение по индексу в этом случае завершается ошибкой, и новичку не всегда понятно, почему «обычный массив» ведёт себя странно.

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

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

Обычный массив (Массив) поддерживает полный набор модифицирующих операций: Добавить(), Вставить(), Удалить(), Очистить(), а также присваивание значения по индексу Массив[0] = Значение. Фиксированный массив все эти операции запрещает: доступны только чтение по индексу, обход в цикле Для Каждого, методы Количество(), Найти(), ВГраница() и получение индекса элемента.

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

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

Зачем платформе нужна неизменяемость

Главная причина появления фиксированных коллекций в платформе — безопасность общих данных. Многие системные механизмы 1С хранят значения, которые используются одновременно разными частями конфигурации: настройки, параметры сеанса, описания типов. Если бы эти данные передавались в виде обычного массива, любая процедура могла бы случайно или намеренно изменить общий список, и ошибка проявилась бы в непредсказуемом месте.

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

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

Где фиксированный массив встречается на практике

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

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

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

ТипЗнч() в отладчикеФиксированныйМассив

Проверьте тип переменной в табло или через ТипЗнч()

Ошибка при Добавить()Метод недоступен

Если Добавить() вызывает исключение — вероятно, коллекция фиксированная

Источник данныхПараметры сеанса, настройки

Значения из системных механизмов почти всегда фиксированы

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

Создание всегда идёт через промежуточный обычный массив. Сначала формируется изменяемая коллекция, затем она передаётся в конструктор фиксированного массива. Чтение ничем не отличается от работы с обычным массивом: доступны обращение по индексу, цикл Для Каждого, проверка границ.

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

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

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

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

// Чтение работает как обычно

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

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

КонецЦикла;

// А вот это вызовет ошибку:

// Фиксированный.Добавить("Кладовщик");

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

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

Как изменить данные, если массив фиксированный

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

// ФиксированныйМассив получен извне, например из параметра сеанса

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

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

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

КонецЦикла;

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

НовыйФиксированный = Новый ФиксированныйМассив(Изменяемый);

Этот приём особенно важен при работе с параметрами сеанса: прочитали фиксированный массив, развернули в обычный, дополнили, зафиксировали и записали обратно. Попытка «сэкономить» и обойти неизменяемость каким-либо трюком не сработает — платформа контролирует тип на уровне ядра.

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

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

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

Маршрут решения

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

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

Типичные ошибки и ограничения

Самая распространённая ошибка — попытка вызвать Добавить() или присвоить значение по индексу у фиксированного массива. Платформа выдаёт исключение, но текст ошибки не всегда очевидно указывает на причину, поэтому полезно сразу проверять тип через ТипЗнч(), если источник коллекции неизвестен.

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

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

Типичные ошибки
01
Вызов Добавить() у фиксированного массива — исключение и остановка кода
02
Ожидание глубокой неизменяемости: элементы-объекты внутри по-прежнему изменяемы
03
Фиксация массива внутри цикла — лишние копии и потеря производительности
04
Сравнение фиксированного и обычного массива по ссылке вместо поэлементного сравнения
Итог

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

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

Частые вопросы о фиксированном массиве

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

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

Почему в параметрах сеанса нельзя хранить обычный массив?

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

Как проверить, является ли переменная фиксированным массивом?

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

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

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

Есть ли аналоги фиксированного массива для других коллекций?

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

Почему элементы фиксированного массива всё равно можно менять?

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