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