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

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

Как сформировать строку в запросе 1С

Как сформировать строку в запросе 1С: объединение полей через плюс, функция ПОДСТРОКА, ВЫРАЗИТЬ, представления ссылок и типичные ошибки с примерами кода.

Формирование строк в запросе 1С — частая задача: собрать ФИО из трёх полей, склеить артикул с наименованием, получить строковое представление ссылки или обрезать длинный текст. Язык запросов 1С устроен иначе, чем встроенный язык, и многие привычные строковые функции в нём отсутствуют или работают с ограничениями.

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

Конкатенация строк оператором «+»

Самый простой способ собрать строку — сложить несколько строковых полей через знак «+». Например, требуется получить полное наименование контрагента с ИНН в одном поле выборки:

ВЫБРАТЬ

Контрагенты.Наименование + ", ИНН: " + Контрагенты.ИНН КАК Описание

ИЗ

Справочник.Контрагенты КАК Контрагенты

Результатом будет строка вида «ООО Ромашка, ИНН: 7701234567». Литеральные строки в запросе заключаются в двойные кавычки, между частями можно вставлять любые разделители — пробелы, запятые, переносы через Символы нельзя, поэтому для перевода строки приходится использовать обходные приёмы на стороне встроенного языка после выполнения запроса.

Важное условие: все операнды должны иметь строковый тип. Если сложить строку с числом или датой, запрос не выполнится — платформа выдаст ошибку несовместимости типов. Числа и даты предварительно приводят к строке через ПРЕДСТАВЛЕНИЕ или ВЫРАЗИТЬ.

Приведение типов к строке: ВЫРАЗИТЬ и ПРЕДСТАВЛЕНИЕ

Функция ВЫРАЗИТЬ приводит значение к указанному типу. Для строки нужно задать длину, потому что тип СТРОКА в запросе параметризуется:

ВЫБРАТЬ

ВЫРАЗИТЬ(Товары.Код КАК СТРОКА(9)) + " — " + Товары.Наименование КАК Представление

ИЗ

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

Функция ПРЕДСТАВЛЕНИЕ возвращает строковое представление любого значения — ссылки, даты, числа, перечисления. Это удобно, когда нужно вывести «как в интерфейсе»:

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕ(Продажи.Номенклатура) + " / " + ПРЕДСТАВЛЕНИЕ(Продажи.Период) КАК Строка

ИЗ

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

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

ВЫРАЗИТЬ или ПРЕДСТАВЛЕНИЕ

ВЫРАЗИТЬ(Поле КАК СТРОКА(N))

Подходит, когда нужен типизированный результат для дальнейших операций со строкой. Требует указания длины, для неподходящих типов вернёт пустую строку.

ПРЕДСТАВЛЕНИЕ(Поле)

Подходит для вывода пользователю: ссылки, даты, перечисления. Длина не задаётся, но результат — только текст отображения, без типизации.

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

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

ВЫБРАТЬ

ПОДСТРОКА(Сотрудники.Наименование, 1, 50) КАК КраткоеНаименование

ИЗ

Справочник.Сотрудники КАК Сотрудники

Если указанная длина больше фактической, функция вернёт строку целиком — ошибки не будет. А вот позиция меньше единицы или отрицательная длина приведут к ошибке. Реверсивного поиска «с конца строки» в языке запросов нет, поэтому задачи вида «взять текст после последнего пробела» в запросе не решаются — их выполняют уже в модуле после выборки функциями СтрНайти и Сред.

ПОДСТРОКА часто комбинируется с конкатенацией. Например, получить первую букву фамилии с точкой: ПОДСТРОКА(Физлица.Фамилия, 1, 1) + ".". Для полей неограниченной длины (СТРОКА(0)) перед обрезкой рекомендуется привести поле через ВЫРАЗИТЬ к строке конечной длины — иначе в некоторых СУБД возможны проблемы с производительностью и сортировкой.

Условное формирование строки через ВЫБОР

Конструкция ВЫБОР позволяет собирать строку по условию — например, добавлять пометку «(не используется)» только для помеченных на удаление элементов:

ВЫБРАТЬ

Контрагенты.Наименование +

ВЫБОР

КОГДА Контрагенты.ПометкаУдаления

ТОГДА " (не используется)"

ИНАЧЕ ""

КОНЕЦ КАК Наименование

ИЗ

Справочник.Контрагенты КАК Контрагенты

Обе ветки ВЫБОР должны возвращать строковый тип — платформа проверяет совместимость типов результата. Если в одной ветке строка, а в другой число, запрос не выполнится. Для нескольких условий допустимо несколько КОГДА, в конце желательно ставить ИНАЧЕ со строкой по умолчанию, чтобы не получить NULL.

Значение NULL в конкатенации — отдельный источник ошибок: сложение строки с NULL даёт NULL, и всё собранное поле «обнуляется». Поэтому потенциально пустые поля оборачивают в ЕСТЬNULL(Поле, ""):

ВЫБРАТЬ

ЕСТЬNULL(Контрагенты.НаименованиеПолное, Контрагенты.Наименование) КАК Наименование

