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

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

Сколько символов в строке в 1С: как определить длину строки

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

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

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

Синтаксис функции СтрДлина

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

Длина = СтрДлина("Привет, 1С!");

Сообщить(Длина); // 10

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

Длина = СтрДлина(Строка(ЗначениеРеквизита));

Базовые примеры использования

Самый частый сценарий — проверка, заполнен ли строковый реквизит, и не превышает ли введённое значение допустимую длину:

Если СтрДлина(Комментарий) > 500 Тогда

Сообщить("Комментарий не должен превышать 500 символов");

КонецЕсли;

Другой пример — валидация значений фиксированной длины. Например, ИНН юридического лица содержит 10 цифр, физического лица — 12:

ИНН = СокрЛП(Объект.ИНН);

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

Сообщить("Некорректная длина ИНН: " + СтрДлина(ИНН));

КонецЕсли;

Обратите внимание на СокрЛП(): без удаления пробелов по краям строки проверка длины даст неверный результат, если пользователь случайно ввёл пробел в начале или конце.

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

Проверка строки на пустоту

Хотя СтрДлина(Строка) = 0 технически работает, для проверки на пустоту в 1С есть специальная функция ПустаяСтрока(). Она считает пустой не только строку нулевой длины, но и строку, состоящую только из пробелов, табуляций и переносов строк. Именно её рекомендуется использовать в проверках заполненности:

Если ПустаяСтрока(Объект.Наименование) Тогда

Сообщить("Наименование не заполнено");

КонецЕсли;

Разница существенна: строка из трёх пробелов имеет длину 3, и проверка СтрДлина() = 0 её не отловит, а ПустаяСтрока() вернёт Истина. Если же нужно различать «совсем пусто» и «только пробелы», используйте комбинацию обеих функций.

Чем проверять строку

СтрДлина(Строка) = 0

Подходит, когда нужна точная нулевая длина. Не отлавливает строки из одних пробелов.

ПустаяСтрока(Строка)

Стандартный способ проверки заполненности: считает пустыми и строки из пробелов, табуляций, переносов.

СтрДлина(СокрЛП(Строка)) = 0

Эквивалент ПустаяСтрока() для большинства случаев, но длиннее в записи.

Длина многострочного текста

Если строка содержит переносы строк, СтрДлина() учитывает и их. При этом важно помнить: символ переноса строки в 1С — это Символы.ПС, но текст, полученный из файлов Windows, часто содержит пару символов ВК+ПС (CR+LF). Каждый такой перенос добавит к длине 2 символа вместо одного.

Если нужно узнать не общую длину, а количество строк в многострочном тексте, используйте функцию СтрЧислоСтрок(), а для получения конкретной строки — СтрПолучитьСтроку():

КоличествоСтрок = СтрЧислоСтрок(Текст);

ПерваяСтрока = СтрПолучитьСтроку(Текст, 1);

ДлинаПервойСтроки = СтрДлина(ПерваяСтрока);

Пробелы и непечатаемые символы

Функция СтрДлина() считает всё: пробелы, табуляции, неразрывные пробелы, нулевые символы. Это частая причина «необъяснимых» расхождений: визуально строка выглядит короткой, а функция возвращает большее число.

Типичный случай — данные, скопированные из Excel или веб-страниц, где вместо обычного пробела стоит неразрывный (символ с кодом 160). СокрЛП() его не всегда удаляет корректно на старых версиях платформы. Для диагностики полезно посмотреть коды символов:

Для Позиция = 1 По СтрДлина(Строка) Цикл

Символ = Сред(Строка, Позиция, 1);

Сообщить("" + Позиция + ": " + Символ + " (код " + КодСимвола(Символ) + ")");

КонецЦикла;

Типичные ошибки при работе с длиной строки
01
Проверка заполненности через СтрДлина() = 0 вместо ПустаяСтрока() — строка из пробелов проходит проверку
02
Сравнение длины без СокрЛП() — краевые пробелы искажают результат валидации
03
Передача в СтрДлина() значения не строкового типа — исключение о несоответствии типов
04
Игнорирование пар CR+LF при подсчёте длины текста из файлов — длина оказывается больше ожидаемой

Ограничения длины строк в реквизитах

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

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

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

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

ВЫБРАТЬ

Контрагенты.Наименование

ИЗ

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

ГДЕ

ДЛИНАСТРОКИ(Контрагенты.Наименование) > 100

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

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

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

Значение, возвращаемое СтрДлина()
Норма

Неотрицательное целое число, совпадающее с видимым количеством символов

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

Число больше ожидаемого — вероятны скрытые пробелы или CR+LF

Проверка заполненности
Норма

ПустаяСтрока() отлавливает и пустую строку, и строку из пробелов

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

Строка из пробелов проходит проверку СтрДлина() = 0

Сохранение длинного текста в реквизит
Норма

Проверка длины выполнена до записи, данные не обрезаются

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

Текст молча обрезан платформой до длины реквизита

Практические рекомендации

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

При обмене данными с внешними системами всегда уточняйте, как там считается длина: в символах или в байтах. Для кириллицы в кодировке UTF-8 один символ занимает 2 байта, и строка, «проходящая» по длине в 1С, может не пройти ограничение принимающей системы.

Итог

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

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

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

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

СтрДлина возвращает точное число символов, а ПустаяСтрока отвечает на вопрос «заполнена ли строка» и считает пустыми строки из одних пробелов, табуляций и переносов. Для проверок заполненности реквизитов правильнее использовать ПустаяСтрока.

Почему СтрДлина возвращает больше символов, чем видно в строке?

Чаще всего в строке есть непечатаемые символы: неразрывные пробелы, табуляции или пары ВК+ПС из скопированного текста. Проверьте коды символов функцией КодСимвола() и при необходимости очистите строку через СтрЗаменить().

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

Используйте функцию СтрЧислоСтрок(Текст). Для доступа к отдельной строке по номеру — СтрПолучитьСтроку(Текст, НомерСтроки). СтрДлина для этой задачи не подходит: она считает символы, а не строки.

Обрезает ли платформа длинную строку при записи в реквизит?

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

Как проверить длину строки в запросе, не выгружая данные?

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

Что вернёт СтрДлина для значения Неопределено?

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