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