ИЗ

Справочник.Контрагенты КАК Контрагенты

Типичные ошибки
01
Сложение строки с NULL без ЕСТЬNULL — результат всего выражения становится NULL
02
Разные типы в ветках ВЫБОР — ошибка исполнения запроса
03
ВЫРАЗИТЬ к СТРОКА без указания длины — синтаксическая ошибка
04
Попытка использовать Строка(), Формат() или СокрЛП() в тексте запроса — этих функций в языке запросов нет

Сборка строки из нескольких строк выборки

Частая потребность — склеить значения из разных строк в одну: список товаров документа через запятую, перечень телефонов контрагента. В языке запросов 1С нет агрегатной функции для строк наподобие GROUP_CONCAT, поэтому прямого способа нет.

Практические варианты решения:

  • Выполнить запрос с детальными строками и собрать итоговую строку циклом в модуле, группируя по ключу. Это самый надёжный и управляемый способ.
  • Использовать пакетный запрос: первая выборка — ключи, вторая — детали, обход через ВыборкаПоГруппировкам.
  • Для отчётов на СКД воспользоваться вычисляемым полем или функцией общего модуля в выражении ресурса — СКД умеет вызывать функции из общих модулей с признаком «Вызов сервера».
  • Если строк немного и их число фиксировано, можно вывести их в отдельные колонки через группировку с МАКСИМУМ(ВЫБОР КОГДА НомерСтроки = 1 ...) и затем склеить колонки оператором «+».

Выбор зависит от объёма данных и места использования. Для печатных форм обычно достаточно обхода выборки в модуле; для отчётов удобнее возможности СКД.

Сборка строки из строк табличной части
  1. 1
    Сформируйте запрос с соединением шапки и табличной части, добавьте ИТОГИ ПО ссылке документа
  2. 2
    Выполните запрос и получите выборку по группировкам: Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам)
  3. 3
    В цикле по группировкам откройте вложенную выборку детальных записей
  4. 4
    Складывайте значения в переменную через разделитель, отсекая лишний разделитель в конце
  5. 5
    Присвойте собранную строку нужному параметру макета или полю результата

Проверка результата и производительность

После написания запроса проверьте результат в консоли запросов: убедитесь, что поле имеет строковый тип, нет значений NULL там, где ожидался текст, и длина строки не обрезана из-за слишком малого параметра в ВЫРАЗИТЬ. Особое внимание — полям, по которым потом идёт сортировка или группировка.

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

Не используйте строковые операции в условиях соединений и отборов (например, ГДЕ ПОДСТРОКА(...) = ...) — такие условия не используют индексы и приводят к полному сканированию таблиц. Отборы старайтесь формулировать по исходным типизированным полям.

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

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

Тип поля в результате
Норма

В консоли запросов поле отображается как строка

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

Поле имеет составной тип или NULL вместо текста

Полнота строки
Норма

Все части присутствуют, разделители на месте

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

Строка обрезана — увеличьте длину в ВЫРАЗИТЬ или ПОДСТРОКА

Скорость выполнения
Норма

Запрос отрабатывает за приемлемое время на рабочей базе

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

Замедление из-за ПРЕДСТАВЛЕНИЕ в большой выборке или строковых условий в соединениях

Частые вопросы

Можно ли вставить перенос строки в запросе 1С?

Напрямую в литерале запроса перенос строки не задаётся. Обычно в запросе вставляют служебный разделитель (например, «|»), а после выполнения заменяют его на Символы.ПС в модуле через СтрЗаменить.

Как склеить ФИО из трёх полей с пробелами?

Используйте конкатенацию с литералами: Фамилия + " " + Имя + " " + Отчество. Если часть полей может быть пустой, оберните их в ЕСТЬNULL(Поле, "") — иначе весь результат станет NULL.

Почему ВЫРАЗИТЬ(Поле КАК СТРОКА) выдаёт ошибку?

Тип СТРОКА в запросе требует указания длины в скобках: ВЫРАЗИТЬ(Поле КАК СТРОКА(100)). Запись без длины синтаксически недопустима.

Как получить строковое представление даты в нужном формате?

В языке запросов нет функции форматирования. ПРЕДСТАВЛЕНИЕ(Дата) вернёт представление по умолчанию. Если нужен конкретный формат, получите дату в выборке и обработайте функцией Формат() в модуле после выполнения запроса.

Можно ли сгруппировать строки в одну прямо в запросе?

Агрегатной функции конкатенации в языке запросов 1С нет. Собирайте строку циклом по выборке в модуле, используйте обход по группировкам или возможности СКД с вычисляемыми полями.

Чем отличается СокрЛП в модуле от возможностей запроса?

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

Итог

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

Строку в запросе 1С собирают оператором «+», приводят типы через ВЫРАЗИТЬ и ПРЕДСТАВЛЕНИЕ, обрезают ПОДСТРОКОЙ и добавляют условия через ВЫБОР. Защищайтесь от NULL функцией ЕСТЬNULL, не используйте строковые операции в отборах и соединениях, а склейку значений из нескольких строк выполняйте в модуле после выборки.