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

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

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

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

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

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

Отдельная ситуация — когда переменная, которая должна содержать структуру, равна Неопределено. Это типичный случай для функций, которые в случае неудачи возвращают Неопределено вместо структуры. Такую переменную нужно проверять до любого обращения к методам, иначе платформа выдаст ошибку «Метод объекта не обнаружен».

Как проверить пустоту через метод Количество()

Основной и самый надёжный способ — метод Количество(). Он возвращает число элементов (пар «ключ-значение») в структуре. Если метод вернул 0, структура пуста: она создана, но в неё не добавлено ни одного свойства.

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

Если СтруктураПараметров.Количество() = 0 Тогда

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

КонецЕсли;

Тот же приём работает и для фиксированной структуры, и после заполнения через конструктор с параметрами. Например, Новый Структура("Контрагент, Договор") создаёт структуру с двумя ключами и значениями Неопределено — Количество() вернёт 2, хотя фактических данных в ней нет. Это важный нюанс: «пустая» и «с незаполненными значениями» — разные состояния.

Для читаемости кода проверку часто выносят в отдельную функцию общего модуля, особенно если она используется в десятках мест конфигурации. Это упрощает сопровождение и позволяет централизованно добавить дополнительные проверки типа.

bsl
Функция СтруктураПустая(ПроверяемаяСтруктура) Экспорт
    Если ПроверяемаяСтруктура = Неопределено Тогда
        Возврат Истина;
    КонецЕсли;
    Если ТипЗнч(ПроверяемаяСтруктура) <> Тип("Структура")
        И ТипЗнч(ПроверяемаяСтруктура) <> Тип("ФиксированнаяСтруктура") Тогда
        Возврат Истина;
    КонецЕсли;
    Возврат ПроверяемаяСтруктура.Количество() = 0;
КонецФункции

Как проверить переменную до обращения к структуре

Обращение к Количество() у переменной со значением Неопределено приводит к ошибке исполнения. Поэтому безопасный порядок проверки всегда начинается с анализа самой переменной, а не её содержимого.

Порядок безопасной проверки
  1. 1
    Проверьте, что переменная не равна Неопределено
  2. 2
    Убедитесь через ТипЗнч(), что это именно Структура или ФиксированнаяСтруктура
  3. 3
    Вызовите Количество() и сравните результат с нулём
  4. 4
    При необходимости проверьте наличие конкретных ключей через Свойство()

Функция ТипЗнч() в сочетании с Тип("Структура") защищает от ситуации, когда вместо структуры передали, например, соответствие или строку. У соответствия тоже есть метод Количество(), поэтому код может «случайно работать» — и это скрытая ошибка, которая проявится позже при обращении к свойствам.

Если Параметры = Неопределено Тогда

Возврат;

КонецЕсли;

Если ТипЗнч(Параметры) <> Тип("Структура") Тогда

ВызватьИсключение "Ожидался параметр типа Структура";

КонецЕсли;

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

Как проверить наличие конкретного ключа

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

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

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

// Ключ есть, значение в переменной ЗначениеСкидки

Иначе

// Ключа нет — используем значение по умолчанию

ЗначениеСкидки = 0;

КонецЕсли;

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

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

Сценарий «структура не пуста, но в ней нет данных» решается перебором элементов в цикле. Каждый элемент структуры — это КлючИЗначение, у которого доступны поля Ключ и Значение.

ЕстьДанные = Ложь;

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

Если ЗначениеЗаполнено(Элемент.Значение) Тогда

ЕстьДанные = Истина;

Прервать;

КонецЕсли;

КонецЦикла;

Если Не ЕстьДанные Тогда

Сообщить("Структура не содержит заполненных значений");

КонецЕсли;

Такой подход применяется при валидации форм, проверке параметров отбора, подготовке данных к обмену. Учтите особенность ЗначениеЗаполнено(): для числа 0, даты '00010101' и логического Ложь функция вернёт «не заполнено». Если ноль или Ложь — легитимные значения в вашей логике, используйте сравнение с Неопределено вместо ЗначениеЗаполнено().

Сравнение способов проверки

Каждый из способов решает свою задачу, и подмена одного другим приводит к логическим ошибкам. Сводное сопоставление помогает выбрать правильный вариант под конкретное условие.

