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

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

Как работает структура в 1С

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

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

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

Материал ниже разбирает создание структуры, работу с ключами и значениями, проверку наличия свойств, перебор элементов, типичные сценарии применения и ошибки, которые приводят к падению кода.

Создание структуры: конструктор и способы инициализации

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

Конструктор принимает необязательные параметры. Первый — строка с именами ключей через запятую, далее — значения в том же порядке. Например: Новый Структура("Организация, Склад", Организация, ОсновнойСклад). Такой вариант компактнее, но требует внимательности: порядок значений должен строго соответствовать порядку ключей, иначе данные попадут не в те поля без какого-либо сообщения об ошибке.

bsl
// Пустая структура
Параметры = Новый Структура;
Параметры.Вставить("Организация", Организация);
Параметры.Вставить("Период", ТекущаяДатаСеанса());

// Сразу с ключами и значениями
Отбор = Новый Структура("Склад, Номенклатура", Склад, Товар);

// Пустые ключи, значения заполняются позже
Результат = Новый Структура("Успешно, ТекстОшибки");

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

Добавление и изменение значений: метод Вставить

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

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

Значением может быть что угодно: примитивный тип, ссылка на объект базы, массив, таблица значений, другая структура. Вложенные структуры — стандартный приём для группировки связанных параметров, например Параметры.ДанныеШапки и Параметры.ДанныеТабличнойЧасти.

Чтение значений: обращение через точку и метод Свойство

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

Безопасная альтернатива — метод Свойство(Ключ, НайденноеЗначение). Он возвращает Истина, если ключ найден, и помещает значение во второй параметр; если ключа нет — возвращает Ложь, а переменная остаётся неопределённой. Это стандартный паттерн для необязательных параметров:

bsl
Перем Склад;

Если Параметры.Свойство("Склад", Склад) Тогда
    // ключ есть, работаем со значением
Иначе
    Склад = Справочники.Склады.ПустаяСсылка();
КонецЕсли;

Также доступен метод Количество() для проверки, есть ли в структуре элементы вообще, и Очистить() для удаления всех элементов. Удалить отдельный ключ штатным методом нельзя — если нужна такая логика, используют соответствие либо пересоздают структуру.

Типичные ошибки
01
Обращение через точку к ключу, который может отсутствовать — код падает с ошибкой «Поле объекта не обнаружено»; для необязательных полей используйте Свойство()
02
Несовпадение порядка значений с порядком ключей в конструкторе — данные молча попадают не в те поля
03
Опечатка в ключе при Вставить — создаётся дублирующее поле, а исходное значение не обновляется
04
Ожидание, что структура сохранит порядок добавления элементов — порядок обхода не гарантирован, для упорядоченных данных нужен массив или таблица значений

Перебор элементов и проверка содержимого

Обход всех элементов выполняется циклом Для Каждого КлючИЗначение Из Структура Цикл. Каждая итерация возвращает объект типа «КлючИЗначение» с полями Ключ и Значение. Этот приём применяют для отладочного вывода, динамического заполнения параметров запросов и копирования данных между коллекциями.

Типичный сценарий — установка параметров запроса из структуры отбора: цикл проходит по структуре и вызывает Запрос.УстановитьПараметр(Элемент.Ключ, Элемент.Значение). Так код не привязывается жёстко к составу параметров и легко расширяется.

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

bsl
Для Каждого Элемент Из ПараметрыОтбора Цикл
    Запрос.УстановитьПараметр(Элемент.Ключ, Элемент.Значение);
КонецЦикла;

Структура против соответствия, массива и фиксированной структуры

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

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

КоллекцияКлючИзменяемостьКогда применять
СтруктураСтрока-идентификаторДаПараметры, возврат нескольких значений
Фиксированная структураСтрока-идентификаторНетНастройки, параметры форм
СоответствиеЛюбой типДаКэши, поиск по произвольным ключам
МассивИндекс (число)ДаУпорядоченные однотипные данные
Маршрут решения

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

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

Практические сценарии: параметры форм и возврат из функций

Самый массовый сценарий — передача параметров при открытии формы. Метод ОткрытьФорму принимает структуру параметров, а в модуле формы они доступны через объект Параметры. Так передают отборы, ключи записей, режимы открытия.

Второй сценарий — возврат нескольких значений из функции. Вместо набора параметров-переменных функция формирует структуру вида Новый Структура("Успешно, ОписаниеОшибки, Данные") и возвращает её. Вызывающий код проверяет Результат.Успешно и работает с остальными полями. Такой контраст легко расширять: новое поле добавляется без изменения сигнатуры функции.

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

Порядок действий: возврат результата из функции
  1. 1
    Объявите в функции переменную: Результат = Новый Структура("Успешно, ТекстОшибки")
  2. 2
    Заполните поля по ходу выполнения: Результат.Успешно = Истина
  3. 3
    Верните структуру оператором Возврат
  4. 4
    В вызывающем коде проверьте Результат.Успешно перед использованием остальных полей

Ограничения и проверка результата

Структура живёт только в оперативной памяти сеанса: после завершения сеанса данные теряются. Для хранения между сеансами используются объекты базы, хранилища настроек или сериализация в JSON. Структуру нельзя сохранить в реквизит объекта напрямую.

При передаче между клиентом и сервером структура сериализуется, и значения некоторых типов (например, запрос или менеджер записи) перенести нельзя. В толстом клиенте и при вызовах сервера с клиента держите в структуре только сериализуемые данные: примитивы, ссылки, массивы, вложенные структуры.

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

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

Обращение к полю через точку
Норма

Значение возвращается без ошибки

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

Ошибка «Поле объекта не обнаружено» — ключа нет или опечатка

Состав ключей после заполнения
Норма

Количество() совпадает с ожидаемым числом полей

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

Лишние поля — опечатки при Вставить создали дубли

Передача в процедуру и обратно
Норма

Изменения внутри процедуры видны снаружи (передача по ссылке)

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

Потеря данных — где-то создана копия или локальная структура

Частые вопросы о структуре в 1С

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

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

Можно ли удалить один ключ из структуры?

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

Почему возникает ошибка «Поле объекта не обнаружено»?

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

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

Нет. Порядок обхода в цикле «Для Каждого» не определён и не совпадает с порядком добавления. Если последовательность важна — например, для вывода колонок или порядка обработки — используйте массив или таблицу значений, а структуру держите только для именованного доступа.

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

Да, если все значения внутри сериализуемы: примитивные типы, ссылки, даты, массивы и вложенные структуры переносятся нормально. Объекты вроде запроса, построителя отчёта или менеджера записи передать нельзя — такие данные нужно пересоздавать на сервере.

Что такое фиксированная структура и можно ли её изменить?

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

Итог

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

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