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

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

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

Как проверить длину строки в запросе 1С: оператор ПОДОБНО с символами подчёркивания, СтрДлина в коде, проверка через ВЫРАЗИТЬ и типичные ошибки разработчика.

Проверка длины строки — типичная задача при работе с данными в 1С: найти контрагентов с некорректным ИНН, отобрать артикулы нестандартной длины, выявить пустые или «переполненные» поля. Сложность в том, что в языке запросов 1С нет функции наподобие LENGTH(), которая вернула бы длину строки напрямую. Поэтому разработчики применяют обходные приёмы.

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

Ниже разобраны все практические способы: от простого условия ПОДОБНО до комбинации с ВЫРАЗИТЬ и проверки длины в построителе отчёта. Примеры даны на встроенном языке 1С и языке запросов, их можно переносить в свою конфигурацию с минимальной адаптацией.

Почему в запросе 1С нельзя просто вызвать СтрДлина

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

Из-за этого попытка написать ГДЕ СтрДлина(Контрагент.ИНН) = 10 приведёт к ошибке «Поле не найдено» или «Неверные параметры» ещё на этапе проверки запроса конструктором. Нужен другой подход — сопоставление с шаблоном.

Способ 1. Проверка точной длины через ПОДОБНО

Каждый символ подчёркивания _ в шаблоне ПОДОБНО означает ровно один произвольный символ. Чтобы найти строки длиной, например, 10 символов (как ИНН юридического лица), шаблон составляется из десяти подчёркиваний:

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

Контрагенты.ИНН ПОДОБНО "__________"

Такой запрос вернёт только те записи, где ИНН состоит ровно из 10 символов. Записи с пустым ИНН, с пробелами, с 9 или 12 символами в результат не попадут. Это удобно для быстрой валидации данных перед обменом с внешними системами.

Обратная проверка — найти строки, длина которых не равна нужной:

ГДЕ

НЕ Контрагенты.ИНН ПОДОБНО "__________"

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

Условие <> "" добавлено осознанно: пустая строка не совпадает с шаблоном из подчёркиваний, и без отдельного отсечения пустых значений выборка будет замусорена записями, где поле просто не заполнено.

Как составить шаблон для точной длины
  1. 1
    Определите требуемую длину строки в символах, например 12 для ИНН физлица
  2. 2
    Сформируйте шаблон из такого же количества символов подчёркивания
  3. 3
    Добавьте условие Поле ПОДОБНО "шаблон" в секцию ГДЕ
  4. 4
    Выполните запрос и проверьте, что в результате нет строк другой длины

Способ 2. Проверка минимальной или максимальной длины

Строки не короче заданной длины

Добавление символа % (любое количество любых символов) в конец шаблона превращает проверку в «не меньше N символов»:

ГДЕ

Контрагенты.НаименованиеПолное ПОДОБНО "_____%"

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

Строки не длиннее заданной длины

Прямого шаблона «не более N символов» в ПОДОБНО нет. Проверка выполняется через отрицание: строка короче или равна N, если она не совпадает с шаблоном «N+1 символ и далее»:

ГДЕ

НЕ Контрагенты.КодПоОКПО ПОДОБНО "_________%"

Здесь отбираются строки длиной не более 8 символов. Учтите, что в выборку попадут и пустые строки — при необходимости отсекайте их отдельным условием.

Способ 3. Проверка длины для полей неограниченной длины и составных типов

Если реквизит объявлен как строка неограниченной длины, ПОДОБНО к нему может не применяться — платформа выдаст ошибку сравнения. Решение — привести значение к строке фиксированной длины через ВЫРАЗИТЬ:

ВЫБРАТЬ

ВЫРАЗИТЬ(Товары.Описание КАК Строка(100)) КАК Описание

ПОМЕСТИТЬ ВТ_Описания

ИЗ

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

;

ВЫБРАТЬ

ВТ_Описания.Описание

ИЗ

ВТ_Описания КАК ВТ_Описания

ГДЕ

ВТ_Описания.Описание ПОДОБНО "____________________%"

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

Способ 4. Проверка длины в коде через СтрДлина

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Если СтрДлина(СокрЛП(Выборка.ИНН)) <> 10

И СтрДлина(СокрЛП(Выборка.ИНН)) <> 12 Тогда

Сообщить("Некорректная длина ИНН: " + Выборка.Наименование);

КонецЕсли;

КонецЦикла;

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

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

Маршрут решения

Как выбрать способ

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

Проверка длины в динамическом списке и СКД

В динамических списках и схеме компоновки данных действуют те же правила языка запросов. Условие по длине добавляется в произвольный текст запроса набора данных либо в отбор СКД через сравнение «Подобно» с шаблоном из подчёркиваний.

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

Типичные ошибки
01
Попытка использовать СтрДлина() в тексте запроса — функция доступна только во встроенном языке, запрос завершится ошибкой
02
Забытый СокрЛП() при проверке в коде — хвостовые пробелы фиксированных строк искажают длину
03
Шаблон из подчёркиваний без отсечения пустых строк — пустые значения не совпадают с шаблоном и искажают выборку при отрицании
04
Применение ПОДОБНО к строке неограниченной длины без ВЫРАЗИТЬ — ошибка выполнения запроса
05
Игнорирование спецсимволов: %, _, [ и ] в шаблоне имеют служебное значение и требуют экранирования через СПЕЦСИМВОЛ

Экранирование спецсимволов в шаблоне

Если сама строка может содержать символы %, _, [, ], они воспринимаются как служебные. Для поиска их как обычных символов используется конструкция СПЕЦСИМВОЛ:

ГДЕ

Товары.Артикул ПОДОБНО "%~_%" СПЕЦСИМВОЛ "~"

Здесь символ ~ объявлен экранирующим, и последовательность ~_ означает буквальный символ подчёркивания в артикуле, а не «любой символ». Без экранирования отбор по артикулам с подчёркиваниями дал бы неверный результат.

Итог

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

В запросе 1С длина строки проверяется только через ПОДОБНО: одно подчёркивание — один символ, «%» в конце — «не меньше заданной длины», отрицание — «не больше». Для строк неограниченной длины сначала применяйте ВЫРАЗИТЬ. В коде модуля используйте СтрДлина(СокрЛП(Значение)), не забывая про хвостовые пробелы.

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

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

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

Как найти все записи, где ИНН не 10 и не 12 символов?

Условие: ГДЕ НЕ ИНН ПОДОБНО "__________" И НЕ ИНН ПОДОБНО "____________" И ИНН <> "". Последнее условие отсекает пустые значения, которые тоже не совпадают с шаблонами.

Почему ПОДОБНО с подчёркиваниями возвращает лишние строки?

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

Работает ли ПОДОБНО с числовыми полями?

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

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

Точно так же, как к реквизиту справочника: обратитесь к полю табличной части в секции ИЗ (Документ.Реализация.Товары) и добавьте условие ПОДОБНО в секцию ГДЕ. Ограничений по типу источника данных здесь нет.

Влияет ли регистр букв на проверку длины через ПОДОБНО?

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