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

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

Как посчитать количество символов в строке 1С

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

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

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

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

Базовый синтаксис функции СтрДлина

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

Пример простейшего использования:

Текст = "Привет, 1С!";

Длина = СтрДлина(Текст); // Результат: 11

Сообщить("Длина строки: " + Длина);

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

Для пустой строки функция вернёт ноль, что часто используется в условиях:

Если СтрДлина(Наименование) = 0 Тогда

Сообщить("Наименование не заполнено");

КонецЕсли;

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

bsl
Длина = СтрДлина("Пример строки"); // вернёт 14

Подсчёт символов в переменной и в реквизите объекта

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

// Длина реквизита документа

ДлинаКомментария = СтрДлина(Объект.Комментарий);

// Длина значения из строки табличной части

Для Каждого СтрокаТовара Из Объект.Товары Цикл

Если СтрДлина(СтрокаТовара.Артикул) > 20 Тогда

Сообщить("Артикул слишком длинный в строке " + СтрокаТовара.НомерСтроки);

КонецЕсли;

КонецЦикла;

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

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

Нюансы: пробелы, переносы строк и спецсимволы

Главный источник путаницы — что именно считает СтрДлина(). Функция учитывает каждый символ, включая непечатаемые: пробелы, табуляции, переносы строк, неразрывные пробелы. Поэтому строка, которая выглядит короткой, может иметь неожиданно большую длину.

Многострочная строка в 1С содержит символы переноса. При использовании конструкции с вертикальной чертой каждый переход на новую строку добавляет символ переноса:

Текст = "Первая строка

|Вторая строка";

Длина = СтрДлина(Текст); // перенос тоже посчитан

Неразрывный пробел (код 160) — отдельный символ, отличный от обычного пробела (код 32). Строка «1 000» с неразрывным пробелом имеет длину 5, и простая замена обычных пробелов его не удалит. Это частая причина «лишних» символов при копировании текста из Word или Excel.

Если нужна длина текста без служебных символов, сначала очистите строку:

Текст = СтрЗаменить(Текст, Символы.ПС, "");

Текст = СтрЗаменить(Текст, Символы.ВК, "");

Текст = СтрЗаменить(Текст, Символы.Таб, "");

ЧистаяДлина = СтрДлина(Текст);

Подсчёт символов без пробелов

Частая прикладная задача — узнать длину строки без учёта пробелов: например, при проверке ИНН, номеров телефонов или кодов, куда пользователь мог вставить лишние разделители. Встроенной функции «длина без пробелов» нет, поэтому пробелы удаляют через СтрЗаменить():

СтрокаБезПробелов = СтрЗаменить(ИсходнаяСтрока, " ", "");

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

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

ДлинаОчищенной = СтрДлина(СокрЛП(ПользовательскийВвод));

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

Типичные ошибки
01
Сравнение длины с учётом неразрывных пробелов: текст из Excel содержит символ 160, и СтрДлина даёт больше, чем ожидалось — заменяйте его явно.
02
Использование СтрДлина для проверки пустоты вместо ПустаяСтрока(): строка из одних пробелов даст длину больше нуля, и проверка пройдёт неверно.
03
Повторный вызов СтрДлина в условии цикла по большим текстам — результат надо сохранить в переменную один раз.

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

Типовой сценарий — ограничить длину вводимого значения. Если реквизит в метаданных имеет фиксированную длину (например, Строка(50)), платформа сама усечёт лишнее при записи, но молча. Чтобы предупредить пользователя, проверку делают в коде формы или в модуле объекта:

&НаКлиенте

Процедура КомментарийПриИзменении(Элемент)

Если СтрДлина(Объект.Комментарий) > 200 Тогда

ПоказатьПредупреждение(, "Комментарий не должен превышать 200 символов");

КонецЕсли;

КонецПроцедуры

Для полей ввода на форме есть и декларативное решение — свойство «Ограничение длины» (или длина в типе связанного реквизита). Оно блокирует ввод сверх лимита ещё в интерфейсе, без программного кода. Программная проверка при этом остаётся нужной как защита на сервере, потому что клиентские ограничения можно обойти при программной записи объекта.

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

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

Альтернативные задачи: количество строк и вхождений подстроки

От подсчёта символов следует отличать смежные задачи, которые решаются другими функциями. Если нужно узнать, сколько строк содержит многострочный текст, используется СтрЧислоСтрок(), а конкретную строку извлекают через СтрПолучитьСтроку().

Количество вхождений подстроки подсчитывается через СтрЧислоВхождений(). Например, число запятых в строке помогает оценить количество элементов списка:

ЧислоЗапятых = СтрЧислоВхождений(СписокСтрокой, ",");

ЧислоЭлементов = ЧислоЗапятых + 1; // при корректном формате

Для разбора сложных текстов удобна СтрРазделить(), которая возвращает массив подстрок по разделителю — длина массива даст количество частей. Все эти функции дополняют СтрДлина() и вместе покрывают большинство задач обработки текста во встроенном языке.

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

СтрДлина()

Количество символов в строке. Подходит для проверки длины и валидации; не различает пустую строку и строку из пробелов.

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

Проверка отсутствия значимого содержимого. Строка из пробелов считается пустой; число символов не возвращает.

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

Количество строк в многострочном тексте. Не подходит для подсчёта символов.

СтрЧислоВхождений()

Сколько раз подстрока встречается в тексте. Используется для анализа структуры, а не общей длины.

Проверка результата и отладка

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

Сообщить("[" + ПроверяемаяСтрока + "] длина: " + СтрДлина(ПроверяемаяСтрока));

Квадратные скобки сразу покажут начальные и конечные пробелы. Для поиска неразрывных пробелов и табуляций полезно пройтись по строке посимвольно и вывести коды символов через КодСимвола() — так видно, какие именно символы увеличивают длину.

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

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

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

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

СтрДлина("") возвращает 0

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

Ошибка выполнения — значит, в функцию попало не строковое значение

Строка из пробелов
Норма

СтрДлина возвращает число пробелов, ПустаяСтрока — Истина

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

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

Текст из Excel или Word
Норма

После замены неразрывных пробелов длина совпадает с ожидаемой

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

Длина больше ожидаемой — в тексте скрытые символы

FAQ

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

СтрДлина возвращает число символов и ничего не знает о «смысловой» пустоте: строка из пяти пробелов даст 5. ПустаяСтрока возвращает Истина, если в строке нет ни одного значимого символа, и подходит именно для проверок заполненности.

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

Да, каждый символ переноса учитывается. Если в тексте используются сочетания ВК+ПС, один визуальный переход может дать два символа. Перед подсчётом «чистой» длины удалите переносы через СтрЗаменить.

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

Удалите пробелы функцией СтрЗаменить(Строка, " ", "") и затем вызовите СтрДлина. Учтите, что неразрывный пробел (код 160) так не удаляется — его нужно заменять отдельно через Символ(160).

Работает ли СтрДлина на клиенте и на сервере?

Да, функция доступна во всех контекстах исполнения: тонкий, толстый и веб-клиент, сервер, мобильная платформа. Директивы компиляции для неё не нужны.

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

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

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

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

Итог

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

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