Как корректно добавить символ вертикальной черты "|" к строковому значению в запросе 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов или обработок в системе 1С:Предприятие часто возникает задача объединения нескольких строковых полей в одно. В качестве разделителя разработчики нередко выбирают символ вертикальной черты |. Однако при работе с этим символом в языке запросов можно столкнуться с неочевидным поведением системы: в консоли запросов символ может «пропадать», хотя при использовании параметров он отображается корректно. Рассмотрим подробно, как правильно работать с конкатенацией строк и почему возникают подобные визуальные эффекты.

Синтаксис объединения строк в языке запросов

В языке запросов 1С 8.3 для объединения строк используется оператор +. Если нам необходимо добавить статический символ между двумя полями, мы просто заключаем его в двойные кавычки. Проанализируем стандартный пример, который часто вызывает вопросы у начинающих разработчиков:


ВЫБРАТЬ
    ЧекПродажаТовары.Номенклатура.Наименование + "|" + ЧекПродажаТовары.КомбинацияАналитик.Наименование КАК ПолноеНаименование
ИЗ
    Документ.ЧекПродажа.Товары КАК ЧекПродажаТовары

С точки зрения синтаксиса языка запросов, данная конструкция абсолютно верна. Платформа воспринимает символ | внутри кавычек как обычный текстовый литерал.

Проблема визуализации в консоли запросов

Многие разработчики используют «Консоль запросов» для отладки логики. Именно здесь кроется главная ловушка. Разберем ситуацию: вы пишете запрос, выполняете его в консоли и видите результат НаименованиеНоменклатурыНаименованиеАналитики вместо ожидаемого НаименованиеНоменклатуры|НаименованиеАналитики. Выясним причину этого явления.

Символ | в экосистеме 1С имеет особое значение:

  1. В редакторе кода: он используется для обозначения переноса строки в многострочных строковых константах.
  2. В инструментах вывода: многие консоли запросов (особенно старые или упрощенные версии) используют вертикальную черту как служебный символ для отрисовки границ колонок или разделения данных при текстовом выводе.

Проанализируем поведение парсера консоли: когда запрос выполняется, результат попадает в таблицу. Если алгоритм отрисовки таблицы в консоли настроен некорректно, он может интерпретировать символ | внутри данных как технический маркер и просто «съедать» его при выводе на экран. При этом, если передать этот же символ через параметр &Разделитель, консоль часто отображает его верно, так как параметры подставляются в объектную модель запроса напрямую, минуя некоторые этапы текстовой предобработки.

Проверка работоспособности в программном модуле

Чтобы убедиться, что ваш запрос работает правильно, необходимо протестировать его непосредственно в программном коде, а не только в консоли. Рассмотрим пример кода для проверки:


ТекстЗапроса = 
"ВЫБРАТЬ
|   ""Товар 1"" + ""|"" + ""Аналитика 1"" КАК ТестовоеПоле";

Запрос = Новый Запрос(ТекстЗапроса);
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
    Сообщить(Результат.ТестовоеПоле); // Ожидаемый вывод: Товар 1|Аналитика 1
КонецЦикла;

Как показывает практика, в 99% случаев проблема «отсутствующего разделителя» исчезает, как только запрос запускается в реальном модуле. Это подтверждает, что | является допустимым символом для конкатенации в языке запросов 1С.

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

При объединении строк важно учитывать возможность наличия пустых ссылок или неопределенных значений. Рассмотрим ситуацию, когда КомбинацияАналитик может быть не заполнена. Проанализируем более сложный пример с использованием оператора ВЫБОР, чтобы избежать лишних разделителей в конце строки:


ВЫБРАТЬ
    ЧекПродажаТовары.Номенклатура.Наименование + 
    ВЫБОР 
        КОГДА ЧекПродажаТовары.КомбинацияАналитик = ЗНАЧЕНИЕ(Справочник.КомбинацииАналитик.ПустаяСсылка) 
        ТОГДА "" 
        ИНАЧЕ "|" + ЧекПродажаТовары.КомбинацияАналитик.Наименование 
    КОНЕЦ КАК НоменклатураНаименование
ИЗ
    Документ.ЧекПродажа.Товары КАК ЧекПродажаТовары

Важный нюанс: в языке запросов 1С, если прибавить к строке значение NULL, результатом будет NULL. Поэтому всегда проверяйте поля на наличие значений (используйте ЕСТЬNULL(Поле, "")), чтобы не потерять всю строку целиком из-за одного пустого реквизита.

Альтернативные подходы и рекомендации

Если специфика вашей задачи требует гарантированного отсутствия конфликтов с символом |, или если вы все же хотите избежать его использования из-за особенностей инструментов визуализации, рассмотрим альтернативные варианты:

  1. Использование параметров: Как заметили участники обсуждения, передача разделителя через параметр &Разделитель работает стабильно везде. Это хороший тон, если символ разделителя может измениться в будущем.
  2. Спецсимволы через предопределенные данные: В языке запросов 1С отсутствует функция CHAR() или Символ(). Если вам нужен уникальный разделитель, которого нет на клавиатуре, вы можете создать технический справочник или константу, хранить символ там и обращаться к нему через ЗНАЧЕНИЕ().
  3. Символ точки с запятой: Хотя в названиях номенклатуры иногда встречается ;, в большинстве случаев это более безопасный разделитель для CSV-подобных структур. Однако, как правильно заметили на форуме, для интернет-магазинов или технически сложных наименований (где указаны характеристики через точку с запятой) этот вариант может не подойти.
  4. Обработка в СКД: Если вы строите отчет на Системе компоновки данных, постарайтесь не склеивать строки в самом запросе. Лучше выводить их отдельными полями, а логику объединения прописать в «Выражении представления» или настроить макет. Это позволит сохранить данные «чистыми» для дальнейшего анализа.

Резюме

Подведем итог нашему анализу. Символ | в запросах 1С — это обычный текстовый символ, если он заключен в кавычки. Не стоит пытаться использовать двойные вертикальные черты "||" или дополнительные пробелы. Если в консоли запросов вы не видите разделитель, просто проверьте результат работы запроса через Сообщить() или в реальной форме документа. В подавляющем большинстве случаев платформа отработает корректно, и никакой специальный «обходной путь» без использования переменных не потребуется.

← На главную