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