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

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

Как найти длину строки в 1С

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

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

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

Синтаксис функции СтрДлина

Функция имеет единственный параметр — строку, длину которой нужно определить. Возвращаемое значение — число, равное количеству символов.

Длина = СтрДлина(ИсходнаяСтрока);

Если переданная строка пустая, функция вернёт 0. Если передать значение другого типа (число, дату), платформа выполнит неявное преобразование в строку, и результат будет соответствовать длине строкового представления. Например, СтрДлина(12345) вернёт 5, поскольку число преобразуется в строку «12345».

Английский вариант имени — StrLen(). Обе формы эквивалентны, выбор зависит от настроек конфигурации и принятого стиля кода. В типовых конфигурациях на русском синтаксисе используется СтрДлина.

bsl
Длина = СтрДлина("Пример строки"); // 13

Базовые примеры использования

Простейший сценарий — получить длину строковой переменной и использовать её в условии:

Наименование = "Контрагент ООО Ромашка";

Если СтрДлина(Наименование) > 50 Тогда

Сообщить("Наименование слишком длинное");

КонецЕсли;

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

Если СтрДлина(Комментарий) > 100 Тогда

Комментарий = Лев(Комментарий, 100);

КонецЕсли;

Ещё один практический случай — перебор строки посимвольно, где длина задаёт верхнюю границу цикла:

Для Позиция = 1 По СтрДлина(Текст) Цикл

Символ = Сред(Текст, Позиция, 1);

// обработка символа

КонецЦикла;

Пробелы, переносы и незначащие символы

Функция СтрДлина учитывает все символы, включая пробелы, табуляции и переносы строк. Строка « текст » с двумя пробелами по краям будет иметь длину на 4 больше, чем «текст». Это частый источник ошибок при сравнении введённых пользователем данных с эталонными значениями.

Чтобы получить длину строки без начальных и конечных пробелов, предварительно примените функцию СокрЛП():

ДлинаБезПробелов = СтрДлина(СокрЛП(ПользовательскийВвод));

Для проверки, содержит ли строка что-либо значимое, надёжнее использовать ПустаяСтрока() — она возвращает Истина для строк, состоящих только из пробелов, табуляций и переносов. Сравнение СтрДлина(Строка) = 0 такую строку «пустой» не признает.

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

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

Подходит, когда нужна строгая проверка на абсолютно пустую строку. Не ловит строки из одних пробелов.

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

Подходит для проверки заполненности: строка из пробелов и переносов считается пустой. Не возвращает саму длину.

СтрДлина(СокрЛП(С))

Даёт длину без краевых пробелов. Требует дополнительного вызова, но предсказуема при валидации ввода.

Длина строки в запросах 1С

В языке запросов 1С есть собственная функция ДЛИНАСТРОКИ() — она выполняется на уровне СУБД и не связана напрямую со СтрДлина во встроенном языке. Используется, когда нужно отобрать или отсортировать записи по длине поля прямо в запросе:

ВЫБРАТЬ

Контрагенты.Наименование

ИЗ

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

ГДЕ

ДЛИНАСТРОКИ(Контрагенты.Наименование) > 100

Учтите важный нюанс: строковые реквизиты ограниченной длины в базе хранятся с дополнением пробелами до заданной длины (в зависимости от СУБД и настроек). Поэтому ДЛИНАСТРОКИ может вернуть не ожидаемые 10, а полную длину поля, например 100. Перед применением функции в запросе такое поле стоит обработать — поведение зависит от используемой СУБД, и результат следует проверять на реальных данных.

Граничные случаи и значения Неопределено

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

Если ТипЗнч(Значение) = Тип("Строка") Тогда

Длина = СтрДлина(Значение);

Иначе

Длина = 0;

КонецЕсли;

Отдельный случай — многострочные строки с переносами. Каждый перенос строки (символы ПС/CRLF) тоже входит в длину. При подсчёте «видимой» длины текста из многострочного поля это может давать неожиданные значения. Если нужно посчитать количество строк, а не символов, используйте СтрЧислоСтрок().

