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

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

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

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

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

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

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

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

Метод Количество() возвращает число элементов структуры. Сравнение результата с нулём — стандартный способ проверки на пустоту:

bsl
Если МояСтруктура.Количество() = 0 Тогда
	Сообщить("Структура пустая");
Иначе
	Сообщить("Элементов: " + МояСтруктура.Количество());
КонецЕсли;

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

Если структура формируется динамически — например, заполняется результатом обмена или разбором строки — проверку Количество() = 0 разумно ставить перед обращением к элементам. Это защищает код от обращения к несуществующим ключам.

Защита от Неопределено и неверного типа

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

bsl
Если МояСтруктура = Неопределено Тогда
	Возврат;
КонецЕсли;

Если ТипЗнч(МояСтруктура) <> Тип("Структура") Тогда
	Возврат;
КонецЕсли;

Если МояСтруктура.Количество() = 0 Тогда
	// структура пустая
КонецЕсли;

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

Проверка наличия конкретного ключа

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

bsl
ЗначениеКлюча = Неопределено;
Если МояСтруктура.Свойство("СуммаДокумента", ЗначениеКлюча) Тогда
	// ключ есть, значение в переменной ЗначениеКлюча
Иначе
	// ключа нет
КонецЕсли;

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

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

Проверка заполненности значений, а не ключей

Когда структура содержит ключи, но нужно понять, заполнено ли хоть одно значение, используйте перебор с функцией ЗначениеЗаполнено(). Она корректно обрабатывает Неопределено, пустые строки, пустые ссылки, нулевые даты и число 0:

bsl
ЕстьЗаполненные = Ложь;
Для Каждого Элемент Из МояСтруктура Цикл
	Если ЗначениеЗаполнено(Элемент.Значение) Тогда
		ЕстьЗаполненные = Истина;
		Прервать;
	КонецЕсли;
КонецЦикла;

Если Не ЕстьЗаполненные Тогда
	// все значения пустые
КонецЕсли;

Такой подход типичен для форм с отборами: пользователь мог оставить все поля пустыми, и тогда структуру отбора не нужно передавать в запрос. Проверка через перебор позволяет отличить «пользователь ничего не задал» от «задал хотя бы один критерий».

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

Маршрут решения

Как выбрать проверку

Нужно узнать, есть ли в структуре хотя бы один элементИспользуйте условие Структура.Количество() = 0
Переменная может быть НеопределеноСначала проверьте на Неопределено, затем вызывайте Количество()
Нужен конкретный ключИспользуйте Структура.Свойство("ИмяКлюча", Значение)
Ключи есть, но значения могут быть пустымиПереберите элементы и проверьте каждое значение через ЗначениеЗаполнено()

Проверка через попытку и исключение

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

Конструкция Попытка...Исключение оправдана только там, где ошибка действительно исключительная ситуация — например, разбор данных из внешнего источника с непредсказуемой структурой. Для проверки наличия ключа всегда предпочтительнее метод Свойство(), для проверки пустоты — Количество() = 0.

Типичные ошибки
01
Вызов Количество() у переменной, равной Неопределено, — ошибка исполнения и остановка кода
02
Сравнение структуры с пустой строкой или нулём — структура не сравнивается с примитивами напрямую
03
Прямое обращение к ключу без проверки через Свойство() — исключение при отсутствии ключа
04
Убеждённость, что структура с ключами и значениями Неопределено пустая — Количество() вернёт число ключей, а не ноль
05
Использование Попытка...Исключение для штатной проверки наличия ключа вместо метода Свойство()

Особенности для соответствия и фиксированной структуры

Соответствие проверяется на пустоту точно так же — методом Количество() = 0. Разница в другом: у соответствия нет метода Свойство(), наличие ключа проверяется через обращение по индексу Соответствие[Ключ] — если ключа нет, вернётся Неопределено без ошибки. Это удобно, но опасно для ключей типа Неопределено.

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

Если структура передаётся между клиентом и сервером или сериализуется (например, через ЗначениеВСтрокуВнутр или JSON), после восстановления проверяйте и тип, и наполнение: при ошибке сериализации можно получить пустую структуру вместо ожидаемых данных.

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

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

Вызов Количество() в отладчике
Норма

Возвращается число элементов без ошибок

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

Ошибка «Метод объекта не обнаружен» — переменная Неопределено

Результат Свойство("Ключ")
Норма

Истина — ключ существует, Ложь — ключа нет, ошибок нет

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

Ошибка исполнения — значит, проверяется не структура

Перебор значений с ЗначениеЗаполнено()
Норма

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

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

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

Частые вопросы о проверке структуры в 1С

Можно ли сравнить структуру с Неопределено напрямую?

Да, сравнение МояСтруктура = Неопределено корректно и часто необходимо как первый шаг проверки. Но это проверка существования переменной, а не пустоты структуры: существующая, но пустая структура не равна Неопределено.

Что вернёт Количество() для Новый Структура("Ключ1, Ключ2")?

Вернёт 2 — конструктор создаёт структуру с указанными ключами и значениями Неопределено. Структура считается заполненной по ключам, хотя значения пустые. Для проверки значений перебирайте элементы с ЗначениеЗаполнено().

Чем Свойство() лучше прямого обращения к ключу?

Метод Свойство() не вызывает ошибку при отсутствии ключа и за один вызов возвращает и факт наличия, и значение. Прямое обращение МояСтруктура.Ключ к несуществующему ключу приводит к исключению и остановке выполнения.

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

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

Работает ли проверка на пустоту для фиксированной структуры?

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

Есть ли разница в проверке структуры на тонком клиенте и на сервере?

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

Итог

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

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