Разработка и Конфигурация · 8 мин
1С: как обрезать строку в запросе
Как обрезать строку в запросе 1С с помощью ПОДСТРОКА: синтаксис, примеры, обрезка слева и справа, типичные ошибки и альтернативные способы обработки.
В языке запросов 1С нет привычных функций ЛЕВ() и ПРАВ() из встроенного языка — вместо них используется единственная функция ПОДСТРОКА, которая извлекает фрагмент строки по начальной позиции и длине. С её помощью можно обрезать строку слева, справа или взять часть из середины, но синтаксис требует точного понимания нумерации символов и ограничений платформы.
Типовая задача возникает при выводе сокращённых наименований в отчётах, обрезке длинных комментариев для печатных форм, извлечении префиксов из номеров документов или нормализации кодов номенклатуры. Во всех этих случаях обрезку лучше выполнять прямо в запросе, чтобы не перегружать постобработку результата.
Важно понимать: функция ПОДСТРОКА работает только со строковыми значениями, и перед обрезкой часто требуется привести тип через ВЫРАЗИТЬ — особенно для полей неограниченной длины (строки без указания длины в метаданных), которые запрос обработать не сможет.
Синтаксис функции ПОДСТРОКА
Функция принимает три параметра: исходную строку, позицию первого символа (нумерация с единицы) и количество извлекаемых символов. Базовый пример в тексте запроса:
Обрезка строк неограниченной длины
Реквизиты типа «Строка» без указания длины (неограниченные строки) нельзя напрямую передать в ПОДСТРОКА — запрос завершится с ошибкой о несоответствии типов. Сначала нужно привести значение к строке фиксированной длины оператором ВЫРАЗИТЬ.
Обрезка в СКД и динамических списках
В схеме компоновки данных функция ПОДСТРОКА доступна как в тексте запроса набора данных, так и в вычисляемых полях. Синтаксис идентичен. Для динамических списков с произвольным запросом действует то же правило: неограниченные строки требуют приведения типа.
Если обрезка нужна только для отображения в отчёте, а данные в запросе должны остаться полными, добавьте вычисляемое поле в СКД и применяйте ПОДСТРОКА там — тогда исходное поле останется доступным для группировок и отборов без потери информации.
- 1Определите тип поля: фиксированная или неограниченная строка
- 2Для неограниченной строки добавьте ВЫРАЗИТЬ(Поле КАК Строка(N))
- 3Примените ПОДСТРОКА с позицией 1 и нужной длиной для обрезки слева
- 4Выполните запрос в консоли и проверьте результат на строках разной длины
- 5Перенесите проверенный текст в модуль или СКД
Альтернативы: обрезка в коде после запроса
Не всегда обрезку нужно делать в запросе. Встроенный язык 1С предлагает более гибкие функции: Лев(), Прав(), Сред(), а также СтрНайти() для поиска позиции подстроки. Если логика обрезки сложная — например, обрезать по последнему пробелу, чтобы не разрывать слово, — выполняйте её при обходе выборки.
Типичные ошибки и проверка результата
Чаще всего проблемы возникают из-за неограниченных строк, неверной нумерации позиций и попыток обрезать справа строки переменной длины. Перед переносом запроса в рабочий код проверьте его в консоли запросов на реальных данных, включая пустые и очень короткие значения.
Как проверить результат
Обрезана ровно до заданного числа символов
Ошибка выполнения запроса или обрезка не на той позиции
Возвращается целиком без ошибки
Пустое значение там, где должны быть данные
Пустая строка; NULL обрабатывайте через ЕСТЬNULL
NULL попадает в итоговый отчёт и ломает вывод
FAQ
Можно ли в запросе 1С обрезать строку справа, если её длина неизвестна?
Напрямую нет: в языке запросов отсутствует функция длины строки, поэтому вычислить начальную позицию для последних символов невозможно. Используйте функцию Прав() в коде после выполнения запроса.
Почему ПОДСТРОКА выдаёт ошибку на поле «Комментарий»?
Поле имеет тип строки неограниченной длины. Оберните его в ВЫРАЗИТЬ(Поле КАК Строка(N)), где N — достаточная для вашей задачи длина, и только затем применяйте ПОДСТРОКА.
Что вернёт ПОДСТРОКА, если строка короче указанной длины?
Функция вернёт всю строку целиком, ошибки не будет. Если начальная позиция больше длины строки, результатом будет пустая строка.
Как обрезать строку по определённому символу, например до первого пробела?
В языке запросов нет функции поиска позиции подстроки, поэтому в запросе это сделать нельзя. Выполните разбор в коде: найдите позицию через СтрНайти() и возьмите Лев() от строки.
Работает ли ПОДСТРОКА в отборах (ГДЕ)?
Да, функцию можно использовать в условиях, например ГДЕ ПОДСТРОКА(Номер, 1, 2) = "АБ". Учитывайте, что такой отбор не сможет использовать индекс и на больших таблицах будет работать медленнее.
Чем отличается обрезка через ВЫРАЗИТЬ от ПОДСТРОКА?
ВЫРАЗИТЬ(Поле КАК Строка(N)) всегда отсекает строку с конца до N символов, то есть эквивалентно ПОДСТРОКА(Поле, 1, N). ПОДСТРОКА дополнительно позволяет задать начальную позицию и брать фрагменты из середины строки.
Что важно запомнить
Обрезка строки в запросе 1С выполняется функцией ПОДСТРОКА с нумерацией символов от 1. Неограниченные строки требуют предварительного приведения через ВЫРАЗИТЬ. Для сложной логики — обрезки справа по переменной длине или поиска позиции символа — используйте строковые функции встроенного языка после выборки.