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