Для строк, полученных из файлов в разных кодировках, помните: СтрДлина оперирует уже прочитанной строкой в памяти платформы, поэтому корректность результата зависит от правильного указания кодировки при чтении файла, а не от самой функции.

Типичные ошибки
01
Сравнение СтрДлина(С) = 0 для проверки заполненности: строка из пробелов проходит проверку и попадает в базу как «заполненная»
02
Вызов СтрДлина для значения Неопределено без проверки типа — ошибка исполнения в момент обмена или проведения документа
03
Ожидание, что ДЛИНАСТРОКИ в запросе вернёт «видимую» длину поля: поле фиксированной длины может дать результат с хвостовыми пробелами
04
Подсчёт переносов строк как «невидимых» символов: они входят в длину и ломают проверки на максимальную длину

Проверка результата и отладка

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

Сообщить("Длина: " + СтрДлина(ПроверяемаяСтрока));

В отладчике конфигуратора установите точку останова на строке с вызовом функции и посмотрите значение через «Вычислить выражение» (Shift+F9). Так можно сразу проверить и саму строку — нет ли в ней скрытых пробелов или переносов, которые визуально не заметны.

Для автоматизированной проверки в тестах сравнивайте результат с эталоном: например, для известной строки «Тест» длина должна быть равна 4. Любое отклонение указывает на лишние символы в источнике данных.

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

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

Длина простой строки
Норма

СтрДлина("Тест") = 4

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

Значение больше ожидаемого — в строке есть невидимые пробелы или переносы

Пустая строка
Норма

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

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

Функция возвращает число больше нуля для визуально пустого поля

Значение из запроса
Норма

Тип значения — Строка, длина адекватна данным

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

Значение Неопределено или NULL — функция вызывает ошибку

Практические рекомендации

При работе с пользовательским вводом выстраивайте цепочку: сначала СокрЛП(), затем проверка ПустаяСтрока(), и только потом, если нужно, контроль максимальной длины через СтрДлина(). Такой порядок исключает большинство ошибок валидации.

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

Порядок действий
  1. 1
    Проверьте, что переменная содержит строку (ТипЗнч), а не Неопределено
  2. 2
    При необходимости уберите краевые пробелы функцией СокрЛП
  3. 3
    Получите длину: Длина = СтрДлина(Строка)
  4. 4
    Сравните результат с допустимым ограничением и обработайте превышение
  5. 5
    Проверьте результат в отладчике или через Сообщить
Итог

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

Длина строки в 1С определяется функцией СтрДлина (StrLen), для запросов существует отдельная ДЛИНАСТРОКИ. Учитывайте пробелы, переносы и тип значения: для проверки заполненности надёжнее ПустаяСтрока, а перед вызовом СтрДлина стоит убедиться, что значение — строка.

Часто задаваемые вопросы

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

СтрДлина возвращает число символов и считает строку из пробелов непустой. ПустаяСтрока возвращает Истина, если в строке нет значимых символов — только пробелы, табуляции и переносы. Для проверки заполненности реквизита правильнее использовать ПустаяСтрока.

Как посчитать количество строк в многострочном тексте, а не символов?

Используйте функцию СтрЧислоСтрок(Текст) — она возвращает число строк с учётом переносов. Для обхода строк есть СтрПолучитьСтроку(Текст, НомерСтроки).

Почему ДЛИНАСТРОКИ в запросе возвращает больше, чем видно символов?

Строковые поля фиксированной длины могут храниться с дополнением пробелами до полной длины поля, и функция СУБД учитывает эти пробелы. Поведение зависит от используемой СУБД, поэтому результат стоит проверять на реальных данных и при необходимости обрабатывать значение после выборки.

Что будет, если передать в СтрДлина число или дату?

Платформа неявно преобразует значение в строку, и функция вернёт длину этого строкового представления. Например, для числа 1234 результат будет 4. Полагаться на такое поведение не стоит — лучше явно приводить значение к строке, чтобы код был понятнее.

Работает ли СтрДлина на сервере и в веб-клиенте?

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