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

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

1С: как узнать количество символов в строке

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

Для определения количества символов в строке во встроенном языке 1С используется функция СтрДлина(). Она принимает один параметр — строку — и возвращает целое число: длину строки в символах. Функция доступна во всех современных версиях платформы 1С:Предприятие 8.x и работает одинаково на клиенте и на сервере.

Задача подсчёта символов возникает постоянно: при проверке длины введённого ИНН или номера телефона, при ограничении текста для выгрузки в файл, при разборе строк фиксированного формата. Понимание того, как именно СтрДлина считает пробелы, переносы строк и пустые значения, избавляет от трудноуловимых ошибок в алгоритмах.

Функция СтрДлина: синтаксис и базовый пример

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

bsl
Текст = "Привет, 1С!";
Длина = СтрДлина(Текст); // 11
Сообщить("Длина строки: " + Длина);

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

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

Как СтрДлина считает пробелы и специальные символы

СтрДлина считает абсолютно все символы, включая непечатаемые. Пробелы в начале и конце строки, табуляции, переносы строк — всё это входит в результат. Строка " Текст " с двумя пробелами по краям даст длину на 4 больше, чем ожидает неподготовленный разработчик.

Особого внимания заслуживает перенос строки. В 1С перенос обычно представлен парой символов CR+LF (возврат каретки и перевод строки), и каждый из них считается отдельным символом. Многострочный текст, полученный из текстового документа или поля ввода, может содержать десятки таких пар, заметно увеличивая итоговую длину.

Типичные ошибки
01
Сравнение длины строки с эталоном без СокрЛП: лишние пробелы из поля ввода ломают проверку, хотя визуально строки одинаковы
02
Использование СтрДлина для проверки заполненности строки: строка из одних пробелов имеет длину больше нуля, правильнее проверять ПустаяСтрока(СокрЛП(Значение))
03
Подсчёт символов в многострочном тексте без учёта того, что каждый перенос строки добавляет два символа CR+LF

Подсчёт длины без лишних пробелов

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

bsl
Ввод = "  Иванов Иван  ";
ДлинаОчищенной = СтрДлина(СокрЛП(Ввод)); // 11

Важно понимать ограничение: СокрЛП убирает только крайние пробельные символы. Пробелы внутри строки, в том числе двойные, остаются и учитываются в длине. Если требуется удалить все пробелы вообще, используйте СтрЗаменить(Строка, \" \", \"\") перед подсчётом.

Проверка длины реквизитов и пользовательского ввода

Типовой сценарий — контроль длины данных перед записью или выгрузкой. Например, ИНН юридического лица должен содержать 10 цифр, физического — 12, КПП — 9. Проверка через СтрДлина — первый и самый быстрый фильтр корректности ввода.

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

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

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

Подсчёт символов в многострочном тексте

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

bsl
Текст = "Первая строка
Вторая строка";
ВсегоСтрок = СтрЧислоСтрок(Текст); // 2
ДлинаПервой = СтрДлина(СтрПолучитьСтроку(Текст, 1)); // 14
ОбщаяДлина = СтрДлина(Текст); // включает символы переноса

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

СтрДлина и другие функции работы со строками

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

  • Прав(Строка, СтрДлина(Строка) - 1) — отрезать первый символ;
  • Лев(Строка, СтрДлина(Строка) - 2) — отрезать два последних символа;
  • Сред(Строка, Позиция + 1, СтрДлина(Строка)) — взять всё после найденной позиции разделителя;
  • цикл Для Поз = 1 По СтрДлина(Строка) Цикл с посимвольным разбором через Сред(Строка, Поз, 1) — для проверки, что строка состоит только из цифр.

Способы проверки строки

СтрДлина

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

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

Когда нужно только понять, пустая строка или нет. Быстрее и читабельнее, чем СтрДлина(Строка) = 0

СтрЧислоСтрок

Когда важно количество строк в многострочном тексте, а не общее число символов

Производительность и границы применения

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

Отдельный случай — посимвольный разбор очень длинных строк через Сред в цикле. Такой подход работает, но на строках в сотни тысяч символов становится заметно медленным. Если задача сводится к проверке состава строки или замене, предпочтительнее встроенные функции СтрЗаменить, регулярные выражения через COM-объект (на Windows) или обработка через СтрНайти.

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

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

Функция вернёт 0. Однако для проверки на пустоту лучше использовать ПустаяСтрока(Строка) — этот вариант читабельнее и корректно обрабатывает неопределённые значения после приведения типов.

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

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

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

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

Считает ли СтрДлина переносы строк?

Да. Каждый перенос строки в 1С — это обычно два символа (CR и LF), и оба входят в результат. Если нужна длина видимого текста, удалите символы переноса через СтрЗаменить или используйте СокрЛП для крайних переносов.

Можно ли узнать длину строки в запросе 1С?

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

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

У поля ввода на форме есть свойство ограничения длины, которое наследуется от типа связанного реквизита. Для программного контроля добавьте проверку СтрДлина(СокрЛП(Значение)) в обработчике перед записью и выведите пользователю понятное сообщение с фактической и допустимой длиной.

Итог

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

Количество символов в строке возвращает СтрДлина(Строка); функция считает все символы, включая пробелы и переносы строк. Перед проверками очищайте строку через СокрЛП, для проверки пустоты используйте ПустаяСтрока, а для многострочного текста — СтрЧислоСтрок и СтрПолучитьСтроку.