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

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

Как в 1С проверить, что строка пустая

Как в 1С проверить, что строка пустая: функция ПустаяСтрока, СокрЛП, СтрДлина и ЗначениеЗаполнено. Примеры кода, типичные ошибки и отличия пустой строки от пробелов.

Проверка строки на пустоту — одна из самых частых операций во встроенном языке 1С. Она нужна при валидации реквизитов формы, перед записью документа, при обработке данных из файлов обмена и при формировании текстов запросов. От того, насколько корректно выполнена проверка, зависит, не попадут ли в базу «пустые» значения, состоящие из пробелов или неразрывных символов.

В платформе 1С есть несколько способов такой проверки: функция ПустаяСтрока(), сравнение с пустым литералом "", проверка длины через СтрДлина() и универсальная функция ЗначениеЗаполнено(). У каждого варианта есть особенности: одни методы считают строку из пробелов непустой, другие работают только со строковым типом и вызовут ошибку на значении Неопределено.

Ниже разобраны все рабочие способы с примерами кода, показано, чем пустая строка отличается от строки с пробелами, какие ошибки чаще всего допускают разработчики и как выбрать подходящий метод под конкретную задачу.

Функция ПустаяСтрока — основной способ проверки

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

Строка = "  ";

Если ПустаяСтрока(Строка) Тогда

Сообщить("Строка пустая");

Иначе

Сообщить("В строке есть значащие символы");

КонецЕсли;

В этом примере сообщение «Строка пустая» будет выведено, несмотря на то что переменная содержит три пробела. Именно это поведение делает ПустаяСтрока() предпочтительным вариантом при проверке пользовательского ввода: пользователь мог случайно ввести пробелы, и формально такая строка не пуста, но по смыслу значения в ней нет.

Обратное условие записывается через оператор НЕ:

Если НЕ ПустаяСтрока(Комментарий) Тогда

// обрабатываем заполненный комментарий

КонецЕсли;

Сравнение с пустым литералом и проверка длины

Сравнение с пустой строкой ""

Самый очевидный для новичков способ — сравнить переменную с пустым строковым литералом:

Если Строка = "" Тогда

Сообщить("Строка пустая");

КонецЕсли;

Этот метод работает, но имеет принципиальное ограничение: строка " " из одного пробела такой проверкой будет признана непустой. Если данные приходят из формы, Excel или внешнего файла, где пробелы встречаются постоянно, сравнение с "" даст ложный результат. Использовать его безопасно только тогда, когда источник данных гарантированно не содержит пробельных строк.

Проверка через СтрДлина

Функция СтрДлина() возвращает количество символов в строке. Проверка выглядит так:

Если СтрДлина(Строка) = 0 Тогда

Сообщить("Строка пустая");

КонецЕсли;

Как и сравнение с литералом, этот способ не учитывает пробелы: СтрДлина(" ") вернёт 3. Вариант с СтрДлина() иногда применяют в связке с СокрЛП(), но фактически это более длинная запись того, что делает ПустаяСтрока():

Если СтрДлина(СокрЛП(Строка)) = 0 Тогда

Сообщить("Строка пустая");

КонецЕсли;

Сравнение вариантов

ПустаяСтрока(Строка)

Учитывает пробелы и служебные символы. Рекомендуемый способ для строк. Ограничение: только строковый тип.

Строка = ""

Простая запись, но строка из пробелов считается непустой. Подходит только для гарантированно очищенных данных.

СтрДлина(Строка) = 0

Аналогично сравнению с литералом: пробелы дают ненулевую длину. Используется редко.

ЗначениеЗаполнено(Значение)

Универсальная проверка любого типа: строка, число, ссылка, дата, Неопределено. Для строки из пробелов вернёт Ложь.

ЗначениеЗаполнено — универсальная проверка любого типа

Функция ЗначениеЗаполнено() проверяет, отличается ли значение от значения по умолчанию для своего типа. Для строки значение по умолчанию — пустая строка, причём строка из пробелов также считается незаполненной. Для числа — ноль, для даты — пустая дата, для ссылки — пустая ссылка соответствующего типа, для Неопределено функция всегда возвращает Ложь.

Если ЗначениеЗаполнено(Наименование) Тогда

// значение заполнено, можно использовать

КонецЕсли;

