При работе с языком запросов 1С:Предприятие 8 нередко возникает задача определить длину строкового значения — например, для проверки корректности заполнения реквизитов, фильтрации данных или поиска аномалий в справочниках. В этой статье подробно разберём, какие инструменты для этого существуют, как они работают в файловом и клиент-серверном вариантах, а также рассмотрим практические примеры.
Функция ДЛИНАСТРОКИ
Основной и самый правильный способ получить длину строки в запросе 1С — использовать встроенную функцию языка запросов ДЛИНАСТРОКИ (в английском синтаксисе — LENGTH).
Синтаксис
Функция принимает один параметр, строковое выражение, и возвращает число, количество символов в строке:
ДЛИНАСТРОКИ(<СтроковоеВыражение>)
Пример использования
Допустим, нужно выбрать всех контрагентов и узнать длину их наименования:
ВЫБРАТЬ Контрагенты.Наименование КАК Наименование, ДЛИНАСТРОКИ(Контрагенты.Наименование) КАК ДлинаНаименования ИЗ Справочник.Контрагенты КАК Контрагенты
Функцию можно использовать не только в списке выборки, но и в условиях. Например, найдём контрагентов, у которых наименование подозрительно короткое (возможно, заполнено некорректно):
ВЫБРАТЬ Контрагенты.Ссылка КАК Контрагент, Контрагенты.Наименование КАК Наименование ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ ДЛИНАСТРОКИ(Контрагенты.Наименование) < 3
Особенности работы функции - Пробелы учитываются. Функция считает все символы, включая пробелы в начале, середине и конце строки. Если нужно исключить крайние пробелы, предварительно применяйте функцию СОКРЛП: ДЛИНАСТРОКИ(СОКРЛП(Поле)).
- NULL-значения. Если строковое выражение равно NULL, результат функции также будет NULL. При необходимости используйте ЕСТЬNULL.
- Строки неограниченной длины. Функция корректно работает и с реквизитами типа «Строка» неограниченной длины.
Альтернативный способ: функция ПОДСТРОКА
В старых версиях платформы (до появления ДЛИНАСТРОКИ) длину строки иногда определяли косвенно через функцию ПОДСТРОКА. Однако у этого подхода есть важная особенность в клиент-серверном варианте работы: функция ПОДСТРОКА выполняется на стороне СУБД, и её поведение может отличаться в зависимости от используемой базы данных (MS SQL Server, PostgreSQL, Oracle, IBM DB2). В частности, известны особенности с обработкой конечных пробелов и ограничения на типы данных, к которым функция применима.
Поэтому для определения длины строки рекомендуеться использовать именно ДЛИНАСТРОКИ — она работает единообразно во всех вариантах работы и на всех поддерживаемых СУБД.
Практические примеры Поиск дублей по ИНН с неверной длиной
ВЫБРАТЬ
Контрагенты.Наименование КАК Наименование,
Контрагенты.ИНН КАК ИНН
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
НЕ ДЛИНАСТРОКИ(СОКРЛП(Контрагенты.ИНН)) В (10, 12)
И Контрагенты.ИНН <> ""
Сортировка по длине строки
ВЫБРАТЬ
Товары.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Товары
УПОРЯДОЧИТЬ ПО
ДЛИНАСТРОКИ(Товары.Наименование) УБЫВ
Длина строки во встроенном языке
ВЫБРАТЬ Контрагенты.Наименование КАК Наименование, Контрагенты.ИНН КАК ИНН ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ НЕ ДЛИНАСТРОКИ(СОКРЛП(Контрагенты.ИНН)) В (10, 12) И Контрагенты.ИНН <> ""
Сортировка по длине строки
ВЫБРАТЬ
Товары.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Товары
УПОРЯДОЧИТЬ ПО
ДЛИНАСТРОКИ(Товары.Наименование) УБЫВ
Длина строки во встроенном языке
Не путайте функцию языка запросов с функцией встроенного языка СтрДлина, которая применяеться в коде модулей:
Длина = СтрДлина("Пример строки"); // вернёт 14
Функция СтрДлина работает только в коде и не может использоваться внутри текста запроса.
Для получения длины строки в запросе 1С используйте функцию ДЛИНАСТРОКИ. Она проста в применении, работает в секциях ВЫБРАТЬ, ГДЕ, УПОРЯДОЧИТЬ ПО и корректно функционирует как в файловом, так и в клиент-серверном варианте работы. Не забывайте про особенности учёта пробелов и NULL-значений — это поможет избежать ошибок при анализе данных.