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