Разработка и Конфигурация · 11 мин
Как посчитать количество символов в строке 1С
Как посчитать количество символов в строке в 1С: функция СтрДлина, работа с многострочными строками, пробелами и переносами. Примеры кода и типичные ошибки.
Подсчёт количества символов в строке — одна из базовых операций при разработке на встроенном языке 1С. Она нужна при проверке длины наименований, валидации введённых пользователем данных, обрезке строк под ограничения полей базы данных и при разборе текстовых файлов. Для этой задачи в платформе предусмотрена встроенная функция СтрДлина(), которая работает одинаково и в тонком клиенте, и на сервере, и в веб-клиенте.
Функция СтрДлина() принимает один параметр — строку — и возвращает число: количество символов в этой строке. Подсчёт ведётся посимвольно, включая пробелы, знаки препинания, цифры и специальные символы. Пустая строка возвращает 0, что удобно использовать в проверках заполненности реквизитов.
Важно понимать, что СтрДлина() считает именно символы, а не байты. Для кириллицы, латиницы и большинства служебных символов результат совпадает с визуальной длиной текста. Однако при работе с переносами строк, табуляцией и неразрывными пробелами есть нюансы, которые разобраны ниже.
Базовый синтаксис функции СтрДлина
Синтаксис функции предельно прост: СтрДлина(<Строка>). Параметр — строковое выражение, переменная или литерал. Возвращаемое значение — число (тип Число). Функция доступна во всех контекстах исполнения: на клиенте, на сервере, в толстом и тонком клиенте, в мобильной платформе.
Пример простейшего использования:
Текст = "Привет, 1С!";
Длина = СтрДлина(Текст); // Результат: 11
Сообщить("Длина строки: " + Длина);
Обратите внимание: в примере выше посчитаны все символы, включая пробел, запятую и восклицательный знак. Если передать в функцию значение не строкового типа, платформа попытается привести его к строке, но надёжнее явно преобразовывать значения через функцию Строка() или использовать строковые переменные.
Для пустой строки функция вернёт ноль, что часто используется в условиях:
Если СтрДлина(Наименование) = 0 Тогда
Сообщить("Наименование не заполнено");
КонецЕсли;
Для проверки пустоты строки корректнее использовать функцию ПустаяСтрока(), которая дополнительно считает «пустой» строку, состоящую только из пробелов. Но если нужно именно число символов — СтрДлина() остаётся стандартным инструментом.
Длина = СтрДлина("Пример строки"); // вернёт 14Подсчёт символов в переменной и в реквизите объекта
На практике чаще всего длину считают не у литерала, а у переменной или реквизита объекта конфигурации — справочника, документа, регистра. Подход одинаковый: функция принимает любое строковое выражение.
// Длина реквизита документа
ДлинаКомментария = СтрДлина(Объект.Комментарий);
// Длина значения из строки табличной части
Для Каждого СтрокаТовара Из Объект.Товары Цикл
Если СтрДлина(СтрокаТовара.Артикул) > 20 Тогда
Сообщить("Артикул слишком длинный в строке " + СтрокаТовара.НомерСтроки);
КонецЕсли;
КонецЦикла;
Такой код типичен для процедур ОбработкаПроверкиЗаполнения или ПередЗаписью, где нужно убедиться, что пользователь не превысил допустимую длину. Это особенно актуально, если данные дальше выгружаются во внешние системы с жёсткими ограничениями на длину полей — например, в обменах с сайтом или банковскими форматами.
Если реквизит имеет тип «Строка неограниченной длины», СтрДлина() отработает корректно, но сам подсчёт на очень больших текстах (сотни тысяч символов) может занять заметное время в цикле. В таких случаях результат лучше сохранить в переменную, а не вызывать функцию повторно в условии цикла.
Нюансы: пробелы, переносы строк и спецсимволы
Главный источник путаницы — что именно считает СтрДлина(). Функция учитывает каждый символ, включая непечатаемые: пробелы, табуляции, переносы строк, неразрывные пробелы. Поэтому строка, которая выглядит короткой, может иметь неожиданно большую длину.
Многострочная строка в 1С содержит символы переноса. При использовании конструкции с вертикальной чертой каждый переход на новую строку добавляет символ переноса:
Текст = "Первая строка
|Вторая строка";
Длина = СтрДлина(Текст); // перенос тоже посчитан
Неразрывный пробел (код 160) — отдельный символ, отличный от обычного пробела (код 32). Строка «1 000» с неразрывным пробелом имеет длину 5, и простая замена обычных пробелов его не удалит. Это частая причина «лишних» символов при копировании текста из Word или Excel.
Если нужна длина текста без служебных символов, сначала очистите строку:
Текст = СтрЗаменить(Текст, Символы.ПС, "");
Текст = СтрЗаменить(Текст, Символы.ВК, "");
Текст = СтрЗаменить(Текст, Символы.Таб, "");
ЧистаяДлина = СтрДлина(Текст);
Подсчёт символов без пробелов
Частая прикладная задача — узнать длину строки без учёта пробелов: например, при проверке ИНН, номеров телефонов или кодов, куда пользователь мог вставить лишние разделители. Встроенной функции «длина без пробелов» нет, поэтому пробелы удаляют через СтрЗаменить():
СтрокаБезПробелов = СтрЗаменить(ИсходнаяСтрока, " ", "");
ДлинаБезПробелов = СтрДлина(СтрокаБезПробелов);
Для удаления только начальных и конечных пробелов используется функция СокрЛП(). Она не трогает пробелы внутри строки, но убирает ведущие и завершающие пробельные символы, включая табуляции и переносы по краям:
ДлинаОчищенной = СтрДлина(СокрЛП(ПользовательскийВвод));
Есть также парные функции СокрЛ() (только слева) и СокрП() (только справа) — они полезны, когда значимо только одно направление обрезки, например при выравнивании данных из файлов фиксированного формата.
Проверка ограничений длины при вводе и записи
Типовой сценарий — ограничить длину вводимого значения. Если реквизит в метаданных имеет фиксированную длину (например, Строка(50)), платформа сама усечёт лишнее при записи, но молча. Чтобы предупредить пользователя, проверку делают в коде формы или в модуле объекта:
&НаКлиенте
Процедура КомментарийПриИзменении(Элемент)
Если СтрДлина(Объект.Комментарий) > 200 Тогда
ПоказатьПредупреждение(, "Комментарий не должен превышать 200 символов");
КонецЕсли;
КонецПроцедуры
Для полей ввода на форме есть и декларативное решение — свойство «Ограничение длины» (или длина в типе связанного реквизита). Оно блокирует ввод сверх лимита ещё в интерфейсе, без программного кода. Программная проверка при этом остаётся нужной как защита на сервере, потому что клиентские ограничения можно обойти при программной записи объекта.
При обмене данными с внешними системами проверку длины выполняют перед формированием пакета: если поле в принимающей системе ограничено, лучше отклонить запись с понятным сообщением, чем получить ошибку загрузки на той стороне.
- 1Определите, что считать: все символы или только значимые (без пробелов и переносов).
- 2При необходимости очистите строку через СокрЛП() и СтрЗаменить().
- 3Вызовите СтрДлина() и сохраните результат в переменную.
- 4Сравните результат с допустимым лимитом и выведите понятное сообщение пользователю.
- 5Проверьте поведение на пустой строке и строке из одних пробелов.
Альтернативные задачи: количество строк и вхождений подстроки
От подсчёта символов следует отличать смежные задачи, которые решаются другими функциями. Если нужно узнать, сколько строк содержит многострочный текст, используется СтрЧислоСтрок(), а конкретную строку извлекают через СтрПолучитьСтроку().
Количество вхождений подстроки подсчитывается через СтрЧислоВхождений(). Например, число запятых в строке помогает оценить количество элементов списка:
ЧислоЗапятых = СтрЧислоВхождений(СписокСтрокой, ",");
ЧислоЭлементов = ЧислоЗапятых + 1; // при корректном формате
Для разбора сложных текстов удобна СтрРазделить(), которая возвращает массив подстрок по разделителю — длина массива даст количество частей. Все эти функции дополняют СтрДлина() и вместе покрывают большинство задач обработки текста во встроенном языке.
Сравнение вариантов
Количество символов в строке. Подходит для проверки длины и валидации; не различает пустую строку и строку из пробелов.
Проверка отсутствия значимого содержимого. Строка из пробелов считается пустой; число символов не возвращает.
Количество строк в многострочном тексте. Не подходит для подсчёта символов.
Сколько раз подстрока встречается в тексте. Используется для анализа структуры, а не общей длины.
Проверка результата и отладка
Убедиться, что СтрДлина() вернула ожидаемое значение, проще всего через отладчик: поставьте точку останова после вызова и посмотрите значение переменной в табло. Если длина «не сходится» с визуальной оценкой, проверьте строку на скрытые символы — выведите её с явными маркерами границ:
Сообщить("[" + ПроверяемаяСтрока + "] длина: " + СтрДлина(ПроверяемаяСтрока));
Квадратные скобки сразу покажут начальные и конечные пробелы. Для поиска неразрывных пробелов и табуляций полезно пройтись по строке посимвольно и вывести коды символов через КодСимвола() — так видно, какие именно символы увеличивают длину.
В управляемых формах удобно временно добавить на форму числовое поле, связанное с реквизитом, и записывать туда результат СтрДлина() при изменении текста — это наглядно и не требует запуска отладчика.
Как проверить результат
СтрДлина("") возвращает 0
Ошибка выполнения — значит, в функцию попало не строковое значение
СтрДлина возвращает число пробелов, ПустаяСтрока — Истина
Проверка заполненности через СтрДлина пропускает пустое по смыслу значение
После замены неразрывных пробелов длина совпадает с ожидаемой
Длина больше ожидаемой — в тексте скрытые символы
FAQ
Чем отличается СтрДлина от ПустаяСтрока?
СтрДлина возвращает число символов и ничего не знает о «смысловой» пустоте: строка из пяти пробелов даст 5. ПустаяСтрока возвращает Истина, если в строке нет ни одного значимого символа, и подходит именно для проверок заполненности.
Считает ли СтрДлина переносы строк?
Да, каждый символ переноса учитывается. Если в тексте используются сочетания ВК+ПС, один визуальный переход может дать два символа. Перед подсчётом «чистой» длины удалите переносы через СтрЗаменить.
Как посчитать длину строки без пробелов?
Удалите пробелы функцией СтрЗаменить(Строка, " ", "") и затем вызовите СтрДлина. Учтите, что неразрывный пробел (код 160) так не удаляется — его нужно заменять отдельно через Символ(160).
Работает ли СтрДлина на клиенте и на сервере?
Да, функция доступна во всех контекстах исполнения: тонкий, толстый и веб-клиент, сервер, мобильная платформа. Директивы компиляции для неё не нужны.
Что вернёт СтрДлина, если передать не строку?
Платформа попытается привести значение к строке, но поведение зависит от типа. Надёжнее явно преобразовать значение функцией Строка() перед подсчётом, особенно для значений из запросов и составных типов.
Как ограничить длину ввода в поле формы без кода?
Задайте длину в типе реквизита в метаданных (например, Строка(50)) или используйте свойство ограничения длины у поля ввода. Программную проверку на сервере стоит оставить как дополнительную защиту при записи объекта.
Что важно запомнить
Количество символов в строке 1С возвращает функция СтрДлина(). Она считает все символы, включая пробелы и переносы, поэтому для «чистой» длины строку предварительно очищают через СокрЛП() и СтрЗаменить(). Для проверки заполненности вместо длины используйте ПустаяСтрока(), а для многострочных текстов — СтрЧислоСтрок().