Эту функцию удобно применять, когда заранее неизвестен тип проверяемого значения — например, при разборе колонки таблицы значений с составным типом или при универсальной проверке реквизитов объекта в цикле:

Для Каждого Реквизит Из Метаданные().Реквизиты Цикл

Если НЕ ЗначениеЗаполнено(ЭтотОбъект[Реквизит.Имя]) Тогда

Сообщить("Не заполнен реквизит: " + Реквизит.Синоним);

КонецЕсли;

КонецЦикла;

Обратная функция — ЗначениеПустое() — в типовых конфигурациях встречается реже, но логика зеркальная: возвращает Истина, если значение равно значению по умолчанию.

Пустая строка и строка из пробелов: в чём разница

Ключевой подводный камень темы — различие между строкой нулевой длины и строкой, заполненной незначащими символами. Данные, загруженные из Excel, CSV или скопированные с веб-страниц, часто содержат пробелы, табуляции и неразрывные пробелы (символ с кодом 160). Формально такая строка не пуста, но по смыслу значения в ней нет.

Функция ПустаяСтрока() корректно обрабатывает обычные пробелы и символы табуляции. Однако неразрывный пробел (Символ 160) в некоторых случаях может трактоваться как значащий символ. Если данные приходят из внешних источников, надёжнее предварительно очистить строку:

Строка = СтрЗаменить(Строка, Символ(160), " ");

Строка = СокрЛП(Строка);

Если ПустаяСтрока(Строка) Тогда

Сообщить("После очистки строка пустая");

КонецЕсли;

Функция СокрЛП() удаляет незначащие символы слева и справа от строки. Есть также варианты СокрЛ() и СокрП() для односторонней обрезки.

Типичные ошибки
01
Сравнение с "" вместо ПустаяСтрока(): строка из пробелов проходит проверку как заполненная, и в базу попадают «пустые» значения.
02
Вызов ПустаяСтрока(Неопределено): функция принимает только строки, на других типах возникает ошибка исполнения.
03
Запись СокрЛП(Строка) без присваивания результата: функция возвращает новое значение, исходная переменная не меняется.
04
Проверка до очистки неразрывных пробелов: строка с символом 160 может быть признана заполненной, хотя видимых символов в ней нет.

Проверка строки в запросе 1С

В языке запросов функции ПустаяСтрока() нет — проверка выполняется сравнением с пустым литералом. Здесь важно учитывать, что реквизит строкового типа в базе обычно хранится именно как пустая строка, а не как NULL:

ВЫБРАТЬ

Контрагенты.Ссылка

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.Комментарий = ""

Если строковый реквизит имеет неограниченную длину или речь идёт о поле, которое может быть NULL (например, в результате левого соединения), потребуется проверка на NULL и приведение типа:

ГДЕ

ЕСТЬNULL(Контрагенты.Комментарий, "") = ""

Отдельная ситуация — строки из пробелов в запросе. Язык запросов не имеет аналога СокрЛП(), поэтому отфильтровать «пробельные» значения напрямую сложно. На практике используют функции ПОДСТРОКА и ДЛИНАСТРОКИ либо очищают данные на этапе записи, не допуская попадания пробелов в базу.

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

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

Проверяется строковая переменная или реквизит формыИспользуйте ПустаяСтрока() — она корректно обработает пробелы
Тип значения заранее неизвестен или может быть НеопределеноИспользуйте ЗначениеЗаполнено() — она безопасна для любых типов
Проверка выполняется в тексте запросаСравнивайте с "" и добавляйте ЕСТЬNULL для полей, которые могут быть NULL
Данные приходят из Excel, CSV или веб-страницСначала замените неразрывные пробелы и примените СокрЛП, затем проверяйте

Практические сценарии: форма, документ, обмен данными

Валидация реквизита на форме

При проверке заполнения поля ввода на форме стандартный подход — связать сообщение пользователю с полем через объект СообщениеПользователю:

Процедура ПроверитьЗаполнениеНаСервере(Отказ)

Если ПустаяСтрока(Объект.Наименование) Тогда

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Укажите наименование";

Сообщение.Поле = "Объект.Наименование";

Сообщение.Сообщить();

Отказ = Истина;

КонецЕсли;

КонецПроцедуры

Проверка перед записью документа

В обработчике ОбработкаПроверкиЗаполнения модуля объекта проверка выполняется аналогично. Пользоваться стоит штатным механизмом отказа, чтобы документ не записался с незаполненными данными:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

