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