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

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

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

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

Разработчики на 1С регулярно сталкиваются с задачей определить длину строки прямо в тексте запроса: для поиска сокращённых наименований, проверки заполненности полей, фильтрации «пустых» строк, состоящих из пробелов. Долгое время в языке запросов 1С такой функции не было, и приходилось обходиться ухищрениями. Ситуация изменилась с выходом платформы 8.3.6.

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

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

С какой платформы доступна ДЛИНАСТРОКИ и как это проверить

Функция ДЛИНАСТРОКИ появилась в платформе 1С:Предприятие 8.3.6. Все последующие версии (8.3.7 и выше) её поддерживают. В платформе 8.2 и в ранних релизах линейки 8.3 (8.3.0–8.3.5) функция отсутствует: попытка использовать её в запросе приведёт к ошибке вида «Функция не обнаружена».

Проверить версию платформы можно несколькими способами. В конфигураторе: меню «Справка» — «О программе». В пользовательском режиме: сведения о программе обычно доступны через служебные команды интерфейса. Программно версию возвращает системная информация:

Инфо = Новый СистемнаяИнформация;

Сообщить(Инфо.ВерсияПриложения);

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

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

Как выбрать подход

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

Синтаксис и базовые примеры ДЛИНАСТРОКИ

Функция принимает один аргумент — строковое выражение — и возвращает целое число. Типичный пример в запросе к справочнику:

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

Такой запрос найдёт позиции с подозрительно короткими наименованиями — частый признак дублей или некачественного заполнения справочника. Функцию можно применять в секциях ВЫБРАТЬ, ГДЕ, а также в условиях соединений, хотя последнее встречается редко.

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

Особенности: пробелы, NULL и типы данных

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

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

ГДЕ

ДЛИНАСТРОКИ(Таб.Комментарий) = 0

ИЛИ Таб.Комментарий ЕСТЬ NULL

Третий момент — тип аргумента. Функция ожидает строковое выражение. Если поле имеет составной тип, включающий строку, поведение определяется фактическим хранимым значением; для надёжности можно предварительно привести значение через ВЫРАЗИТЬ(... КАК СТРОКА(...)).

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

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

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

Число совпадает с количеством видимых символов

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

Число больше — вероятно, в строке есть непечатаемые или лишние пробелы

Отбор записей с пустым значением
Норма

Находятся и пустые строки, и NULL (при явной проверке ЕСТЬ NULL)

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

NULL-записи теряются из выборки

Запрос на старой платформе
Норма

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

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

Ошибка «Функция не обнаружена» — платформа ниже 8.3.6

Что делать на платформах ниже 8.3.6

На платформах 8.2 и 8.3.0–8.3.5 функции длины строки в запросе нет, и есть три рабочих варианта. Первый — выбрать сами строки запросом и посчитать длину в коде встроенной функцией СтрДлина(). Это подходит для небольших выборок, но не позволяет фильтровать на стороне СУБД.

Второй вариант — использовать оператор ПОДОБНО с шаблоном из символов подчёркивания: каждый символ «_» соответствует ровно одному произвольному символу. Например, условие «Наименование ПОДОБНО "_"" найдёт строки длиной ровно один символ. Приём громоздкий, но работает на любой платформе и позволяет отфильтровать данные в самом запросе.

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

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

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

Самый чистый способ, фильтрация на стороне СУБД; требует платформу 8.3.6 и выше

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

Работает везде, но не фильтрует в запросе и требует обхода выборки

ПОДОБНО с шаблоном из подчёркиваний

Фильтрует в запросе на любой платформе, но шаблон громоздкий и неудобен для больших длин

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

Быстрый отбор на больших объёмах, но требует изменения конфигурации и контроля актуальности

Типичные сценарии применения

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

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

Третий сценарий — сортировка и группировка по длине. Например, найти самые длинные комментарии или сгруппировать строки по диапазонам длины через ВЫБОР ... КОГДА с пороговыми значениями.

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

Ограничения и границы применения

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

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

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

Итог

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

ДЛИНАСТРОКИ доступна в запросах с платформы 8.3.6. Учитывайте NULL, пробелы и необходимость приведения типов; на старых платформах используйте СтрДлина в коде, ПОДОБНО или служебный реквизит.

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

С какой версии платформы 1С работает ДЛИНАСТРОКИ в запросе?

Начиная с платформы 1С:Предприятие 8.3.6. В 8.2 и в релизах 8.3 до 8.3.6 функции нет, и запрос с ней завершится ошибкой.

Работает ли ДЛИНАСТРОКИ при режиме совместимости с 8.2?

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

Почему условие ДЛИНАСТРОКИ(Поле) = 0 не находит записи с пустым реквизитом?

Потому что для незаполненного реквизита значение может быть NULL, и функция вернёт NULL, а не 0. Добавьте в условие проверку «Поле ЕСТЬ NULL» через ИЛИ.

Чем заменить ДЛИНАСТРОКИ на платформе 8.2?

Либо выберите строки запросом и посчитайте длину функцией СтрДлина() в коде, либо используйте оператор ПОДОБНО с шаблоном из символов подчёркивания для фильтрации по точной длине прямо в запросе.

Считает ли ДЛИНАСТРОКИ пробелы в строке?

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

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

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