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

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

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

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

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

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

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

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

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

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

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

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

Практический сценарий — проверка длины введённого значения перед записью, чтобы не получить ошибку усечения при сохранении в реквизит ограниченной длины:

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

Сообщить("Наименование превышает 100 символов и будет обрезано.");

КонецЕсли;

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

Многострочные строки и служебные символы

Если строка содержит переносы строк, они тоже учитываются в длине. Символ переноса (Символы.ПС) — это один символ, но комбинация «возврат каретки + перевод строки» (CRLF, типична для Windows-файлов) — уже два символа. Из-за этого длина текста, прочитанного из файла, может отличаться от ожидаемой.

Текст = "Строка1" + Символы.ПС + "Строка2";

Длина = СтрДлина(Текст); // 7 + 1 + 7 = 15

Если нужно узнать количество строк в многострочном тексте, а не символов, используйте СтрЧислоСтрок(). Для извлечения конкретной строки — СтрПолучитьСтроку().

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

Подсчёт вхождений конкретного символа или подстроки

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

СтрокаДанных = "Иванов;Петров;Сидоров";

Количество = СтрЧислоВхождений(СтрокаДанных, ";"); // 2

// Число элементов при разборе по разделителю:

ЧислоЭлементов = Количество + 1; // 3

Функция ищет непересекающиеся вхождения. Например, для строки «ааа» и подстроки «аа» результат будет 1, а не 2 — это важно при разборе перекрывающихся паттернов.

Альтернативный способ — разбить строку через СтрРазделить() и посмотреть размер полученного массива. Это удобнее, когда дальше всё равно нужно работать с отдельными частями строки.

Длина строки в запросах и СКД

В языке запросов 1С тоже есть функция длины строки, но с важной особенностью: она называется ДЛИНАСТРОКИ() (или LENGTH) и применяется к строковым полям ограниченной длины.

ВЫБРАТЬ

Номенклатура.Наименование,

ДЛИНАСТРОКИ(Номенклатура.Наименование) КАК Длина

ИЗ

Справочник.Номенклатура КАК Номенклатура

Ограничение: функция не работает с полями неограниченной длины (тип «Строка» без указания длины) — запрос выдаст ошибку. Перед применением приведите значение через ВЫРАЗИТЬ(... КАК Строка(N)) с конкретной длиной.

Для полей фиксированной длины результат может включать дополняющие пробелы, поэтому сравнивайте длину с учётом этого поведения или используйте ПОДСТРОКА() совместно с выражением.

Типичные ошибки
01
Применение ДЛИНАСТРОКИ к полю неограниченной длины — запрос падает с ошибкой, нужно приведение через ВЫРАЗИТЬ
02
Сравнение СтрДлина с лимитом без учёта переносов строк — текст из файла с CRLF оказывается длиннее ожидаемого
03
Передача в СтрДлина значения Неопределено или NULL — ошибка выполнения, сначала проверяйте тип
04
Ожидание, что СтрЧислоВхождений считает перекрывающиеся вхождения — функция этого не делает

Производительность и особенности платформы

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

На тонком и веб-клиенте функция доступна без ограничений, контекст сервера не требуется. Это позволяет выполнять валидацию длины непосредственно в форме до отправки данных на сервер, экономя серверные вызовы.

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

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

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

Чтобы убедиться, что длина подсчитана правильно, выведите строку и её длину рядом и сверьте вручную на коротком примере. Для строк с невидимыми символами полезно заменить служебные знаки на читаемые маркеры:

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

ТекстДляПроверки = СтрЗаменить(ТекстДляПроверки, Символы.Таб, "[ТАБ]");

Сообщить(ТекстДляПроверки + " | Длина: " + СтрДлина(Текст));

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

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

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

Длина простой строки без служебных символов
Норма

Совпадает с ручным подсчётом символов

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

Значение больше ожидаемого — вероятно, есть скрытые пробелы или переносы

Строка, прочитанная из файла
Норма

Длина учитывает переносы в ожидаемом формате

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

Лишние символы из-за CRLF или BOM в начале файла

ДЛИНАСТРОКИ в запросе
Норма

Запрос выполняется и возвращает число

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

Ошибка о невозможности применения к полю неограниченной длины

FAQ

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

СтрДлина возвращает общее количество символов в строке, включая переносы. СтрЧислоСтрок возвращает количество строк в многострочном тексте. Для однострочного текста СтрЧислоСтрок вернёт 1 независимо от длины.

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

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

Можно ли посчитать символы в значении типа Неопределено?

Нет, передача Неопределено вызовет ошибку. Сначала проверьте значение или приведите его через Строка(Значение). Для NULL из запроса используйте функцию ЕСТЬNULL с подстановкой пустой строки.

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

Функция СтрДлина доступна на тонком и веб-клиенте, поэтому её можно вызывать прямо в клиентском обработчике, например в ПриИзменении поля ввода. Серверный вызов не требуется.

Почему ДЛИНАСТРОКИ в запросе выдаёт ошибку?

Функция не поддерживает поля неограниченной длины. Приведите поле к ограниченной строке: ВЫРАЗИТЬ(Поле КАК Строка(1000)), и затем применяйте ДЛИНАСТРОКИ к результату выражения.

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

Если поле связано с реквизитом ограниченной длины, платформа ограничит ввод автоматически. Для произвольного контроля используйте обработчик ПриИзменении со сравнением СтрДлина с лимитом и выводом предупреждения пользователю.

Итог

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

Длина строки в 1С определяется функцией СтрДлина, вхождения подстроки — СтрЧислоВхождений, в запросах — ДЛИНАСТРОКИ с приведением типа. Учитывайте служебные символы и переносы строк, проверяйте значение перед передачей в функцию и тестируйте на реальных данных.