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