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