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

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

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

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

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

Важно понимать разницу между СтрДлина в языке запросов и одноимённой функцией встроенного языка 1С: в запросе обработка выполняется на стороне СУБД, а это влияет на поведение с NULL, строками неограниченной длины и производительностью. Ниже разобраны синтаксис, практические примеры, ограничения и типичные ошибки.

Синтаксис функции СтрДлина в языке запросов

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

ВЫБРАТЬ

Номенклатура.Наименование КАК Наименование,

СтрДлина(Номенклатура.Наименование) КАК ДлинаНаименования

ИЗ

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

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

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

Получение длины строки в списке выборки

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

ВЫБРАТЬ

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

Контрагенты.ИНН КАК ИНН,

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

ИЗ

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

Такой запрос сразу покажет записи, где ИНН не соответствует ожидаемой длине (10 или 12 символов). Колонку с длиной можно потом использовать для сортировки или группировки в отчёте на СКД.

Если длина нужна только для анализа и не должна попадать в итоговый отчёт, вычисляйте её во временной таблице или в секции ИТОГИ, чтобы не перегружать результат лишними полями.

Фильтрация записей по длине строки в условии ГДЕ

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

ВЫБРАТЬ

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

Контрагенты.ИНН КАК ИНН

ИЗ

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

ГДЕ

СтрДлина(Контрагенты.ИНН) <> 10

И СтрДлина(Контрагенты.ИНН) <> 12

Запрос вернёт контрагентов, у которых ИНН имеет нестандартную длину — типичный признак ошибки ввода. Аналогично проверяют КПП (9 символов), ОГРН, номера телефонов и другие коды фиксированной длины.

Учтите: фильтр по вычисляемой функции не использует индексы СУБД, поэтому на больших таблицах такой запрос выполняется дольше обычного отбора по равенству. Для разовой проверки данных это приемлемо, но в регламентных операциях лучше ограничивать выборку дополнительными условиями.

Порядок действий
  1. 1
    Откройте консоль запросов или конструктор запроса в конфигураторе
  2. 2
    Добавьте нужную таблицу и выберите строковое поле
  3. 3
    В списке полей или в условии ГДЕ напишите СтрДлина(Поле)
  4. 4
    Выполните запрос и проверьте, что числовая колонка заполнена корректно
  5. 5
    При необходимости добавьте ЕСТЬNULL для обработки пустых значений

Работа с NULL и пустыми строками

Главный подводный камень — значение NULL. Если поле в результате соединения таблиц не заполнено (например, при левом соединении не нашлось соответствия), СтрДлина(NULL) вернёт NULL, а не ноль. Сравнение СтрДлина(Поле) = 0 для такой записи даст ложь, и строка выпадет из отбора незаметно для разработчика.

Чтобы поведение было предсказуемым, оборачивайте аргумент в ЕСТЬNULL:

ВЫБРАТЬ

Заказы.Номер КАК Номер,

СтрДлина(ЕСТЬNULL(Комментарии.Текст, "")) КАК ДлинаКомментария

ИЗ

Документ.ЗаказПокупателя КАК Заказы

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Комментарии КАК Комментарии

ПО Заказы.Ссылка = Комментарии.Объект

Пустая строка и NULL — разные состояния. Для пустой строки СтрДлина вернёт 0, для NULL — NULL. Если в условии нужно отобрать и те и другие записи, комбинируйте проверку: ЕСТЬNULL(СтрДлина(Поле), 0) = 0.

Ограничения: строки неограниченной длины и хвостовые пробелы

Функция СтрДлина не применима к полям типа «строка неограниченной длины» — запрос с таким полем завершится ошибкой. Если нужно оценить длину длинного текста (например, многострочного комментария), предварительно обрежьте его функцией ПОДСТРОКА:

СтрДлина(ПОДСТРОКА(Документ.Комментарий, 1, 1024))

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

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

Альтернативы: длина строки во встроенном языке и в СКД

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

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

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

Сравнение вариантов

СтрДлина в запросе

Подходит для отбора и группировки на стороне СУБД. Ограничение: нет поддержки строк неограниченной длины, требуется обработка NULL.

СтрДлина во встроенном языке

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

Вычисляемое поле СКД

Подходит для отчётов, где длина нужна только для показа или группировки. Ограничение: не влияет на отбор данных набора.

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

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

Вторая ошибка — сравнение длины с учётом пробелов. Строка « 123 » с пробелами имеет длину 5, а не 3. Если данные могут содержать лишние пробелы, сначала нормализуйте их обработкой в коде или учитывайте это при сравнении.

Третья ошибка — ожидание нуля вместо NULL при соединениях. Симптом: записи «теряются» из результата без видимой причины. Лечится обёрткой ЕСТЬNULL вокруг аргумента функции.

Чтобы убедиться в корректности запроса, выполните его в консоли запросов на копии базы и сверьте несколько значений вручную: посчитайте символы в наименовании и сравните с числом в колонке. Совпадение на 3–5 примерах, включая пустые и длинные строки, обычно достаточно.

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

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

Колонка с длиной в результате запроса
Норма

Числовые значения соответствуют ручному подсчёту символов

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

Пустые ячейки (NULL) или значения больше ожидаемых

Отбор по условию СтрДлина(Поле) = N
Норма

Возвращаются все записи с нужной длиной, включая граничные

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

Часть записей отсутствует — вероятен NULL в данных

Запрос выполняется без ошибок
Норма

Все поля строковые или обёрнуты в ПОДСТРОКА

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

Ошибка несовместимости типов при выполнении

Часто задаваемые вопросы

Чем СтрДлина в запросе отличается от СтрДлина в коде 1С?

Функция в запросе выполняется на стороне СУБД и позволяет фильтровать данные до их передачи в приложение, но не работает со строками неограниченной длины и возвращает NULL для NULL-значений. Функция встроенного языка применяется к уже полученным данным, ограничений по длине не имеет, но не может использоваться для отбора на этапе выборки.

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

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

Почему СтрДлина возвращает пустое значение вместо нуля?

Это значит, что аргумент функции равен NULL, что типично для полей из левых соединений без совпадений. Стандарт SQL предписывает возвращать NULL для любых операций с NULL. Обёртка ЕСТЬNULL(Поле, "") решает проблему.

Учитываются ли пробелы при подсчёте длины строки?

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

Можно ли использовать СтрДлина в отчёте на СКД?

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

Замедляет ли СтрДлина выполнение запроса?

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

Итог

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

Длина строки в запросе 1С вычисляется функцией СтрДлина в списке выборки, условии ГДЕ и итогах. Оборачивайте аргумент в ЕСТЬNULL при соединениях, не применяйте функцию к строкам неограниченной длины без ПОДСТРОКА и помните, что пробелы входят в подсчёт. Для уже полученных данных удобнее использовать СтрДлина встроенного языка.