СпособЧто проверяетКогда применять
Количество() = 0Отсутствие элементов в структуреПроверка, передали ли вообще параметры
Свойство("Ключ")Наличие конкретного ключаНеобязательные параметры процедур и функций
Перебор с ЗначениеЗаполнено()Наличие хотя бы одного заполненного значенияВалидация данных перед записью или отправкой
Сравнение с НеопределеноСуществование самой переменной-структурыПервый шаг перед любыми обращениями к объекту

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

Количество() = 0

Быстро и просто, но не различает «нет ключей» и «ключи есть, значения пустые»

Свойство() с приёмником

Оптимально для опциональных параметров: за один вызов проверяет ключ и получает значение

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

Самый гибкий, но самый многословный; оправдан при сложной валидации значений

Типичные ошибки и как их избежать

Большинство проблем с проверкой структур возникает не из-за сложности языка, а из-за невнимательности к контрактам функций и особенностям отдельных методов.

Типичные ошибки
01
Вызов Количество() у переменной со значением Неопределено — ошибка исполнения «Метод объекта не обнаружен»; всегда проверяйте переменную первой
02
Сравнение структуры с пустой строкой или нулём вместо использования Количество() — условие никогда не сработает как ожидается
03
Уверенность, что Новый Структура("Ключ") — пустая структура: ключ уже существует со значением Неопределено, Количество() вернёт 1
04
Использование ЗначениеЗаполнено() для значений, где 0 или Ложь являются рабочими данными — корректные значения ошибочно отбрасываются
05
Обращение к свойству через точку без проверки Свойство() — падение кода при изменении состава параметров в вызывающем месте

Отдельно стоит упомянуть попытку сравнить две структуры оператором =. Для структур сравнение на равенство напрямую не работает так, как ожидается, — объекты сравниваются по ссылке, а не по содержимому. Если нужно убедиться, что структура не изменилась, сравнивайте поключево или сериализуйте в JSON через ЗаписьJSON и сравнивайте строки.

Где проверка пустой структуры встречается на практике

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

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

Третий сценарий — параметры динамических списков, отборы СКД и настройки отчётов, передаваемые между клиентом и сервером. Здесь пустая структура отборов обычно означает «показать всё без ограничений», и её нужно отличать от ситуации «отборы не инициализированы».

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

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

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

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

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

Новый Структура без параметров
Норма

Количество() возвращает 0, срабатывает ветка «пустая»

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

Ошибка исполнения или попадание в ветку обработки данных

Новый Структура("Ключ")
Норма

Количество() = 1, Свойство("Ключ") = Истина, значение = Неопределено

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

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

Переменная = Неопределено
Норма

Срабатывает ранняя проверка, обращений к методам нет

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

Исключение «Метод объекта не обнаружен: Количество»

Итог

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

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

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

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

Для проверки пустоты разницы нет: у обоих типов есть метод Количество(). Отличие в поведении: фиксированная структура неизменяема, в неё нельзя добавить или удалить ключи. Если пишете универсальную функцию проверки, учитывайте оба типа через ТипЗнч().

Можно ли проверить структуру на пустоту через «Если Структура Тогда»?

Нет. Структура — объект, и в логическом выражении она не приводится к Истина/Ложь по заполненности. Попытка такого использования либо вызовет ошибку преобразования типа, либо даст непредсказуемый результат. Используйте только явное сравнение Количество() = 0.

Как проверить пустоту соответствия — так же, как структуры?

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

Почему Свойство() возвращает Истина, а значение пустое?

Потому что метод проверяет существование ключа, а не содержимое. Если структура создана конструктором с перечислением ключей, все они существуют со значением Неопределено. После Свойство() дополнительно проверяйте значение через ЗначениеЗаполнено() или сравнение с Неопределено.

Что быстрее: Количество() или перебор в цикле?

Количество() — это чтение готового внутреннего счётчика, оно выполняется мгновенно независимо от размера структуры. Перебор в цикле обходит все элементы. Если нужно узнать только факт пустоты, всегда используйте Количество(); цикл оправдан только при анализе значений.

Как вернуть из функции «пустой результат»: пустую структуру или Неопределено?

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