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

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

Как в запросе 1С обрезать строку справа

Как обрезать строку справа в запросе 1С: функции ЛЕВ и ПОДСТРОКА, работа с кодами и наименованиями, типичные ошибки, ограничения и примеры запросов.

Обрезать строку справа в запросе 1С означает оставить у строки только первые N символов, отбросив «хвост». Такая задача возникает постоянно: сравнить первые символы артикулов, вывести сокращённое наименование в отчёте, сгруппировать данные по префиксу кода документа или убрать лишние пробелы, которыми платформа дополняет строки фиксированной длины.

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

Ниже разобраны синтаксис функций, готовые примеры запросов, поведение с пробелами и разными типами данных, ограничения платформы и типичные ошибки, из-за которых обрезка «не срабатывает» или возвращает пустые значения.

Как работает функция ЛЕВ в запросе 1С

Функция ЛЕВ(Строка, ЧислоСимволов) возвращает указанное количество символов с начала строки. Это основной инструмент, когда нужно обрезать строку справа: вы фактически отсекаете всё, что находится правее заданной позиции.

Синтаксис прост: первый параметр — строковое выражение (поле таблицы, параметр запроса, литерал), второй — целое число, сколько символов оставить. Если переданное число больше фактической длины строки, вернётся вся строка без ошибки. Если число равно нулю или отрицательно, результатом будет пустая строка.

Пример запроса, который оставляет от наименования номенклатуры первые 30 символов:

ВЫБРАТЬ

Номенклатура.Ссылка КАК Ссылка,

ЛЕВ(Номенклатура.Наименование, 30) КАК КороткоеНаименование

ИЗ

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

Результат можно использовать в группировках, соединениях и условиях. Например, сгруппировать товары по первым трём символам артикула: СГРУППИРОВАТЬ ПО ЛЕВ(Артикул, 3).

Обрезка строки через ПОДСТРОКА

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

Преимущество ПОДСТРОКА проявляется, когда нужно отрезать символы не только справа, но и слева: например, взять часть кода без первых двух символов префикса — ПОДСТРОКА(Код, 3, 10). Одной функцией решается обе задачи.

Пример с выбором фрагмента из середины строки:

ВЫБРАТЬ

ПОДСТРОКА(Документы.Номер, 4, 6) КАК НомерБезПрефикса

ИЗ

Документ.РеализацияТоваровУслуг КАК Документы

Учтите: нумерация символов начинается с единицы, а не с нуля. Если указать начальную позицию 0, поведение зависит от СУБД и может отличаться — надёжнее всегда начинать отсчёт с 1.

Проблема пробелов в строках фиксированной длины

Главный подводный камень при обрезке строк в запросах 1С — строки фиксированной длины. Если в метаданных реквизит объявлен как Строка(10) с фиксированной длиной, значение «АБВ» физически хранится как «АБВ» плюс семь пробелов справа. При сравнении и соединении это даёт неожиданные результаты.

Функция ЛЕВ отсекает символы, но не убирает пробелы, вошедшие в отобранный фрагмент. Если вы обрезаете строку до 10 символов, а исходное значение было дополнено пробелами, они останутся внутри результата и «сломают» соединение с другой таблицей.

Практические приёмы борьбы с пробелами:

  • Использовать в метаданных строки переменной длины там, где фиксированная длина не нужна — тогда пробелы не добавляются;
  • При соединении таблиц приводить значения к одинаковому виду через ВЫРАЗИТЬ с явным указанием типа Строка нужной длины;
  • Помнить, что в запросах 1С нет функции СОКРЛП — она доступна только во встроенном языке, поэтому очистку пробелов иногда проще выполнить уже после выборки.

Обрезка значений нестроковых типов

Функции ЛЕВ и ПОДСТРОКА принимают только строки. Если применить их к числу, дате или ссылке, запрос не выполнится или вернёт некорректный результат в зависимости от СУБД. Поэтому нестроковые значения нужно сначала преобразовать.

Два рабочих способа:

  • ВЫРАЗИТЬ(Поле КАК Строка(50)) — явное приведение к строке заданной длины, после чего можно применять ЛЕВ;
  • Представление ссылки: ЛЕВ(Документ.Ссылка.Представление, 20) — работает, потому что представление уже является строкой.

Пример с приведением числа к строке и обрезкой:

ВЫБРАТЬ

ЛЕВ(ВЫРАЗИТЬ(Продажи.Количество КАК Строка(10)), 5) КАК ЧастьЧисла

ИЗ

РегистрНакопления.Продажи КАК Продажи

Такой приём применяется редко и в основном для служебных задач — например, при анализе форматов кодов. Для бизнес-логики обычно достаточно обрезки готовых строковых реквизитов: наименований, кодов, артикулов, номеров документов.

