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

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

Как проверить, есть ли свойство в структуре 1С

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

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

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

Метод Свойство(): синтаксис и базовый пример

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

Второй вариант — с двумя параметрами: Структура.Свойство("ИмяКлюча", ПеременнаяЗначения). Метод по-прежнему возвращает булево, но дополнительно записывает в переданную переменную значение свойства. Если ключа нет, переменная получает значение Неопределено. Это самый распространённый приём в прикладном коде, потому что он объединяет проверку и чтение в одну строку.

ДанныеСтроки = Новый Структура("Номенклатура, Количество", Товар, 5);

ЕстьЦена = ДанныеСтроки.Свойство("Цена"); // Ложь — ключа нет

ЗначениеКоличество = Неопределено;

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

Сообщить("Количество: " + ЗначениеКоличество);

КонецЕсли;

Получение значения со значением по умолчанию

Частая задача — прочитать необязательный параметр и, если его нет, использовать значение по умолчанию. Метод Свойство() с двумя параметрами решает её лаконично: сначала объявляется переменная со значением по умолчанию, затем вызывается проверка. Если ключ найден, переменная перезапишется фактическим значением; если нет — останется заданное умолчание.

Процедура ЗаполнитьДокумент(Параметры)

Склад = Справочники.Склады.ПустаяСсылка(); // значение по умолчанию

Параметры.Свойство("Склад", Склад);

Комментарий = "";

Параметры.Свойство("Комментарий", Комментарий);

КонецПроцедуры

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

Порядок действий
  1. 1
    Объявите переменную и задайте ей безопасное значение по умолчанию
  2. 2
    Вызовите Структура.Свойство("ИмяКлюча", Переменная)
  3. 3
    Проверьте возвращённое булево, если логика зависит от самого факта наличия ключа
  4. 4
    Используйте переменную дальше — она содержит либо значение ключа, либо умолчание

Проверка значения, а не только факта наличия ключа

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

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

Если Параметры.Свойство("Договор", Значение)

И ЗначениеЗаполнено(Значение) Тогда

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

КонецЕсли;

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

Альтернативные способы проверки

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

Ещё один вариант — конструкция Попытка ... Исключение вокруг прямого обращения к свойству. Технически это работает, но считается плохой практикой: исключения в 1С — дорогая операция, а код становится менее читаемым. Используйте Попытка только там, где ошибка действительно исключительная, а не как замену штатной проверки.

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

Свойство() с одним параметром

Подходит, когда нужен только факт наличия ключа. Не даёт значения — придётся обращаться к свойству второй раз.

Свойство() с двумя параметрами

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

Цикл по структуре

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

Попытка/Исключение

Работает, но медленнее и хуже читается. Оправдан только для действительно исключительных ситуаций.

Особенности работы с фиксированными структурами и другими типами

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

У объекта Соответствие метода Свойство() нет — там проверка выполняется через Соответствие.Получить(Ключ): если ключ отсутствует, метод вернёт Неопределено. У соответствия ключом может быть любое значение, а не только строка-идентификатор, поэтому механика другая. Не переносите приёмы работы со структурой на соответствие без корректировки.

Для объектов метаданных и прикладных объектов (справочников, документов) наличие реквизита проверяется иначе — через метаданные: Объект.Метаданные().Реквизиты.Найти("ИмяРеквизита") <> Неопределено. Пытаться вызвать Свойство() у ссылки или объекта документа бессмысленно — такого метода у них нет.

Типичные ошибки
01
Прямое обращение Структура.Ключ без проверки — при отсутствии ключа код падает с ошибкой «Поле объекта не обнаружено»
02
Сравнение значения с Неопределено вместо проверки ключа — ключ со значением Неопределено ошибочно считается отсутствующим
03
Использование Свойство() у Соответствия или объекта документа — у этих типов такого метода нет, возникнет ошибка вызова
04
Пробелы и недопустимые символы в имени ключа при создании структуры — ключ не создастся, и проверка всегда будет давать Ложь
05
Проверка через Попытка/Исключение как основной механизм — замедляет код и скрывает реальные ошибки

Диагностика: как убедиться, что проверка работает правильно

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

Проверьте, что структура заполняется до проверки, а не после. Типичный сценарий ошибки: структура параметров формируется в одной ветке условного кода, а проверяется в другой, куда заполнение не дошло. Отладчик с точкой останова на строке вызова Свойство() покажет фактическое содержимое объекта через табло или окно вычисления выражений.

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

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

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

Истина для существующего ключа, Ложь для отсутствующего

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

Всегда Ложь — проверьте написание имени ключа и момент заполнения структуры

Переменная после вызова с двумя параметрами
Норма

Содержит значение ключа или Неопределено при его отсутствии

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

Содержит устаревшее значение — переменная не была инициализирована перед вызовом

Перебор структуры в отладчике
Норма

Ключ присутствует в списке с ожидаемым именем

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

Ключа нет или имя отличается пробелом/опечаткой

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

Что вернёт Свойство(), если ключ есть, но значение равно Неопределено?

Метод вернёт Истина: наличие ключа не зависит от его значения. Во вторую переменную при этом запишется Неопределено. Если для логики важно отличать «ключ есть, но пустой» от «ключа нет», анализируйте и булево-результат, и полученное значение раздельно.

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

Нет. Имена ключей структуры нечувствительны к регистру: «Цена», «ЦЕНА» и «цена» — один и тот же ключ. Но опечатки, лишние пробелы и похожие символы (например, латинская «a» вместо кириллической «а») создают разные ключи — это частая причина «неработающей» проверки.

Как проверить сразу несколько обязательных ключей?

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

Можно ли проверить вложенное свойство, например Структура.Параметры.Склад?

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

Чем проверка ключа у Соответствия отличается от структуры?

У Соответствия нет метода Свойство(). Используется Получить(Ключ): метод возвращает значение или Неопределено, если ключа нет. Учтите, что если вы сами записали в соответствие значение Неопределено, отличить его от отсутствующего ключа стандартными средствами нельзя.

Почему код падает с ошибкой, хотя я проверяю свойство через Свойство()?

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

Итог

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

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