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