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