Если ПустаяСтрока(НомерВходящегоДокумента) Тогда

ОбщегоНазначения.СообщитьПользователю(

"Не указан номер входящего документа", , , , Отказ);

КонецЕсли;

КонецПроцедуры

Загрузка из файла

При построчном чтении текстового файла пустые строки нужно пропускать, иначе в таблице значений появятся пустые записи:

Чтение = Новый ЧтениеТекста(ИмяФайла);

Строка = Чтение.ПрочитатьСтроку();

Пока Строка <> Неопределено Цикл

Если НЕ ПустаяСтрока(Строка) Тогда

// обработка строки

КонецЕсли;

Строка = Чтение.ПрочитатьСтроку();

КонецЦикла;

Чтение.Закрыть();

Обратите внимание: конец файла определяется именно сравнением с Неопределено, а не с пустой строкой — пустые строки в середине файла читаются как обычные строки и отсекаются проверкой ПустаяСтрока().

Порядок действий при проверке пользовательского ввода
  1. 1
    Замените в строке неразрывные пробелы (Символ 160) на обычные, если данные из внешнего источника
  2. 2
    Примените СокрЛП() к копии строки, чтобы убрать краевые пробелы
  3. 3
    Проверьте результат через ПустаяСтрока()
  4. 4
    Если строка пустая — выведите сообщение пользователю и установите Отказ = Истина
  5. 5
    Если строка заполнена — продолжите обработку значения

Как убедиться, что проверка работает правильно

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

Для отладки удобно выводить длину строки и её представление в квадратных скобках — так видно скрытые пробелы:

Сообщить("[" + Строка + "], длина: " + СтрДлина(Строка));

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

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

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

Пустое поле ввода
Норма

Проверка срабатывает, выводится сообщение

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

Поле проходит проверку как заполненное

Поле с одними пробелами
Норма

ПустаяСтрока возвращает Истина

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

Используется сравнение с "" и пробелы проходят

Текст с пробелами по краям
Норма

Строка признаётся заполненной, СокрЛП обрезает края

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

Строка отклоняется как пустая или пробелы сохраняются

Значение Неопределено
Норма

ЗначениеЗаполнено возвращает Ложь без ошибки

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

ПустаяСтрока вызывает ошибку исполнения

Частые вопросы

Чем ПустаяСтрока отличается от ЗначениеЗаполнено?

ПустаяСтрока() работает только со строками и возвращает Истина для пустой строки. ЗначениеЗаполнено() принимает значение любого типа и возвращает Истина, если оно заполнено. Логика противоположная: ПустаяСтрока(Х) эквивалентна НЕ ЗначениеЗаполнено(Х) для строкового типа.

Строка из пробелов — это пустая строка?

Для функции ПустаяСтрока() — да, она вернёт Истина. А вот сравнение с "" и проверка СтрДлина() = 0 такую строку пустой не признают. Поэтому при проверке пользовательского ввода всегда предпочтительнее ПустаяСтрока().

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

Сравнением с пустым литералом: ГДЕ Реквизит = "". Если поле может содержать NULL (например, после левого соединения), используйте конструкцию ЕСТЬNULL(Реквизит, "") = "". Аналога функции ПустаяСтрока в языке запросов нет.

Почему ПустаяСтрока() выдаёт ошибку?

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

Как удалить пробелы в начале и конце строки?

Функцией СокрЛП(Строка) — она возвращает новую строку без краевых пробельных символов. Результат нужно присвоить: Строка = СокрЛП(Строка). Сам вызов без присваивания исходную переменную не изменяет.

Что делать с неразрывным пробелом при загрузке данных?

Неразрывный пробел (Символ 160) часто приходит из Excel и веб-страниц и может не распознаваться как незначащий символ. Перед проверкой замените его на обычный пробел: Строка = СтрЗаменить(Строка, Символ(160), " "), затем примените СокрЛП() и ПустаяСтрока().

Итог

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

Для строк используйте ПустаяСтрока() — она корректно обрабатывает пробелы. Для значений неизвестного типа — ЗначениеЗаполнено(). В запросах проверяйте сравнением с "" и учитывайте NULL. При загрузке внешних данных предварительно очищайте строку от неразрывных пробелов через СокрЛП и СтрЗаменить.