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

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

Зачем нужен фиксированный массив в 1С

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

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

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

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

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

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

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

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

Где платформа сама возвращает фиксированный массив

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

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

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

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

Проверьте тип значения через ТипЗнч() — вероятно, это ФиксированныйМассив

Ошибка при присваиванииНевозможно изменить элемент

Коллекция неизменяема — скопируйте её в обычный массив

Источник данныхВстроенный метод платформы

Многие системные функции возвращают именно фиксированные коллекции

Зачем создавать фиксированный массив в своём коде

Передача данных без риска порчи

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

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

Кэширование неизменяемых наборов данных

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

bsl
// Создание фиксированного массива из обычного
ОбычныйМассив = Новый Массив;
ОбычныйМассив.Добавить("Первая");
ОбычныйМассив.Добавить("Вторая");

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

// Чтение работает:
Для Каждого Элемент Из Неизменяемый Цикл
    Сообщить(Элемент);
КонецЦикла;

// А это вызовет ошибку:
// Неизменяемый.Добавить("Третья");

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

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

Учтите: копируются сами элементы, но если элементом является объект-ссылка или другая изменяемая структура (например, структура или соответствие), то фиксируется только состав массива, а не содержимое элементов. Вложенную структуру внутри элемента по-прежнему можно изменить.

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

Типичные ошибки при работе с фиксированными массивами

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

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

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

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

Когда фиксированный массив не нужен

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

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

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

Как выбрать действие

Массив передаётся в другой модуль и не должен менятьсяПередайте Новый ФиксированныйМассив(Массив) — защита на уровне платформы
Получили коллекцию из встроенного метода и нужно её дополнитьСкопируйте элементы в обычный массив и работайте с копией
Массив живёт внутри одной процедурыИспользуйте обычный массив, фиксация не нужна
Нужен доступ по имени, а не по индексуИспользуйте Структуру или ФиксированнуюСтруктуру вместо массива

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

Чтобы убедиться, что код корректно работает с типом коллекции, добавьте в спорных местах проверку ТипЗнч(Значение) = Тип("ФиксированныйМассив") или выведите тип в сообщение при отладке. Это занимает секунды и сразу объясняет, почему «массив не добавляет элемент».

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

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

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

Тип коллекции
Норма

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

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

Тип отличается от ожидаемого — источник данных возвращает другую коллекцию

Поведение процедуры
Норма

Процедура одинаково работает с обычным и фиксированным массивом

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

На фиксированном массиве возникает ошибка — внутри есть скрытая модификация

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

Совпадает с исходной коллекцией

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

Меньше или больше — ошибка в цикле копирования

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

Итог

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

Фиксированный массив защищает состав коллекции от изменений. Платформа возвращает его из ряда встроенных методов, а разработчик создаёт через Новый ФиксированныйМассив() при передаче данных между модулями. Для модификации коллекцию копируют в обычный массив; содержимое элементов-структур при этом не защищается.

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

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

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

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

Штатного способа изменить состав фиксированного массива нет — это гарантия платформы. Можно только создать новый обычный массив, скопировать в него элементы и изменить уже копию. Однако если элементом является изменяемый объект (структура, соответствие), его внутреннее содержимое менять можно: фиксируется только состав самой коллекции.

Почему код падает с ошибкой при вызове Добавить(), хотя переменная — массив?

Скорее всего, переменная содержит фиксированный массив, полученный из встроенного метода платформы или из чужой процедуры. Проверьте фактический тип через ТипЗнч() и сравните с Тип("ФиксированныйМассив"). Если тип фиксированный — скопируйте элементы в обычный массив перед модификацией.

Влияет ли фиксированный массив на производительность?

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

Передаётся ли фиксированный массив между клиентом и сервером?

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

Когда лучше использовать структуру вместо фиксированного массива?

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