При разработке отчетов или обработок в системе 1С:Предприятие часто возникает задача объединения нескольких строковых полей в одно. В качестве разделителя разработчики нередко выбирают символ вертикальной черты |. Однако при работе с этим символом в языке запросов можно столкнуться с неочевидным поведением системы: в консоли запросов символ может «пропадать», хотя при использовании параметров он отображается корректно. Рассмотрим подробно, как правильно работать с конкатенацией строк и почему возникают подобные визуальные эффекты.
В языке запросов 1С 8.3 для объединения строк используется оператор +. Если нам необходимо добавить статический символ между двумя полями, мы просто заключаем его в двойные кавычки. Проанализируем стандартный пример, который часто вызывает вопросы у начинающих разработчиков:
ВЫБРАТЬ
ЧекПродажаТовары.Номенклатура.Наименование + "|" + ЧекПродажаТовары.КомбинацияАналитик.Наименование КАК ПолноеНаименование
ИЗ
Документ.ЧекПродажа.Товары КАК ЧекПродажаТовары
С точки зрения синтаксиса языка запросов, данная конструкция абсолютно верна. Платформа воспринимает символ | внутри кавычек как обычный текстовый литерал.
Многие разработчики используют «Консоль запросов» для отладки логики. Именно здесь кроется главная ловушка. Разберем ситуацию: вы пишете запрос, выполняете его в консоли и видите результат НаименованиеНоменклатурыНаименованиеАналитики вместо ожидаемого НаименованиеНоменклатуры|НаименованиеАналитики. Выясним причину этого явления.
Символ | в экосистеме 1С имеет особое значение:
Проанализируем поведение парсера консоли: когда запрос выполняется, результат попадает в таблицу. Если алгоритм отрисовки таблицы в консоли настроен некорректно, он может интерпретировать символ | внутри данных как технический маркер и просто «съедать» его при выводе на экран. При этом, если передать этот же символ через параметр &Разделитель, консоль часто отображает его верно, так как параметры подставляются в объектную модель запроса напрямую, минуя некоторые этапы текстовой предобработки.
Чтобы убедиться, что ваш запрос работает правильно, необходимо протестировать его непосредственно в программном коде, а не только в консоли. Рассмотрим пример кода для проверки:
ТекстЗапроса =
"ВЫБРАТЬ
| ""Товар 1"" + ""|"" + ""Аналитика 1"" КАК ТестовоеПоле";
Запрос = Новый Запрос(ТекстЗапроса);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Сообщить(Результат.ТестовоеПоле); // Ожидаемый вывод: Товар 1|Аналитика 1
КонецЦикла;
Как показывает практика, в 99% случаев проблема «отсутствующего разделителя» исчезает, как только запрос запускается в реальном модуле. Это подтверждает, что | является допустимым символом для конкатенации в языке запросов 1С.
При объединении строк важно учитывать возможность наличия пустых ссылок или неопределенных значений. Рассмотрим ситуацию, когда КомбинацияАналитик может быть не заполнена. Проанализируем более сложный пример с использованием оператора ВЫБОР, чтобы избежать лишних разделителей в конце строки:
ВЫБРАТЬ
ЧекПродажаТовары.Номенклатура.Наименование +
ВЫБОР
КОГДА ЧекПродажаТовары.КомбинацияАналитик = ЗНАЧЕНИЕ(Справочник.КомбинацииАналитик.ПустаяСсылка)
ТОГДА ""
ИНАЧЕ "|" + ЧекПродажаТовары.КомбинацияАналитик.Наименование
КОНЕЦ КАК НоменклатураНаименование
ИЗ
Документ.ЧекПродажа.Товары КАК ЧекПродажаТовары
Важный нюанс: в языке запросов 1С, если прибавить к строке значение NULL, результатом будет NULL. Поэтому всегда проверяйте поля на наличие значений (используйте ЕСТЬNULL(Поле, "")), чтобы не потерять всю строку целиком из-за одного пустого реквизита.
Если специфика вашей задачи требует гарантированного отсутствия конфликтов с символом |, или если вы все же хотите избежать его использования из-за особенностей инструментов визуализации, рассмотрим альтернативные варианты:
&Разделитель работает стабильно везде. Это хороший тон, если символ разделителя может измениться в будущем.CHAR() или Символ(). Если вам нужен уникальный разделитель, которого нет на клавиатуре, вы можете создать технический справочник или константу, хранить символ там и обращаться к нему через ЗНАЧЕНИЕ().;, в большинстве случаев это более безопасный разделитель для CSV-подобных структур. Однако, как правильно заметили на форуме, для интернет-магазинов или технически сложных наименований (где указаны характеристики через точку с запятой) этот вариант может не подойти.Подведем итог нашему анализу. Символ | в запросах 1С — это обычный текстовый символ, если он заключен в кавычки. Не стоит пытаться использовать двойные вертикальные черты "||" или дополнительные пробелы. Если в консоли запросов вы не видите разделитель, просто проверьте результат работы запроса через Сообщить() или в реальной форме документа. В подавляющем большинстве случаев платформа отработает корректно, и никакой специальный «обходной путь» без использования переменных не потребуется.