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