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

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

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

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

Подсчёт символов в строке — одна из базовых задач при разработке и доработке конфигураций 1С. Она возникает при проверке длины ИНН, КПП, номеров документов, при обрезке длинных наименований, при валидации данных, введённых пользователем, и при формировании текстовых файлов обмена с фиксированной шириной полей.

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

Ниже разобраны основные приёмы подсчёта символов в 1С с готовыми фрагментами кода, типичными ошибками и способами проверки результата. Примеры применимы как к управляемым, так и к обычным формам, если не указано иное.

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

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

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

Наименование = "Контрагент ООО «Ромашка»";

Длина = СтрДлина(Наименование);

// Длина = 24

Если СтрДлина(СокрЛП(ИНН)) <> 10 И СтрДлина(СокрЛП(ИНН)) <> 12 Тогда

Сообщить("ИНН должен содержать 10 или 12 символов");

КонецЕсли;

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

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

1c
Длина = СтрДлина(СокрЛП(ПроверяемаяСтрока));

Подсчёт символов без пробелов и служебных знаков

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

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

ИсходнаяСтрока = "Пример строки с пробелами";

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

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

Если нужно убрать не только обычные пробелы, но и табуляции с переносами строк, последовательно удаляйте символы Символы.Таб, Символы.ПС и Символы.ВК тем же способом. Класс Символы содержит все непечатаемые символы, которые могут встретиться в тексте.

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

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

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

Для этого во встроенном языке есть функция СтрЧислоВхождений(<Строка>, <ПодстрокаПоиска>):

Список = "Яблоки, Груши, Апельсины";

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

// КоличествоЗапятых = 2, значит элементов в списке 3

Текст = "Строка 1

|Строка 2

|Строка 3";

КоличествоСтрок = СтрЧислоВхождений(Текст, Символы.ПС) + 1;

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

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

Когда проверку длины нужно выполнить массово — например, найти всех контрагентов с некорректной длиной ИНН — делать это перебором в цикле нерационально. В языке запросов 1С есть функция ДЛИНА(<Поле>), которая вычисляет длину строкового поля на стороне СУБД.

Пример запроса:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Контрагенты.Ссылка КАК Контрагент,

| ДЛИНА(Контрагенты.ИНН) КАК ДлинаИНН

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| ДЛИНА(Контрагенты.ИНН) НЕ В (10, 12)

| И Контрагенты.ИНН <> """"";

Такой запрос выполнится быстро даже на больших справочниках, потому что вся фильтрация происходит на сервере базы данных. Учтите, что функция ДЛИНА применима только к строковым полям; для полей неограниченной длины (тип «Строка» без указания длины) её поведение зависит от используемой СУБД, и на больших текстах возможны ограничения.

Если строковое поле может содержать значение NULL (например, при левом соединении таблиц), функция ДЛИНА вернёт NULL, и условие сравнения не сработает так, как ожидается. Обрабатывайте такие случаи через ЕСТЬNULL(ДЛИНА(Поле), 0).

Ограничение ввода и контроль длины в формах

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

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

&НаКлиенте

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

Максимум = 500;

ТекущаяДлина = СтрДлина(Комментарий);

Если ТекущаяДлина > Максимум Тогда

Комментарий = Лев(Комментарий, Максимум);

ПоказатьПредупреждение(, "Текст сокращён до " + Максимум + " символов");

КонецЕсли;

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

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

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

Проверка результата и типичные ошибки

После внедрения проверки длины протестируйте её на граничных значениях: пустая строка, строка ровно максимальной длины, строка на один символ длиннее, строка с пробелами по краям и строка с переносами. Именно на границах чаще всего обнаруживаются ошибки в условиях сравнения (например, путаница между > и >=).

Типичные ошибки
01
Сравнение длины без СокрЛП: строка из пробелов проходит проверку на минимальную длину, хотя фактически пуста
02
Забытый NULL в запросе: условие с ДЛИНА не срабатывает для записей со значением NULL, и они выпадают из выборки
03
Подсчёт байтов вместо символов при выгрузке в файлы: для кириллицы фиксированная ширина поля нарушается
04
Проверка длины только на клиенте: при обмене данными или программной записи ограничение обходится
05
Использование СтрДлина для значений нестроковых типов без явного преобразования: результат зависит от форматного представления
Контрольные точки

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

Пустая строка
Норма

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

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

Возвращается значение больше 0 — в строке есть незаметные символы

Строка с пробелами по краям
Норма

После СокрЛП длина уменьшилась на число краевых пробелов

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

Длина не изменилась — СокрЛП не применён или применён не к той переменной

Запрос с ДЛИНА
Норма

Все записи с некорректной длиной попали в выборку

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

Часть записей потеряна — проверьте NULL и тип поля

Обрезка длинного текста
Норма

Результат не длиннее заданного предела

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

Строка длиннее предела — проверьте порядок обрезки и подсчёта

Частые вопросы

Чем СтрДлина отличается от ДЛИНА в запросе?

СтрДлина — функция встроенного языка, работает с конкретным значением в коде. ДЛИНА — функция языка запросов, вычисляется на стороне СУБД для полей таблиц и позволяет фильтровать большие объёмы данных без перебора в цикле. Для массовых проверок предпочтителен запрос, для одиночных значений — СтрДлина.

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

Используйте СтрЧислоСтрок(Текст) — она возвращает число строк с учётом переносов. Отдельную строку по номеру можно получить функцией СтрПолучитьСтроку(Текст, НомерСтроки).

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

Да. Перенос строки учитывается как символ (а комбинация ВК+ПС — как два символа). Если нужна длина видимого текста, удалите переносы через СтрЗаменить(Текст, Символы.ПС, "") перед подсчётом.

Как проверить, что строка состоит только из цифр и имеет нужную длину?

Сначала проверьте длину через СтрДлина(СокрЛП(Строка)), затем состав строки — например, функцией СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке() из БСП или собственным перебором символов.

Можно ли ограничить длину строки неограниченной длины?

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

Почему при выгрузке в файл длина поля «не сходится»?

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

Итог

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

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