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