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