Разработка и Конфигурация · 10 мин
Как посчитать количество символов в строке в 1С
Как посчитать количество символов в строке в 1С: функция СтрДлина, подсчёт без пробелов, вхождений подстроки, нюансы для запросов и типовых конфигураций.
Подсчёт символов в строке — одна из базовых задач при разработке и доработке конфигураций 1С. Она возникает при проверке длины ИНН, КПП, номеров документов, при обрезке длинных наименований, при валидации данных, введённых пользователем, и при формировании текстовых файлов обмена с фиксированной шириной полей.
Во встроенном языке 1С для этого есть готовая функция СтрДлина(), но на практике одной её часто недостаточно: нужно считать символы без пробелов, определять количество вхождений подстроки, ограничивать ввод в полях формы или проверять длину прямо в запросе. Каждый из этих сценариев решается по-своему, и у каждого способа есть ограничения.
Ниже разобраны основные приёмы подсчёта символов в 1С с готовыми фрагментами кода, типичными ошибками и способами проверки результата. Примеры применимы как к управляемым, так и к обычным формам, если не указано иное.
Базовый способ: функция СтрДлина
Функция СтрДлина(<Строка>) возвращает количество символов в переданной строке. Это самый простой и самый быстрый способ, который подходит для большинства задач. Функция работает на клиенте и на сервере, не требует обращения к базе данных и доступна во всех режимах исполнения.
Пример использования:
Наименование = "Контрагент ООО «Ромашка»";
Длина = СтрДлина(Наименование);
// Длина = 24
Если СтрДлина(СокрЛП(ИНН)) <> 10 И СтрДлина(СокрЛП(ИНН)) <> 12 Тогда
Сообщить("ИНН должен содержать 10 или 12 символов");
КонецЕсли;
Важно понимать, что СтрДлина считает все символы, включая пробелы (в начале, в конце и внутри строки), знаки табуляции и переносы строк. Поэтому перед проверкой длины пользовательского ввода строку почти всегда следует обработать функцией СокрЛП(), которая убирает незначащие пробелы по краям.
Если передать в функцию значение, не приведённое к строке, результат может отличаться от ожидаемого: число или дата будут сначала неявно преобразованы в строковое представление. Надёжнее явно использовать Строка(Значение) или Формат(), чтобы контролировать, что именно подсчитывается.
Длина = СтрДлина(СокрЛП(ПроверяемаяСтрока));Подсчёт символов без пробелов и служебных знаков
Частая задача — узнать «чистую» длину текста без пробелов, например при проверке минимальной осмысленной длины комментария или при подготовке данных к выгрузке. Стандартной функции для этого нет, но задача решается комбинацией СтрЗаменить и СтрДлина.
Пример подсчёта без пробелов:
ИсходнаяСтрока = "Пример строки с пробелами";
БезПробелов = СтрЗаменить(ИсходнаяСтрока, " ", "");
ДлинаБезПробелов = СтрДлина(БезПробелов);
Если нужно убрать не только обычные пробелы, но и табуляции с переносами строк, последовательно удаляйте символы Символы.Таб, Символы.ПС и Символы.ВК тем же способом. Класс Символы содержит все непечатаемые символы, которые могут встретиться в тексте.
Для многострочных текстов (поля «Комментарий», «Описание») учитывайте, что перенос строки в 1С может состоять из двух символов (ВК + ПС), и при подсчёте «сырой» длины это увеличит результат по сравнению с тем, что видит пользователь.
Подсчёт вхождений символа или подстроки
Иногда нужно узнать не общую длину, а сколько раз в строке встречается конкретный символ или фрагмент: количество запятых в списке, число разделителей в пути к файлу, количество строк в многострочном тексте.
Для этого во встроенном языке есть функция СтрЧислоВхождений(<Строка>, <ПодстрокаПоиска>):
Список = "Яблоки, Груши, Апельсины";
КоличествоЗапятых = СтрЧислоВхождений(Список, ",");
// КоличествоЗапятых = 2, значит элементов в списке 3
Текст = "Строка 1
|Строка 2
|Строка 3";
КоличествоСтрок = СтрЧислоВхождений(Текст, Символы.ПС) + 1;
Альтернативный подход — разбить строку функцией СтрРазделить() в массив и взять его количество элементов. Этот вариант удобнее, когда дальше нужно работать и с самими частями строки, а не только с их числом.
Подсчёт длины строки в запросе
Когда проверку длины нужно выполнить массово — например, найти всех контрагентов с некорректной длиной ИНН — делать это перебором в цикле нерационально. В языке запросов 1С есть функция ДЛИНА(<Поле>), которая вычисляет длину строкового поля на стороне СУБД.
Пример запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| ДЛИНА(Контрагенты.ИНН) КАК ДлинаИНН
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| ДЛИНА(Контрагенты.ИНН) НЕ В (10, 12)
| И Контрагенты.ИНН <> """"";
Такой запрос выполнится быстро даже на больших справочниках, потому что вся фильтрация происходит на сервере базы данных. Учтите, что функция ДЛИНА применима только к строковым полям; для полей неограниченной длины (тип «Строка» без указания длины) её поведение зависит от используемой СУБД, и на больших текстах возможны ограничения.
Если строковое поле может содержать значение NULL (например, при левом соединении таблиц), функция ДЛИНА вернёт NULL, и условие сравнения не сработает так, как ожидается. Обрабатывайте такие случаи через ЕСТЬNULL(ДЛИНА(Поле), 0).
Ограничение ввода и контроль длины в формах
Если задача — не дать пользователю ввести строку длиннее допустимой, правильнее не считать символы после ввода, а ограничить ввод заранее. Для этого у строковых реквизитов объектов метаданных есть свойство «Длина» (и признак «Допустимая длина»: фиксированная или переменная). Платформа сама не позволит записать значение длиннее установленного — лишние символы будут отсечены.
Для полей ввода на форме, не связанных напрямую с реквизитом объекта, длину можно контролировать в обработчике ПриИзменении:
&НаКлиенте
Процедура КомментарийПриИзменении(Элемент)
Максимум = 500;
ТекущаяДлина = СтрДлина(Комментарий);
Если ТекущаяДлина > Максимум Тогда
Комментарий = Лев(Комментарий, Максимум);
ПоказатьПредупреждение(, "Текст сокращён до " + Максимум + " символов");
КонецЕсли;
КонецПроцедуры
Функция Лев(Строка, N) возвращает первые N символов строки — это стандартный способ обрезки. Аналогично Прав() берёт символы с конца, а Сред() — фрагмент из середины. Комбинация этих функций со СтрДлина покрывает практически все задачи обработки строк.
- 1Определите максимально допустимую длину и зафиксируйте её константой или в свойствах реквизита
- 2Перед подсчётом очистите строку функцией СокрЛП от краевых пробелов
- 3Выполните проверку: СтрДлина(СокрЛП(Значение)) сравните с допустимыми значениями
- 4При превышении обрежьте строку функцией Лев() либо выведите понятное сообщение пользователю
- 5Проверьте поведение на пустой строке, строке из одних пробелов и строке максимальной длины
Проверка результата и типичные ошибки
После внедрения проверки длины протестируйте её на граничных значениях: пустая строка, строка ровно максимальной длины, строка на один символ длиннее, строка с пробелами по краям и строка с переносами. Именно на границах чаще всего обнаруживаются ошибки в условиях сравнения (например, путаница между > и >=).
Как проверить результат
СтрДлина возвращает 0
Возвращается значение больше 0 — в строке есть незаметные символы
После СокрЛП длина уменьшилась на число краевых пробелов
Длина не изменилась — СокрЛП не применён или применён не к той переменной
Все записи с некорректной длиной попали в выборку
Часть записей потеряна — проверьте NULL и тип поля
Результат не длиннее заданного предела
Строка длиннее предела — проверьте порядок обрезки и подсчёта
Частые вопросы
Чем СтрДлина отличается от ДЛИНА в запросе?
СтрДлина — функция встроенного языка, работает с конкретным значением в коде. ДЛИНА — функция языка запросов, вычисляется на стороне СУБД для полей таблиц и позволяет фильтровать большие объёмы данных без перебора в цикле. Для массовых проверок предпочтителен запрос, для одиночных значений — СтрДлина.
Как посчитать количество строк в многострочном тексте?
Используйте СтрЧислоСтрок(Текст) — она возвращает число строк с учётом переносов. Отдельную строку по номеру можно получить функцией СтрПолучитьСтроку(Текст, НомерСтроки).
Считает ли СтрДлина переносы строк?
Да. Перенос строки учитывается как символ (а комбинация ВК+ПС — как два символа). Если нужна длина видимого текста, удалите переносы через СтрЗаменить(Текст, Символы.ПС, "") перед подсчётом.
Как проверить, что строка состоит только из цифр и имеет нужную длину?
Сначала проверьте длину через СтрДлина(СокрЛП(Строка)), затем состав строки — например, функцией СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке() из БСП или собственным перебором символов.
Можно ли ограничить длину строки неограниченной длины?
На уровне метаданных — нет, для этого тип нужно изменить на строку фиксированной длины. Программно ограничение реализуется проверкой СтрДлина в обработчиках формы и в процедуре ПередЗаписью объекта.
Почему при выгрузке в файл длина поля «не сходится»?
СтрДлина считает символы, а файловые форматы часто оперируют байтами. Для кириллицы в UTF-8 один символ может занимать два байта. Сверяйте требования формата и при необходимости вычисляйте длину в байтах через ПолучитьДвоичныеДанныеИзСтроки с указанием кодировки.
Что важно запомнить
Основной инструмент подсчёта символов в 1С — функция СтрДлина, дополненная СокрЛП для очистки пробелов. Для массовых проверок используйте ДЛИНА в запросе, для подсчёта вхождений — СтрЧислоВхождений, для обрезки — Лев и Прав. Всегда тестируйте проверки на пустых, граничных и содержащих служебные символы строках.