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

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

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

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

Функция ДЛИНАСТРОКИ: как она работает в языке запросов 1С

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

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

Функцию можно использовать в трёх местах запроса: в списке выбираемых полей (чтобы получить длину как колонку результата), в секции ГДЕ (чтобы отфильтровать записи по длине) и в секции ИМЕЮЩИЕ при группировке. Во всех случаях синтаксис одинаковый.

Базовый синтаксис и простой пример

Минимальный запрос, который возвращает наименование элемента справочника и его длину, выглядит так:

ВЫБРАТЬ

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

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

ИЗ

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

В результате запроса появится колонка ДлинаНаименования с числовым значением. Если поле содержит пустую строку, функция вернёт 0. Если поле имеет значение NULL (например, при левом соединении), результат тоже будет NULL, а не ноль — это частая причина неожиданного поведения при сравнениях.

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

Как отфильтровать записи по длине строки

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

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

ДЛИНАСТРОКИ(Контрагенты.ИНН) <> 10

И ДЛИНАСТРОКИ(Контрагенты.ИНН) <> 12

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

При сравнении помните про NULL: если поле ИНН равно NULL, условие ДЛИНАСТРОКИ(ИНН) <> 10 не выполнится, потому что любое сравнение с NULL даёт ложь. Чтобы захватить и такие записи, добавьте проверку ИЛИ Контрагенты.ИНН ЕСТЬ NULL.

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

ДЛИНАСТРОКИ в группировках и соединениях

Функция совместима с группировкой. Например, можно посчитать, сколько элементов имеет каждую длину наименования:

ВЫБРАТЬ

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

КОЛИЧЕСТВО(*) КАК КоличествоЗаписей

ИЗ

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

СГРУППИРОВАТЬ ПО

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

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

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

Сортировка по длине строки

Отдельный полезный сценарий — упорядочивание результата по длине: УПОРЯДОЧИТЬ ПО ДЛИНАСТРОКИ(Наименование) УБЫВ. Так можно быстро вывести самые длинные или самые короткие значения в начало выборки при ручной проверке данных.

Особенности на разных СУБД: пробелы и тип поля

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

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

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

Альтернативы: СтрДлина() в коде и постобработка

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

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

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

ДЛИНАСТРОКИ в запросе

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

СтрДлина в коде после выборки

Гибче: можно комбинировать с СокрЛП и другими функциями; минус — нужно выгрузить все строки в память

Вычисляемый реквизит объекта

Лучший вариант для постоянных отборов по длине; требует доработки конфигурации и заполнения при записи

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

Первая ошибка — забыть про NULL и получить «пропавшие» записи при фильтрации. Вторая — сравнивать результат ДЛИНАСТРОКИ со строкой вместо числа: условие ДЛИНАСТРОКИ(Поле) = "10" приведёт к ошибке несоответствия типов. Третья — ожидать одинаковый результат на разных СУБД для полей фиксированной длины с хвостовыми пробелами.

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

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

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

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

Длина известного значения
Норма

Совпадает с ручным подсчётом символов

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

Расходится — вероятны хвостовые пробелы или служебные символы

Записи с пустым полем
Норма

Пустая строка даёт 0, NULL-поля обработаны через ЕСТЬNULL

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

Часть записей пропала из результата без причины

Время выполнения запроса
Норма

Запрос отрабатывает быстро на рабочем объёме данных

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

Полное сканирование таблицы при фильтрации по длине

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

Чем ДЛИНАСТРОКИ в запросе отличается от СтрДлина в коде?

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

Почему ДЛИНАСТРОКИ возвращает NULL вместо числа?

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

Как найти записи с пустым строковым полем?

Используйте условие ДЛИНАСТРОКИ(Поле) = 0 для пустых строк и отдельно проверку Поле ЕСТЬ NULL, если поле может быть не заполнено совсем. Объедините условия через ИЛИ, чтобы захватить оба случая.

Можно ли посчитать длину строки без учёта пробелов в запросе?

Напрямую нет: в языке запросов нет аналогов СокрЛП или СтрЗаменить. Если нужна длина без пробелов, выберите строки запросом и обработайте их в коде, либо храните очищенное значение в отдельном реквизите.

Работает ли ДЛИНАСТРОКИ с полями неограниченной длины?

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

Можно ли использовать ДЛИНАСТРОКИ в СКД?

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

Итог

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

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