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

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

Как получить длину строки в 1С

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

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

Функция доступна и в тонком, и в толстом, и в веб-клиенте, а также на сервере, поэтому код с ней работает одинаково в любых контекстах исполнения. В английском синтаксисе встроенного языка та же функция называется StrLen — полезно знать, если вы читаете чужой код или разрабатываете конфигурацию с английским вариантом синтаксиса.

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

Синтаксис и базовое использование функции СтрДлина

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

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

Сообщить(Длина); // 13

Пустая = "";

Сообщить(СтрДлина(Пустая)); // 0

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

Результат функции обычно сохраняют в переменную или используют сразу в условиях и циклах:

ИНН = "7707083893";

Если СтрДлина(ИНН) = 10 Тогда

Сообщить("ИНН юридического лица");

ИначеЕсли СтрДлина(ИНН) = 12 Тогда

Сообщить("ИНН физического лица");

Иначе

Сообщить("Некорректная длина ИНН");

КонецЕсли;

Что именно считает функция: пробелы, переносы и спецсимволы

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

Символ переноса строки в 1С обычно представлен комбинацией из двух символов — возврата каретки и перевода строки (Символы.ВК + Символы.ПС), поэтому многострочный текст «весит» больше, чем кажется на экране. При подсчёте длины текста из многострочного поля учитывайте эти служебные символы.

Текст = "Строка1" + Символы.ПС + "Строка2";

// Длина включает символ переноса

Сообщить(СтрДлина(Текст));

Если нужно получить длину «значимого» содержимого без краевых пробелов, предварительно примените СокрЛП:

Ввод = "   текст   ";

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

Проверка строки на пустоту: СтрДлина или ПустаяСтрока

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

Сравнение поведения двух подходов:

ЗначениеСтрДлина = 0ПустаяСтрока
"" (пустая строка)ИстинаИстина
" " (только пробелы)ЛожьИстина
"текст"ЛожьЛожь
НеопределеноОшибка преобразованияЛожь

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

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

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

Подходит, когда нужна точная фактическая длина. Не считает пробельную строку пустой.

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

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

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

Комбинированный вариант: точная длина значимого содержимого без краевых пробелов.

Практические сценарии применения

Валидация данных фиксированной длины

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

Функция ИННКорректнойДлины(ИНН)

ИНН = СокрЛП(ИНН);

Длина = СтрДлина(ИНН);

Возврат Длина = 10 Или Длина = 12;

КонецФункции

Обрезка строки под ограничение поля

Если длина строки превышает ограничение реквизита (например, строковое поле ограниченной длины в объекте метаданных), лишнее обрезают функцией Лев с предварительной проверкой длины:

МаксДлина = 100;

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

Комментарий = Лев(Комментарий, МаксДлина);

КонецЕсли;

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

Перебор строки посимвольно

Длина строки используется как верхняя граница цикла при посимвольном разборе — символы нумеруются с 1, а не с 0:

Строка = "А1Б2";

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

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

Сообщить(Символ);

КонецЦикла;

Порядок действий при проверке длины ввода
  1. 1
    Получите значение и приведите его к строке при необходимости
  2. 2
    Очистите краевые пробелы функцией СокрЛП
  3. 3
    Проверьте заполненность через ПустаяСтрока
  4. 4
    Сравните СтрДлина с требуемым значением или диапазоном
  5. 5
    При превышении лимита обрежьте строку функцией Лев или сообщите пользователю об ошибке

Типичные ошибки и подводные камни

Самая распространённая ошибка — передача в функцию значения типа Неопределено или NULL из запроса. В таком случае возникнет ошибка преобразования значения. Перед вызовом проверяйте тип или приводите значение к строке явно.

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

Третий нюанс — путаница между длиной строки и количеством строк в многострочном тексте. Для подсчёта строк используется функция СтрЧислоСтрок, а не СтрДлина. Аналогично для подсчёта вхождений подстроки есть СтрЧислоВхождений.

Типичные ошибки
01
Передача Неопределено или NULL — приводит к ошибке преобразования; проверяйте значение перед вызовом
02
Проверка заполненности через СтрДлина = 0 — строка из пробелов проходит проверку; используйте ПустаяСтрока
03
Перебор символов с нулевого индекса — в 1С первый символ имеет позицию 1
04
Сравнение длин без СокрЛП — лишние пробелы из пользовательского ввода искажают результат

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

Быстрее всего отладить работу с длиной строки через команду Сообщить или окно «Вычислить выражение» (Shift+F9) в режиме отладки. Выведите одновременно саму строку и её длину — так сразу видно расхождения, вызванные невидимыми символами.

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

Обрамление строки квадратными скобками — простой приём, который делает видимыми начальные и конечные пробелы. Если длина больше ожидаемой, ищите пробелы, табуляции или переносы строк в значении.

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

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

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

Возвращается 0

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

Ошибка выполнения — значение не строкового типа

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

Пробелы учитываются в результате

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

Результат меньше ожидаемого — вероятно, строка уже обработана СокрЛП

Посимвольный перебор
Норма

Цикл от 1 до СтрДлина обрабатывает все символы

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

Пропущен первый символ или ошибка выхода за границу

Альтернативы и связанные функции

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

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

ВЫБРАТЬ

Номенклатура.Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

ДЛИНАСТРОКИ(Номенклатура.Артикул) > 10

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

Итог

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

Длина строки в 1С получается функцией СтрДлина, которая считает все символы, включая пробелы и переносы. Для проверки заполненности используйте ПустаяСтрока, для очистки — СокрЛП, в запросах — ДЛИНАСТРОКИ. Перед вызовом убедитесь, что значение имеет строковый тип.

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

Что вернёт СтрДлина для пустой строки?

Функция вернёт число 0. Однако строка, состоящая только из пробелов, пустой для СтрДлина не является — её длина будет равна количеству пробелов. Для такой проверки надёжнее функция ПустаяСтрока.

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

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

Можно ли применить СтрДлина к числу или дате?

Платформа выполнит неявное преобразование в строку, и функция вернёт длину строкового представления. Результат зависит от формата представления, поэтому надёжнее явно преобразовать значение функцией Строка() или Формат() и только потом считать длину.

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

СтрДлина возвращает количество символов в строке, а СтрЧислоСтрок — количество строк в многострочном тексте (число фрагментов, разделённых переносами). Это разные величины, и путать их нельзя.

Как узнать длину строкового поля прямо в запросе?

Используйте функцию языка запросов ДЛИНАСТРОКИ(Поле). Она работает в секциях ВЫБРАТЬ, ГДЕ и УПОРЯДОЧИТЬ ПО, что позволяет отбирать и сортировать записи по длине строки без выгрузки данных в код.

Почему СтрДлина выдаёт ошибку на значении из запроса?

Скорее всего, поле запроса содержит NULL — например, при левом соединении без совпадений. Перед вызовом проверьте значение на NULL или обработайте его функцией ЕСТЬNULL в самом запросе.