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