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

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

Атрибут структуры в 1С: что это и как с ним работать

Что такое атрибут структуры в 1С, как добавлять, проверять и изменять атрибуты, типичные ошибки при работе со структурами и примеры кода на встроенном языке.

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

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

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

Что такое структура и её атрибут простыми словами

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

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

Как создать структуру и задать атрибуты

Есть два основных способа задать атрибуты. Первый — перечислить их прямо в конструкторе: Новый Структура("Организация, Склад, Период"). В этом случае атрибуты создаются со значением Неопределено, а заполнить их можно позже через обращение по имени: Параметры.Склад = СкладОтгрузки;.

Второй способ — добавить атрибут в уже существующую структуру методом Вставить("ИмяАтрибута", Значение). Если атрибут с таким именем уже есть, метод просто заменит его значение — ошибки не возникнет. Это удобно, но одновременно опасно: опечатка в имени при вызове Вставить молча создаст новый атрибут, а старый останется незаполненным.

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

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

Прямое обращение Структура.ИмяАтрибута работает только если атрибут гарантированно существует. Если его нет, выполнение кода прервётся с ошибкой «Поле объекта не обнаружено». Поэтому перед обращением к атрибуту, который мог не быть добавлен, используйте метод Свойство("Имя", Значение) — он вернёт Истина, если атрибут найден, и поместит значение во второй параметр.

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

Безопасное чтение атрибута
  1. 1
    Объявите переменную для значения, например ЗначениеСклада
  2. 2
    Вызовите Параметры.Свойство("Склад", ЗначениеСклада)
  3. 3
    Проверьте результат: если вернулось Ложь — атрибута нет, используйте значение по умолчанию
  4. 4
    Если вернулось Истина — работайте с ЗначениеСклада, дополнительно проверив заполненность через ЗначениеЗаполнено()

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

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

Структура или соответствие

Структура

Подходит для фиксированного набора именованных параметров, передачи настроек, описания объекта. Ограничение: ключи — только допустимые идентификаторы.

Соответствие

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

Фиксированная структура

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

Ограничения и особенности, о которых нужно помнить

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

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

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

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

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

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

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

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

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

Набор атрибутов
Норма

Все ожидаемые ключи присутствуют, лишних нет

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

Ключей больше или меньше, чем задумано — ищите опечатку в Вставить

Значения атрибутов
Норма

Типы соответствуют ожиданиям, значения заполнены

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

Неопределено там, где должна быть ссылка или строка

Поведение вызывающего кода
Норма

Параметры после вызова функции не изменились

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

Атрибуты изменились — функция модифицирует переданную структуру

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

Часто задаваемые вопросы

Можно ли изменить имя атрибута структуры после создания?

Нет, переименовать ключ напрямую нельзя. Нужно добавить новый атрибут методом Вставить с нужным именем, скопировать в него значение, а старый удалить методом Удалить("СтароеИмя").

Что будет, если обратиться к несуществующему атрибуту?

При обращении через точку выполнение прервётся с ошибкой «Поле объекта не обнаружено». Чтобы избежать этого, используйте метод Свойство(), который вернёт Ложь, если атрибута нет.

Может ли значением атрибута быть другая структура?

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

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

Фиксированную структуру нельзя изменить после создания: методы Вставить и Удалить вызовут ошибку. Она используется платформой для защиты параметров, например в свойствах форм.

Как скопировать все атрибуты из одной структуры в другую?

Переберите исходную структуру циклом «Для Каждого КлючИЗначение Из Источник Цикл» и внутри цикла вызовите Приёмник.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение). Учтите, что значения-ссылки и коллекции копируются по ссылке, а не по значению.

Регистр букв в имени атрибута имеет значение?

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

Итог

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

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