Типовые сценарии использования

Соединение таблиц по префиксу кода

Когда в одной системе код хранится полностью, а в другой — только префикс, соединение строится через ЛЕВ: ПО ЛЕВ(Таблица1.Код, 5) = Таблица2.Префикс. Это работает, но соединение по вычисляемому выражению не использует индекс и на больших таблицах выполняется медленно. Для регулярных отчётов по миллионам записей лучше хранить префикс отдельным реквизитом.

Сокращение наименований в отчётах

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

Группировка по первым символам

Аналитические отчёты часто группируют данные по началу артикула или кода: СГРУППИРОВАТЬ ПО ЛЕВ(Артикул, 2). Это удобно для быстрой аналитики без доработки конфигурации, но помните про ограничение по производительности на больших объёмах.

Типичные ошибки
01
Применение ЛЕВ к числу или ссылке без ВЫРАЗИТЬ — запрос падает с ошибкой или возвращает неожиданный результат
02
Игнорирование концевых пробелов в строках фиксированной длины — соединения и сравнения не срабатывают
03
Передача NULL во второй параметр — результат становится NULL, строки «исчезают» из отчёта
04
Использование обрезанной строки в соединении больших таблиц — резкое падение производительности из-за отказа от индекса
05
Ожидание, что ЛЕВ уберёт пробелы внутри отобранного фрагмента — функция только отсекает символы, ничего не очищая

Производительность и ограничения

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

Дополнительные ограничения, которые нужно учитывать:

  • В языке запросов нет функций ПРАВ и СОКРЛП — убрать символы слева через «правую» обрезку напрямую нельзя, только через ПОДСТРОКА с вычисленной позицией;
  • Нет функции ДЛИНАСТРОКИ, поэтому «обрезать до конца строки минус N символов» в чистом запросе не выразить — нужна либо известная фиксированная длина, либо обработка в коде;
  • В параметрах виртуальных таблиц вычисляемые строковые выражения использовать нельзя.
Маршрут решения

Как выбрать действие

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

Проверка результата обрезки

Перед тем как встраивать обрезку в рабочий запрос, проверьте результат в консоли запросов на реальных данных. Обратите внимание на три вещи: не появились ли пустые значения (признак NULL в исходном поле), совпадает ли длина результата с ожидаемой, корректно ли отрабатывает соединение или группировка.

Для диагностики удобно вывести рядом исходное значение и обрезанное: различия сразу покажут пробелы, неожиданные префиксы и значения NULL. Если поле может быть NULL, обезопасьте результат через ЕСТЬNULL(ЛЕВ(Поле, 10), "") — тогда вместо NULL вернётся пустая строка.

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

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

Длина обрезанного значения
Норма

Равна заданному N или меньше, если исходная строка короче

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

Длина больше N — обрезка не применилась к нужному полю

Значения в результате
Норма

Все строки заполнены, пустых значений нет

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

Появились NULL или пустые строки там, где данные были

Соединение по обрезанной строке
Норма

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

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

Строки теряются или задваиваются — вероятны пробелы или разная длина значений

Часто задаваемые вопросы

Как обрезать строку слева, а не справа, в запросе 1С?

Функции ПРАВ в языке запросов нет. Используйте ПОДСТРОКА с начальной позицией больше 1: например, ПОДСТРОКА(Код, 3, 100) отбросит первые два символа. Если нужно оставить именно последние N символов строки переменной длины, в чистом запросе это не выражается — обработайте значение во встроенном языке через Прав() после выборки.

Почему ЛЕВ возвращает пустое значение, хотя поле заполнено?

Наиболее вероятная причина — NULL в исходном поле (например, при левом соединении без совпадений). NULL на входе даёт NULL на выходе. Оберните выражение в ЕСТЬNULL или проверьте условия соединения таблиц.

Можно ли убрать пробелы справа прямо в запросе?

Штатной функции СОКРЛП в языке запросов нет. Варианты: использовать строки переменной длины в метаданных, приводить значение через ВЫРАЗИТЬ к строке нужного вида или очищать пробелы в коде после выполнения запроса функцией СокрЛП().

Что быстрее: ЛЕВ или ПОДСТРОКА с позиции 1?

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

Как обрезать наименование, но добавить многоточие, если оно длиннее лимита?

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

Работает ли обрезка строки в СКД и динамических списках?

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

Итог

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

Обрезка строки справа в запросе 1С выполняется функцией ЛЕВ(Поле, N) или ПОДСТРОКА(Поле, 1, N). Проверяйте NULL через ЕСТЬNULL, помните о пробелах в строках фиксированной длины и не используйте обрезанные строки в соединениях больших таблиц — это отключает индексы. Для очистки пробелов и обрезки по фактической длине обрабатывайте результат во встроенном языке.