Разработка и Конфигурация · 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С, а не только локальный клиент разработчика — версии могут различаться.
Как выбрать подход
Синтаксис и базовые примеры ДЛИНАСТРОКИ
Функция принимает один аргумент — строковое выражение — и возвращает целое число. Типичный пример в запросе к справочнику:
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
ДЛИНАСТРОКИ(Номенклатура.Наименование) КАК ДлинаНаименования
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
ДЛИНАСТРОКИ(Номенклатура.Наименование) < 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 и выше
Работает везде, но не фильтрует в запросе и требует обхода выборки
Фильтрует в запросе на любой платформе, но шаблон громоздкий и неудобен для больших длин
Быстрый отбор на больших объёмах, но требует изменения конфигурации и контроля актуальности
Типичные сценарии применения
Наиболее частая задача — поиск некорректно заполненных данных: слишком коротких наименований контрагентов, артикулов нулевой длины, кодов, не соответствующих заданному формату. ДЛИНАСТРОКИ позволяет решить это одним запросом без выгрузки данных.
Второй сценарий — контроль обрезания строк при обмене. Если внешняя система ограничивает длину поля, запросом с ДЛИНАСТРОКИ можно заранее найти записи, которые будут усечены, и обработать их до выгрузки.
Третий сценарий — сортировка и группировка по длине. Например, найти самые длинные комментарии или сгруппировать строки по диапазонам длины через ВЫБОР ... КОГДА с пороговыми значениями.
Ограничения и границы применения
ДЛИНАСТРОКИ — скалярная функция и не может заменить полноценный анализ содержимого: она не отличит строку « » (три пробела) от строки «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?
Либо выберите строки запросом и посчитайте длину функцией СтрДлина() в коде, либо используйте оператор ПОДОБНО с шаблоном из символов подчёркивания для фильтрации по точной длине прямо в запросе.
Считает ли ДЛИНАСТРОКИ пробелы в строке?
Да, функция возвращает фактическое количество символов, включая пробелы, введённые в значение. Строка из одних пробелов не будет считаться пустой — для таких проверок комбинируйте ДЛИНАСТРОКИ с ПОДОБНО или сравнением с пустой строкой.
Влияет ли ДЛИНАСТРОКИ на производительность запроса?
Условие по результату функции не использует индекс, поэтому на больших таблицах возможно полное сканирование. Для регламентных проверок это допустимо, а в интерактивных отчётах сначала сужайте выборку другими индексируемыми условиями.