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

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

Как получить значение из структуры в 1С

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

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

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

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

Обращение к значению через точку

Самый простой способ — обратиться к свойству структуры по имени ключа через точку, как к свойству объекта. Имя ключа при этом должно быть допустимым идентификатором: начинаться с буквы или подчёркивания, не содержать пробелов и спецсимволов.

Структура = Новый Структура;

Структура.Вставить("Организация", "ООО Ромашка");

Структура.Вставить("Сумма", 1500.50);

НазваниеОрганизации = Структура.Организация; // "ООО Ромашка"

СуммаДокумента = Структура.Сумма; // 1500.50

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

Безопасное получение через метод Свойство()

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

Значение = Неопределено;

Если Структура.Свойство("Сумма", Значение) Тогда

// ключ есть, Значение заполнено

Сообщить("Сумма: " + Значение);

Иначе

// ключа нет, Значение осталось Неопределено

Сообщить("Сумма не передана");

КонецЕсли;

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

СтавкаНДС = 20; // значение по умолчанию

Структура.Свойство("СтавкаНДС", СтавкаНДС);

// если ключа нет — останется 20

Порядок действий
  1. 1
    Определите, гарантировано ли наличие ключа в структуре
  2. 2
    Если ключ обязательный — обратитесь через точку: Структура.Ключ
  3. 3
    Если ключ необязательный — вызовите Структура.Свойство("Ключ", Переменная)
  4. 4
    Перед вызовом Свойство() задайте переменной значение по умолчанию
  5. 5
    Проверьте возвращаемое булево значение перед использованием результата

Перебор всех значений структуры в цикле

Когда имена ключей заранее неизвестны, структуру перебирают в цикле Для Каждого. Каждая итерация возвращает объект типа «КлючИЗначение», у которого есть свойства Ключ и Значение.

Для Каждого Элемент Из Структура Цикл

Сообщить(Элемент.Ключ + " = " + Элемент.Значение);

КонецЦикла;

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

Если нужны только имена ключей без значений, логика та же — используется свойство Элемент.Ключ. Для проверки наличия нескольких обязательных ключей перед основной обработкой удобно собрать их список и в цикле вызвать Свойство() для каждого.

Структура или соответствие: что выбрать

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

КритерийСтруктураСоответствие
Тип ключаТолько строкаЛюбой тип
ОбращениеЧерез точку или Свойство()Квадратные скобки
Нет ключаИсключение (при обращении через точку)Возвращается Неопределено
Типичное применениеПараметры, настройки, возврат функцийКэши, индексы, поиск по ссылкам

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

Сравнение вариантов

Обращение через точку

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

Метод Свойство()

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

Перебор в цикле

Подходит для неизвестного набора ключей и отладки. Ограничение: порядок обхода не гарантирован.

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

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

Получение значений из вложенных структур

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

// Рискованно: если нет "Печать" или "Принтер" — исключение

Принтер = Настройки.Печать.Принтер;

// Безопасный вариант

Принтер = "";

ПечатьНастройки = Неопределено;

Если Настройки.Свойство("Печать", ПечатьНастройки)

И ТипЗнч(ПечатьНастройки) = Тип("Структура") Тогда

ПечатьНастройки.Свойство("Принтер", Принтер);

КонецЕсли;

Проверка типа через ТипЗнч() важна: если под ключом окажется не структура, а строка или число, вызов Свойство() на нём вызовет ошибку. В толстом клиенте и на сервере такая проверка занимает одну строку, но избавляет от трудноуловимых сбоев при изменении формата данных.

Типичные ошибки и их последствия

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

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

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

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

После извлечения значения полезно убедиться, что получено именно то, что ожидалось. Минимальная проверка — сравнение с Неопределено и контроль типа через ТипЗнч(). Для числовых значений дополнительно проверяют, что значение не ноль, если ноль недопустим по логике.

В конфигураторе удобно пользоваться окном «Вычислить выражение» (Shift+F9): оно показывает содержимое структуры в виде дерева, где видны все ключи и типы значений. Это быстрее, чем вывод в сообщения, особенно для вложенных структур.

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

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

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

Значение ожидаемого типа, не Неопределено

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

Неопределено или исключение «Поле объекта не обнаружено»

Возвращаемое значение Свойство()
Норма

Истина — ключ найден, переменная заполнена

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

Ложь — ключа нет, переменная не изменилась

Вложенная структура
Норма

ТипЗнч возвращает Структура

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

Строка, число или Неопределено вместо структуры

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

Итог

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

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

Частые вопросы

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

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

Можно ли получить значение по ключу, имя которого хранится в переменной?

Да, для этого используется метод Свойство() — имя ключа передаётся строкой, поэтому его можно вычислять динамически: Структура.Свойство(ИмяКлюча, Значение). Обращение через точку с динамическим именем невозможно.

Чем отличается Свойство() от проверки на Неопределено после обращения через точку?

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

Как получить все ключи структуры списком?

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

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

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

Как задать значение по умолчанию, если ключ отсутствует?

Инициализируйте переменную нужным значением перед вызовом Свойство(): метод не изменит переменную, если ключ не найден, и в ней останется значение по умолчанию. Это короче и надёжнее, чем ветка Иначе после проверки результата.