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

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

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

Как определить длину строки в 1С с помощью СтрДлина: синтаксис, примеры кода, подсчёт символов с учётом пробелов, проверка длины полей и типичные ошибки.

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

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

Функция СтрДлина: синтаксис и принцип работы

Функция СтрДлина() — штатный способ узнать количество символов в строке. Она доступна и в тонком, и в толстом клиенте, и на сервере, и во внешних соединениях, поэтому код с ней работает в любом контексте исполнения.

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

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

Важная особенность: функция считает именно символы, а не байты. Для кириллицы, латиницы, цифр и знаков препинания каждый символ увеличивает результат на единицу, поэтому длина строки «АБВ» равна 3 независимо от кодировки базы данных.

Как СтрДлина учитывает пробелы и служебные символы

Наиболее частая причина «неправильной» длины — пробелы. Функция СтрДлина() считает все символы, включая начальные и конечные пробелы, табуляции и переносы строк. Строка " Иванов " даст результат больше, чем количество букв фамилии.

СтрДлина("  Иванов  ");   // 10 — с учётом пробелов

СтрДлина(СокрЛП(" Иванов ")); // 6 — только буквы

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

Переносы строк тоже являются символами. Текст, собранный из нескольких строк через Символы.ПС или многострочный литерал, будет длиннее, чем видимый текст. При проверке длины многострочного поля это нужно учитывать, иначе текст, который выглядит коротким, не пройдёт проверку лимита.

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

Проверка введённого значения перед записью

Типовой сценарий — валидация на форме или в модуле объекта перед записью. Например, артикул не должен превышать 25 символов, а наименование не должно быть пустым после удаления пробелов.

Если СтрДлина(СокрЛП(Объект.Артикул)) > 25 Тогда

Сообщить("Артикул не должен превышать 25 символов");

Отказ = Истина;

КонецЕсли;

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

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

Отказ = Истина;

КонецЕсли;

Обрезка строки до нужной длины

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

МаксДлина = 100;

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

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

КонецЕсли;

Поиск самой длинной строки в коллекции

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

МаксДлина = 0;

Для Каждого СтрокаТаб Из ТаблицаТоваров Цикл

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

Если ТекДлина > МаксДлина Тогда

МаксДлина = ТекДлина;

КонецЕсли;

КонецЦикла;

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

Как получить длину строки в запросе 1С

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

ВЫБРАТЬ

Товары.Наименование КАК Наименование,

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

ИЗ

Справочник.Номенклатура КАК Товары

ГДЕ

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

Если поле в метаданных объявлено как строка неограниченной длины, попытка применить ДЛИНАСТРОКИ вызовет ошибку запроса. Обходной путь — привести значение к строке фиксированной длины через ВЫРАЗИТЬ(Поле КАК СТРОКА(1000)) и уже к результату применить функцию длины. При этом значения длиннее указанного размера будут усечены, что нужно учитывать в логике проверки.

Отличия длины строки в коде, запросе и СКД

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

КонтекстФункцияОграничения
Модуль, встроенный языкСтрДлина()Работает с любыми строками, включая неограниченные
Текст запросаДЛИНАСТРОКИ()Не принимает строку неограниченной длины
Выражения СКДДЛИНАСТРОКИ()Те же ограничения, что и в запросе
Условие отбора динамического спискаДЛИНАСТРОКИ()Через произвольное выражение отбора

Если нужно отфильтровать записи по длине поля в динамическом списке или отчёте, а поле объявлено неограниченным, надёжнее изменить длину поля в метаданных, если это допустимо по логике данных. Это не только снимет ограничение функции, но и ускорит работу запросов и индексирование.

Типичные ошибки при работе с длиной строки

Типичные ошибки
01
Сравнение СтрДлина(Поле) с лимитом без СокрЛП — строка из одних пробелов проходит проверку на непустоту, а реальные данные с пробелами ошибочно отклоняются
02
Применение ДЛИНАСТРОКИ к полю неограниченной длины в запросе — запрос падает с ошибкой ещё до выполнения
03
Использование СтрДлина для значения NULL из запроса — сначала нужна проверка или функция ЕСТЬNULL, иначе поведение зависит от контекста приведения типов
04
Обрезка строки через Лев без проверки длины в цикле обмена — короткие строки обрабатываются корректно, но логика усекающего преобразования скрыто меняет данные
05
Смешение длины в символах и в байтах при интеграции с внешними системами — лимит внешнего API в байтах не совпадает с результатом СтрДлина для кириллицы

Отдельно стоит упомянуть значение NULL. Если строка получена из запроса и может быть NULL, передавайте её в СтрДлина() только после обработки: либо через ЕСТЬNULL(Поле, "") в самом запросе, либо через проверку ЗначениеЗаполнено() в коде. Это избавит от неочевидных сбоев на редких данных.

Ещё одна ловушка — неразрывные пробелы и символы, скопированные из внешних документов. Они выглядят как обычные пробелы, но СокрЛП() обрабатывает не все их разновидности. Если проверка длины ведёт себя странно на данных, вставленных из Excel или веб-страниц, проверьте коды символов через КодСимвола().

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

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

Длина простой строки
Норма

СтрДлина возвращает ожидаемое число символов

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

Результат больше ожидаемого — в строке есть пробелы или служебные символы

Проверка непустоты
Норма

СтрДлина(СокрЛП(Поле)) больше 0 для заполненного поля

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

Поле визуально пустое, но длина больше нуля — присутствуют неразрывные пробелы

Запрос с ДЛИНАСТРОКИ
Норма

Запрос выполняется и возвращает числовую колонку

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

Ошибка о несовместимости типов — поле имеет неограниченную длину

FAQ: частые вопросы о длине строки в 1С

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

СтрДлина возвращает количество символов в строке, а СтрЧислоСтрок — количество строк в многострочном тексте, то есть число фрагментов, разделённых переносами. Для текста из трёх строк СтрЧислоСтрок вернёт 3 независимо от их длины.

Как узнать длину строки без пробелов вообще, а не только по краям?

СокрЛП убирает пробелы только по краям. Чтобы исключить все пробелы, используйте СтрЗаменить(ИсходнаяСтрока, " ", "") и затем примените СтрДлина к результату. Аналогично можно удалить табуляции и переносы через Символы.Таб и Символы.ПС.

Работает ли СтрДлина на мобильной платформе и в веб-клиенте?

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

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

Примените ВЫРАЗИТЬ(Поле КАК СТРОКА(N)) с достаточным запасом N, а затем ДЛИНАСТРОКИ к результату. Учтите, что значения длиннее N будут усечены, поэтому для точного контроля лучше ограничить длину поля в метаданных или выполнять проверку в коде после выборки.

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

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

Можно ли ограничить длину ввода на форме без кода?

Да. Если поле ввода связано с реквизитом, у которого в метаданных задана длина строки, платформа сама не даст ввести больше символов. Для реквизитов формы без привязки к метаданным длину можно задать в свойствах реквизита формы.

Итог

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

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