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