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