Разработка и Конфигурация · 9 мин
Как определить количество символов в строке в 1С
Как определить количество символов в строке в 1С: функция СтрДлина, работа с пробелами и переносами, подсчёт в запросах, типичные ошибки и примеры кода.
Определить количество символов в строке в 1С чаще всего нужно при проверке введённых данных: длина ИНН, номера телефона, артикула, наименования перед записью в справочник. Во встроенном языке платформы для этого есть штатная функция СтрДлина(), которая возвращает число символов переданной строки. В английском синтаксисе она называется StrLen().
Функция работает одинаково в тонком клиенте, толстом клиенте, веб-клиенте и на сервере, поэтому её можно использовать в любых модулях без ограничений. Однако у неё есть особенности: учитываются пробелы и служебные символы, а при передаче значения нестрокового типа возможны ошибки или неожиданные результаты.
Ниже разобраны основные способы подсчёта длины строки: в коде, в запросах, с учётом и без учёта пробелов, а также типичные ошибки и способы проверки результата.
Базовый способ: функция СтрДлина
Функция принимает один параметр — строку — и возвращает число: количество символов в ней. Синтаксис предельно прост:
Наименование = "Конверт почтовый";
Длина = СтрДлина(Наименование); // 16
Если строка пустая, функция вернёт 0. Это удобно для проверки заполненности реквизита, хотя для такой задачи чаще используют ЗначениеЗаполнено(), поскольку она корректно обрабатывает и другие типы данных.
Типичный сценарий — проверка длины перед записью объекта. Например, ИНН юридического лица должен содержать 10 цифр, а физического — 12:
Если СтрДлина(СокрЛП(ИНН)) <> 10 Тогда
Сообщить("ИНН юридического лица должен содержать 10 символов");
Возврат;
КонецЕсли;
Что именно считает функция: пробелы и служебные символы
СтрДлина считает абсолютно все символы, включая те, что не видны на экране: пробелы в начале и конце, табуляции, переносы строк, неразрывные пробелы. Это частая причина расхождений: пользователь видит «Иванов», а функция возвращает 8 вместо 6, потому что в данных затесались два пробела.
Чтобы исключить влияние крайних пробелов, применяйте СокрЛП() перед подсчётом:
СтрокаСРазделителями = " Артикул ";
ДлинаБезПробелов = СтрДлина(СокрЛП(СтрокаСРазделителями)); // 7
Если нужно убрать вообще все пробелы, в том числе внутри строки, используйте СтрЗаменить:
БезПробелов = СтрЗаменить(Строка, " ", "");
Длина = СтрДлина(БезПробелов);
Подсчёт символов в многострочной строке
Многострочные строки в 1С содержат символы переноса (перевод строки и возврат каретки), и СтрДлина учитывает их в общем количестве. Поэтому длина текста из многострочного поля может оказаться больше, чем количество видимых знаков.
Если нужно узнать не общее число символов, а количество строк в тексте, используйте СтрЧислоСтрок(). Для получения конкретной строки по номеру — СтрПолучитьСтроку().
Текст = "Первая строка
|Вторая строка";
КоличествоСтрок = СтрЧислоСтрок(Текст); // 2
ДлинаВСимволах = СтрДлина(Текст); // больше 27 за счёт переноса
Чтобы посчитать только «значимые» символы без переносов, предварительно удалите их через СтрЗаменить, заменяя Символы.ПС и Символы.ВК на пустую строку.
Как определить длину строки в запросе
В языке запросов 1С есть аналогичная функция — ДЛИНАСТРОКИ() (в английском синтаксисе LENGTH). Она применяется к строковому полю и возвращает его длину в символах:
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
ДЛИНАСТРОКИ(Номенклатура.Наименование) КАК Длина
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
ДЛИНАСТРОКИ(Номенклатура.Наименование) > 100
Такой запрос удобен для поиска записей, где наименование превышает допустимую длину, например перед обменом данными с внешней системой, у которой есть ограничение на длину поля.
Учтите: функция ДЛИНАСТРОКИ применима только к строкам неограниченной или фиксированной длины и не работает с полями составного типа без явного приведения. Если поле может содержать NULL, результат также будет NULL — добавляйте проверку или ЕСТЬNULL.
Сравнение способов
Подходит для проверок в модулях, обработчиках форм и перед записью. Учитывает все символы, включая пробелы.
Удобна для массового анализа данных в таблицах без обхода выборки. Не работает с составными типами напрямую.
Возвращает количество строк в многострочном тексте, а не символов. Используйте, когда важна структура текста.
Проверка длины при вводе данных пользователем
На практике подсчёт символов чаще всего нужен для контроля ввода. Типовые сценарии: проверка длины ИНН, КПП, ОГРН, номера телефона, штрихкода, пароля, наименования для печатной формы.
Проверку лучше выполнять в обработчике ПередЗаписью или ПриЗаписи модуля объекта, а не только на форме: тогда контроль сработает и при программной записи, и при обмене данными. Пример для модуля объекта справочника:
Процедура ПередЗаписью(Отказ)
ИННБезПробелов = СокрЛП(ИНН);
Если ЗначениеЗаполнено(ИННБезПробелов)
И СтрДлина(ИННБезПробелов) <> 10
И СтрДлина(ИННБезПробелов) <> 12 Тогда
Сообщить("ИНН должен содержать 10 или 12 символов");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Дополнительно полезно проверять, что строка состоит только из цифр. Для этого строку перебирают посимвольно или используют регулярные выражения через COM-объект VBScript.RegExp на клиенте Windows, либо штатные средства проверки в новых версиях платформы.
- 1Уберите крайние пробелы функцией СокрЛП, если они не значимы
- 2При необходимости удалите неразрывные пробелы через СтрЗаменить с Символ(160)
- 3Вызовите СтрДлина и сравните результат с требуемым значением
- 4При несоответствии выведите понятное сообщение и установите Отказ = Истина
- 5Проверьте результат на тестовых данных с пробелами и пустыми значениями
Типичные ошибки и ограничения
Первая ошибка — передача в СтрДлина значения неопределённого типа или NULL из запроса. Перед вызовом приводите значение к строке функцией Строка() или проверяйте тип через ТипЗнч().
Вторая ошибка — сравнение длины без учёта пробелов. Пользователь копирует ИНН из письма вместе с пробелом, проверка «ровно 10 символов» не проходит, и пользователь не понимает причину. Всегда очищайте строку перед контролем.
Третья ошибка — попытка использовать СтрДлина для определения длины числа. Сначала преобразуйте число в строку, иначе результат будет зависеть от форматирования. И помните: длина строки в символах не равна её размеру в байтах, что важно при обмене через файлы и веб-сервисы.
Как проверить результат
Простейший способ проверить вычисление — вывести результат через Сообщить() в тонком клиенте или использовать табло (вычисление выражения) в конфигураторе во время отладки. В отладчике достаточно остановиться на точке останова и вычислить выражение СтрДлина(Переменная).
Для массовой проверки данных в базе удобнее запрос с ДЛИНАСТРОКИ в консоли запросов: он сразу покажет записи с аномальной длиной без написания обработки.
Как проверить результат
СтрДлина возвращает 0
Возвращает значение больше 0 — в строке есть невидимые символы
ДЛИНАСТРОКИ возвращает число
NULL — поле содержит NULL или составной тип
Длина совпадает с видимым числом знаков
Длина больше — есть пробелы, табуляции или неразрывные пробелы
Что важно запомнить
Для подсчёта символов в строке используйте СтрДлина() в коде и ДЛИНАСТРОКИ() в запросах. Перед проверкой длины очищайте строку от крайних и неразрывных пробелов. Функция считает все символы, включая переносы строк, поэтому для многострочного текста заранее решите, что именно нужно измерить.
Часто задаваемые вопросы
Чем СтрДлина отличается от СтрЧислоСтрок?
СтрДлина возвращает общее количество символов в строке, а СтрЧислоСтрок — количество строк в многострочном тексте. Для однострочного значения СтрЧислоСтрок вернёт 1, даже если символов в строке сотни.
Как посчитать символы без учёта всех пробелов?
Сначала удалите пробелы функцией СтрЗаменить(Строка, " ", ""), а затем вызовите СтрДлина для результата. Для неразрывных пробелов потребуется отдельная замена через Символ(160).
Работает ли СтрДлина на сервере и в веб-клиенте?
Да, функция доступна во всех режимах исполнения: на сервере, в тонком, толстом и веб-клиенте. Ограничений по контексту у неё нет.
Что вернёт СтрДлина для пустой строки и для NULL?
Для пустой строки функция вернёт 0. Значение NULL напрямую передать нельзя — это вызовет ошибку; значения из запроса предварительно обрабатывайте функцией ЕСТЬNULL.
Как проверить, что строка состоит только из цифр?
Переберите строку посимвольно в цикле и проверяйте вхождение каждого символа в строку "0123456789", либо используйте регулярные выражения. Отдельной штатной функции «ЭтоЦифры» во встроенном языке нет.
Совпадает ли длина строки в символах с её размером в файле?
Нет. Размер в байтах зависит от кодировки: в UTF-8 кириллический символ занимает два байта, в UTF-16 — тоже два, а латиница в UTF-8 — один. При обмене файлами учитывайте кодировку отдельно.