Разработка и Конфигурация · 9 мин
Как проверить длину строки в запросе 1С
Как проверить длину строки в запросе 1С: оператор ПОДОБНО с символами подчёркивания, СтрДлина в коде, проверка через ВЫРАЗИТЬ и типичные ошибки разработчика.
Проверка длины строки — типичная задача при работе с данными в 1С: найти контрагентов с некорректным ИНН, отобрать артикулы нестандартной длины, выявить пустые или «переполненные» поля. Сложность в том, что в языке запросов 1С нет функции наподобие LENGTH(), которая вернула бы длину строки напрямую. Поэтому разработчики применяют обходные приёмы.
Основной рабочий инструмент — оператор ПОДОБНО с символами подчёркивания _, каждый из которых означает ровно один произвольный символ. С его помощью можно проверить точную длину, минимальную или максимальную длину строки прямо в условии запроса. Для проверок вне запроса, в коде модуля, используется встроенная функция СтрДлина().
Ниже разобраны все практические способы: от простого условия ПОДОБНО до комбинации с ВЫРАЗИТЬ и проверки длины в построителе отчёта. Примеры даны на встроенном языке 1С и языке запросов, их можно переносить в свою конфигурацию с минимальной адаптацией.
Почему в запросе 1С нельзя просто вызвать СтрДлина
Функция СтрДлина() существует только во встроенном языке 1С и недоступна внутри текста запроса. Запрос выполняется на стороне СУБД, а язык запросов 1С — самостоятельный диалект со своим ограниченным набором функций: ПОДСТРОКА, ЛЕВ, ПРАВ в нём тоже отсутствуют. Единственные строковые инструменты запроса — это ПОДОБНО и сцепка строк через +.
Из-за этого попытка написать ГДЕ СтрДлина(Контрагент.ИНН) = 10 приведёт к ошибке «Поле не найдено» или «Неверные параметры» ещё на этапе проверки запроса конструктором. Нужен другой подход — сопоставление с шаблоном.
Способ 1. Проверка точной длины через ПОДОБНО
Каждый символ подчёркивания _ в шаблоне ПОДОБНО означает ровно один произвольный символ. Чтобы найти строки длиной, например, 10 символов (как ИНН юридического лица), шаблон составляется из десяти подчёркиваний:
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.ИНН
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ИНН ПОДОБНО "__________"
Такой запрос вернёт только те записи, где ИНН состоит ровно из 10 символов. Записи с пустым ИНН, с пробелами, с 9 или 12 символами в результат не попадут. Это удобно для быстрой валидации данных перед обменом с внешними системами.
Обратная проверка — найти строки, длина которых не равна нужной:
ГДЕ
НЕ Контрагенты.ИНН ПОДОБНО "__________"
И Контрагенты.ИНН <> ""
Условие <> "" добавлено осознанно: пустая строка не совпадает с шаблоном из подчёркиваний, и без отдельного отсечения пустых значений выборка будет замусорена записями, где поле просто не заполнено.
- 1Определите требуемую длину строки в символах, например 12 для ИНН физлица
- 2Сформируйте шаблон из такого же количества символов подчёркивания
- 3Добавьте условие Поле ПОДОБНО "шаблон" в секцию ГДЕ
- 4Выполните запрос и проверьте, что в результате нет строк другой длины
Способ 2. Проверка минимальной или максимальной длины
Строки не короче заданной длины
Добавление символа % (любое количество любых символов) в конец шаблона превращает проверку в «не меньше N символов»:
ГДЕ
Контрагенты.НаименованиеПолное ПОДОБНО "_____%"
Условие вернёт все наименования длиной от 5 символов и выше. Это полезно, когда нужно отсечь слишком короткие, заведомо некорректные значения — например, однобуквенные наименования или заглушки.
Строки не длиннее заданной длины
Прямого шаблона «не более N символов» в ПОДОБНО нет. Проверка выполняется через отрицание: строка короче или равна N, если она не совпадает с шаблоном «N+1 символ и далее»:
ГДЕ
НЕ Контрагенты.КодПоОКПО ПОДОБНО "_________%"
Здесь отбираются строки длиной не более 8 символов. Учтите, что в выборку попадут и пустые строки — при необходимости отсекайте их отдельным условием.
Способ 3. Проверка длины для полей неограниченной длины и составных типов
Если реквизит объявлен как строка неограниченной длины, ПОДОБНО к нему может не применяться — платформа выдаст ошибку сравнения. Решение — привести значение к строке фиксированной длины через ВЫРАЗИТЬ:
ВЫБРАТЬ
ВЫРАЗИТЬ(Товары.Описание КАК Строка(100)) КАК Описание
ПОМЕСТИТЬ ВТ_Описания
ИЗ
Справочник.Номенклатура КАК Товары
;
ВЫБРАТЬ
ВТ_Описания.Описание
ИЗ
ВТ_Описания КАК ВТ_Описания
ГДЕ
ВТ_Описания.Описание ПОДОБНО "____________________%"
Важный нюанс: при приведении к Строка(100) значение дополняется пробелами справа до указанной длины. Поэтому шаблон из подчёркиваний будет «видеть» хвостовые пробелы как символы. Для корректной проверки фактической длины либо обрезайте значение заранее в коде, либо учитывайте, что сравнение идёт с дополненной строкой.
Способ 4. Проверка длины в коде через СтрДлина
Если анализ длины выполняется не в запросе, а при обходе результата или при проверке отдельного значения, используйте функцию встроенного языка СтрДлина():
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если СтрДлина(СокрЛП(Выборка.ИНН)) <> 10
И СтрДлина(СокрЛП(Выборка.ИНН)) <> 12 Тогда
Сообщить("Некорректная длина ИНН: " + Выборка.Наименование);
КонецЕсли;
КонецЦикла;
Обязательно оборачивайте значение в СокрЛП(): строковые реквизиты фиксированной длины хранятся с хвостовыми пробелами, и СтрДлина() без обрезки вернёт длину вместе с ними. Это самая частая причина «неправильных» результатов проверки.
Комбинированный подход — сначала грубый отбор в запросе через ПОДОБНО, затем точная проверка в цикле через СтрДлина — обычно оптимален по производительности: запрос отсекает заведомо лишние записи, а код дорабатывает тонкие условия.
Как выбрать способ
Проверка длины в динамическом списке и СКД
В динамических списках и схеме компоновки данных действуют те же правила языка запросов. Условие по длине добавляется в произвольный текст запроса набора данных либо в отбор СКД через сравнение «Подобно» с шаблоном из подчёркиваний.
Для отчёта на СКД, где пользователь должен сам задавать длину, удобнее вычисляемое поле: в запросе набора данных длина не вычисляется, поэтому гибкие фильтры делают через настройки отбора с видом сравнения «Содержит»/«Подобно» либо переносят проверку в код обработчика.
Экранирование спецсимволов в шаблоне
Если сама строка может содержать символы %, _, [, ], они воспринимаются как служебные. Для поиска их как обычных символов используется конструкция СПЕЦСИМВОЛ:
ГДЕ
Товары.Артикул ПОДОБНО "%~_%" СПЕЦСИМВОЛ "~"
Здесь символ ~ объявлен экранирующим, и последовательность ~_ означает буквальный символ подчёркивания в артикуле, а не «любой символ». Без экранирования отбор по артикулам с подчёркиваниями дал бы неверный результат.
Что важно запомнить
В запросе 1С длина строки проверяется только через ПОДОБНО: одно подчёркивание — один символ, «%» в конце — «не меньше заданной длины», отрицание — «не больше». Для строк неограниченной длины сначала применяйте ВЫРАЗИТЬ. В коде модуля используйте СтрДлина(СокрЛП(Значение)), не забывая про хвостовые пробелы.
Частые вопросы
Можно ли вывести длину строки как колонку в результате запроса?
Напрямую — нет, функции длины в языке запросов нет. Обходной путь: выгрузить результат в таблицу значений и добавить колонку, заполнив её в цикле через СтрДлина(СокрЛП(Значение)), либо использовать вычисляемое поле в СКД с выражением на встроенном языке.
Как найти все записи, где ИНН не 10 и не 12 символов?
Условие: ГДЕ НЕ ИНН ПОДОБНО "__________" И НЕ ИНН ПОДОБНО "____________" И ИНН <> "". Последнее условие отсекает пустые значения, которые тоже не совпадают с шаблонами.
Почему ПОДОБНО с подчёркиваниями возвращает лишние строки?
Чаще всего дело в хвостовых пробелах: строковый реквизит фиксированной длины хранится с дополнением пробелами, и они считаются символами. Проверяйте значения через СокрЛП в коде или учитывайте фактическую длину хранения при составлении шаблона.
Работает ли ПОДОБНО с числовыми полями?
Нет, ПОДОБНО применяется только к строкам. Числовое поле нужно сначала привести к строке через ВЫРАЗИТЬ(Поле КАК Строка(N)) во временной таблице, а затем накладывать шаблон. Учтите, что при приведении число дополнится пробелами слева.
Как проверить длину строки в запросе к табличной части документа?
Точно так же, как к реквизиту справочника: обратитесь к полю табличной части в секции ИЗ (Документ.Реализация.Товары) и добавьте условие ПОДОБНО в секцию ГДЕ. Ограничений по типу источника данных здесь нет.
Влияет ли регистр букв на проверку длины через ПОДОБНО?
Нет, символ подчёркивания совпадает с любым символом независимо от регистра. Регистрозависимость важна только при поиске конкретных букв в шаблоне — она зависит от настроек СУБД, а не от самой проверки длины.