Разработка и Конфигурация · 9 мин
Как посчитать количество символов в тексте 1С
Как посчитать количество символов в тексте 1С: функция СтрДлина, подсчёт вхождений подстроки, работа с переносами строк и пробелами, примеры кода и частые ошибки.
Подсчёт символов в строке — одна из базовых операций при разработке на платформе 1С:Предприятие. Она нужна при проверке длины ИНН, КПП, номеров документов, при разбивке длинных текстов на части, при валидации пользовательского ввода и при обмене данными с внешними системами, где поля имеют ограничение по длине.
Во встроенном языке 1С для этого есть штатная функция СтрДлина(), а для более сложных задач — подсчёта вхождений подстроки, символов без пробелов или отдельных букв — используются комбинации строковых функций. Ниже разобраны рабочие примеры кода, ограничения платформы и типичные ошибки, из-за которых результат оказывается неверным.
Базовый подсчёт длины строки функцией СтрДлина
Функция СтрДлина(<Строка>) возвращает число символов в переданной строке. Считаются все символы: буквы, цифры, знаки препинания, пробелы, табуляции и непечатаемые символы вроде переноса строки. Пустая строка даёт результат 0.
Текст = "Привет, 1С!";
Длина = СтрДлина(Текст); // 11
Сообщить("Длина строки: " + Длина);
Если переменная имеет тип, отличный от строки (число, дата, ссылка), сначала преобразуйте её в строку функцией Строка() или форматированием, иначе подсчёт будет выполнен над неожиданным представлением значения. Например, дата в строковом виде зависит от региональных настроек сеанса, и её «длина» может отличаться от ожидаемой.
Типичный прикладной сценарий — проверка длины ИНН перед записью в базу:
Если СтрДлина(СокрЛП(ИНН)) <> 10 И СтрДлина(СокрЛП(ИНН)) <> 12 Тогда
Сообщить("ИНН должен содержать 10 или 12 цифр");
КонецЕсли;
Подсчёт символов без пробелов и служебных знаков
Во многих задачах пробелы учитывать не нужно: например, при проверке, ввёл ли пользователь осмысленный текст, или при сравнении строк. Простой способ — удалить пробелы функцией СтрЗаменить() и посчитать длину результата.
Текст = " Пример строки с пробелами ";
БезПробелов = СтрЗаменить(Текст, " ", "");
ДлинаБезПробелов = СтрДлина(БезПробелов);
Обратите внимание на разницу между СокрЛП() и СтрЗаменить(): первая функция убирает пробелы только по краям строки, вторая удаляет все вхождения указанного символа внутри текста. Для очистки от табуляций и неразрывных пробелов (символ с кодом 160, часто попадает в данные при копировании из Excel или веб-страниц) потребуются отдельные замены через Символ(9) и Символ(160).
Текст = СтрЗаменить(Текст, Символ(160), " "); // неразрывный пробел
Текст = СтрЗаменить(Текст, Символ(9), ""); // табуляция
Как посчитать вхождения конкретного символа или подстроки
Для подсчёта количества вхождений подстроки платформа предоставляет функцию СтрЧислоВхождений(<Строка>, <Подстрока>). Она доступна в современных версиях платформы и считает непересекающиеся вхождения с учётом регистра.
Текст = "яблоко, груша, яблоко, слива";
Количество = СтрЧислоВхождений(Текст, "яблоко"); // 2
Если нужно посчитать вхождения без учёта регистра, предварительно приведите обе строки к одному регистру функциями НРег() или ВРег(). Альтернативный универсальный приём, работающий и в старых версиях платформы: заменить искомую подстроку на пустую и сравнить длины.
ИсходнаяДлина = СтрДлина(Текст);
ДлинаБез = СтрДлина(СтрЗаменить(НРег(Текст), НРег(Подстрока), ""));
Количество = (ИсходнаяДлина - ДлинаБез) / СтрДлина(Подстрока);
Приём с разностью длин корректен только если длина заменяемой подстроки больше нуля — при пустой подстроке поиска получится деление на ноль. Всегда проверяйте входные параметры перед вычислением.
Подсчёт символов в многострочном тексте
Поля вида «Комментарий», «Описание» или текстовые макеты обычно содержат переносы строк. СтрДлина() учитывает символы переноса, поэтому длина многострочного текста будет больше, чем сумма видимых символов. Если переносы учитывать не нужно, удалите их перед подсчётом.
ТекстБезПереносов = СтрЗаменить(Текст, Символы.ПС, "");
ТекстБезПереносов = СтрЗаменить(ТекстБезПереносов, Символы.ВК, "");
Длина = СтрДлина(ТекстБезПереносов);
Для подсчёта количества строк в тексте используйте СтрЧислоСтрок(), а для обхода строк — СтрПолучитьСтроку() в цикле. Это удобно, когда нужно посчитать суммарную длину строк без разделителей или проверить длину каждой строки отдельно, например при подготовке данных для выгрузки с ограничением на длину поля.
ВсегоСимволов = 0;
Для НомерСтроки = 1 По СтрЧислоСтрок(Текст) Цикл
ТекущаяСтрока = СтрПолучитьСтроку(Текст, НомерСтроки);
ВсегоСимволов = ВсегоСимволов + СтрДлина(ТекущаяСтрока);
КонецЦикла;
Функция КоличествоСимволовБезПробеловИПереносов(Текст)
Результат = СтрЗаменить(Текст, " ", "");
Результат = СтрЗаменить(Результат, Символы.ПС, "");
Результат = СтрЗаменить(Результат, Символы.ВК, "");
Результат = СтрЗаменить(Результат, Символы.Таб, "");
Возврат СтрДлина(Результат);
КонецФункцииПеребор строки по символам и посимвольный анализ
Когда нужно посчитать только буквы, только цифры или символы определённого набора, применяется цикл с функцией Сред(), извлекающей символ по позиции. Внутри цикла символ проверяется по условию — например, вхождением в строку допустимых значений.
Цифры = "0123456789";
КоличествоЦифр = 0;
Для Позиция = 1 По СтрДлина(Текст) Цикл
Символ = Сред(Текст, Позиция, 1);
Если СтрНайти(Цифры, Символ) > 0 Тогда
КоличествоЦифр = КоличествоЦифр + 1;
КонецЕсли;
КонецЦикла;
Такой подход медленнее встроенных функций на больших текстах, но даёт полный контроль над критериями подсчёта. Для текстов в сотни тысяч символов предпочтительнее комбинации СтрЗаменить() с последующим сравнением длин — они выполняются на уровне платформы и работают заметно быстрее интерпретируемого цикла.
Сравнение подходов
Базовая длина строки. Быстро, но считает всё подряд, включая служебные символы
Подсчёт вхождений подстроки. Просто, но чувствительно к регистру и недоступно в старых версиях платформы
Подсчёт вхождений без учёта регистра и очистка текста. Универсально, но требует проверки на пустую подстроку
Посимвольный анализ по произвольному критерию. Гибко, но медленно на больших объёмах
Проверка результата и ограничения
После реализации подсчёта проверьте его на контрольных примерах: пустая строка должна давать 0, строка из одного пробела — 1 для полного подсчёта и 0 для подсчёта без пробелов, строка с переносами — ожидаемую разницу с вариантом без переносов. Такие граничные случаи быстрее всего выявляют ошибки в логике.
Учитывайте ограничение длины строковых реквизитов в конфигурации: если реквизит объявлен с фиксированной длиной, значение может дополняться пробелами справа при хранении, и СтрДлина() вернёт длину с этими пробелами. Перед подсчётом применяйте СокрЛП(). Для строк неограниченной длины этой проблемы нет, но их нельзя использовать в некоторых операциях сравнения и индексирования.
Как проверить результат
СтрДлина возвращает 0
Ошибка выполнения или значение, отличное от нуля
После СокрЛП длина уменьшается на число краевых пробелов
Длина не меняется — пробелы нестандартные (неразрывные) или СокрЛП не применён
Разница длин с переносами и без равна числу символов переноса
Разница вдвое больше — не удалён символ ВК при комбинации ВК+ПС
Совпадает с ручным подсчётом на коротком тестовом тексте
Заниженный результат — не учтён регистр символов
Частые вопросы
Чем СтрДлина отличается от СтрЧислоСтрок?
СтрДлина возвращает общее количество символов в строке, а СтрЧислоСтрок — количество строк в многострочном тексте, то есть число фрагментов, разделённых переносами. Для однострочного текста СтрЧислоСтрок вернёт 1, а СтрДлина — фактическую длину.
Как посчитать символы без учёта регистра при поиске вхождений?
Приведите и исходный текст, и искомую подстроку к одному регистру функцией НРег() или ВРег(), а затем используйте СтрЧислоВхождений или приём с заменой и разностью длин. Сама функция поиска регистр не игнорирует.
Почему длина строки из Excel больше, чем видно символов?
При копировании из Excel или веб-страниц в текст попадают неразрывные пробелы (код 160), табуляции и служебные символы. Они не отображаются, но учитываются СтрДлина. Удалите их через СтрЗаменить с Символ(160) и Символ(9).
Можно ли посчитать символы в значении реквизита типа «Строка неограниченной длины»?
Да, СтрДлина работает с такими значениями без ограничений. Но если текст получен запросом, помните, что сравнение и группировка неограниченных строк в запросах имеют ограничения — сам подсчёт длины при этом доступен.
Есть ли в 1С аналог регулярных выражений для подсчёта?
Встроенных регулярных выражений во встроенном языке нет. Для сложных шаблонов используют посимвольный перебор с проверками, комбинации СтрЗаменить либо внешние компоненты и средства COM-объектов на Windows, что снижает переносимость решения.
Как посчитать количество слов, а не символов?
Разбейте текст по пробелам через СтрРазделить (в современных версиях платформы) и посчитайте непустые элементы массива, либо подсчитайте вхождения пробелов и добавьте единицу — но второй способ даёт погрешность при двойных пробелах и пробелах по краям.
Что важно запомнить
Длина строки считается функцией СтрДлина, вхождения подстроки — СтрЧислоВхождений или приёмом с заменой и разностью длин. Перед подсчётом очищайте текст от неразрывных пробелов и переносов, если они не должны учитываться, и проверяйте результат на граничных случаях: пустой строке и строке из одних пробелов.