Как соединить строки в запросе 1с

Обновлено: 08.07.2024

Если нужно из некоторой коллекции строк получить одну единую, это можно сделать в цикле:

ИтогСтрока = Строка + ЭлементКоллекции;

Работа функции конкатенации не вызывает проблем с производительностью, когда обрабатывается небольшое количество данных. Производительность может упасть, когда счет строк идет на тысячи.

Есть несколько вариантов получения строки из коллекции.

Первый – с помощью текстового документа. В этом случае все составные части будут идти отдельными строками. При использовании функции ПолучитьТекст(), нужно будет сделать замену символов переноса строк в коде на пустую строку, а после получения результата использовать метод обратного преобразования.

Другой способ – занести все подстроки в массив, который преобразуется в текстовое представление с помощью функции ЗначениеВСтрокуВнутр(), а далее лишнее очищается.

При массовых операциях конкатенации строк можно использовать методы платформы СтрРазделить и СтрСоединить.

ИзвТекст= Новый Массив;
Для НомерКолонки = 1 По Макет.ШиринаТаблицы Цикл
ИзвТекст.Добавить(ТекстОбласти);

РезультатТекст = СтрСоединить(ИзвТекст, Символы.ПС);

Еще один способ операции конкатенации строк — использование объекта ЗаписьXML. У этого объекта можно использовать метод ЗаписатьБезОбработки() для «сборки» документа в том виде, какой подается на вход, т.е. без лишних тегов.

2. Конкатенация в запросах

При создании текстов запросов используя функцию конкатенации можно сделать запросы более гибкими.

Конкатенация в запросах может использоваться при программной "сборке" текста запроса. Пример:

ТекстЗапроса =
"ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
&ИмяПоляКод КАК КодНоменклатуры
ИЗ
Справочник.Номенклатура КАК Номенклатура ;

ТекстЗапроса = СтрЗаменить(ТекстЗапроса , "&ИмяПоляКод ", "Номенклатура." + ИмяПоляКод);

Пример изменения имени таблицы в запросе:

"ВЫБРАТЬ
|ТаблицаСправочника.Наименование КАК Наименование,
|ТаблицаСправочника.Код КАК КодСправочника
|ИЗ
|&ТабСправочника КАК ТаблицаСправочника";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса , "&ТабСправочника", "Справочник." + ИмяСправочника);

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

Спасибо, а можно поподробнее описать процесс соединение строк в СКД?

Значит так .. Заходим в СКД .. выбираем поле, которое будем отображать как надо .. поле "Выражение упорядочивания" .. точечки там .. нажимаем .. вводим .. допустим, попробуйте .. ВЫБОР КОГДА ВЫРАЗИТЬ (Регистратор. "Документ.ПаспортныеДанные") ЕСТЬ НЕ NULL ТОГДА "Паспорт" КОНЕЦ + " № " + СТРОКА(Регистратор.Номер) + СТРОКА(Регистратор.Серия) + " от " + ФОРМАТ(Регистратор.Дата, "ДФ=dd.MM.yyyy") .. это пример! Данным примером изменяем отображение поля "Регистратор" со стандартного на наш. Будет "Паспорт № ХХХХ ХХХХ от ХХ.ХХ.ХХХХ". Идея .. для решения подобных задач применяется метод ВЫРАЗИТЬ().

Значит так .. Заходим в СКД .. выбираем поле, которое будем отображать как надо .. поле "Выражение упорядочивания" .. точечки там .. нажимаем .. вводим .. допустим, попробуйте .. ВЫБОР КОГДА ВЫРАЗИТЬ (Регистратор. "Документ.ПаспортныеДанные") ЕСТЬ НЕ NULL ТОГДА "Паспорт" КОНЕЦ + " № " + СТРОКА(Регистратор.Номер) + СТРОКА(Регистратор.Серия) + " от " + ФОРМАТ(Регистратор.Дата, "ДФ=dd.MM.yyyy") .. это пример! Данным примером изменяем отображение поля "Регистратор" со стандартного на наш. Будет "Паспорт № ХХХХ ХХХХ от ХХ.ХХ.ХХХХ". Идея .. для решения подобных задач применяется метод ВЫРАЗИТЬ().

Что то ничего не понял. А может кто-нибудь прислать мини-базку, где можно наглядно посмотреть как это сделано?

Ну Батенька эт Вы зря. Если хотите еще проще способ, то соединяйте строки непосредственно в запросе, если в СКД не понятно.
Используем подобный механизм: Заходим на вкладке "Таблицы и поля" окно "поля" .. выбираем поле, которое будем редактировать, либо добавьте новое поле ..жмем Ф2 заходим в окно "Произвольное выражение" .. начинаем колдовать ..
ВЫБОР
КОГДА Не ЕстьNull(Документ.ПаспортныеДанные.Ссылка) ТОГДА Документ.ПаспортныеДанные.Серия + " " + Документ.ПаспортныеДанные.Номер
Иначе 0
КОНЕЦ Как СтрокаСДаннымиПаспорта .. например .. поле будет содержать необходимые данные .. ;) Зы. Нее в SQL такой возможности. Если делать не через СКД, а через конструктор выходной формы, тогда можно программно слепитьвсё в одно. На скоряк такой вариант:

Всё построенно через конструктор, добавлена 1 строчка, которая собирает в текст. Она между коментами.

Для тех, кто решит поругать то, что я написал: 1. это просто пример, 2. если есть другие соображения - делитесь, 3. Все сделано за 5 минут на скорую руку )

Только ленивый, по-моему, не писал еще о вариантах вырезания гланд через анус автогеном запросами. Ну и я поделюсь.

К сожалению, возможности запросов 1С в отношении строковых переменных крайне малы. Практически они исчерпываются одной функцией и одним оператором. Тем не менее, постоянно всплывают темы в духе «а как мне сделать это прямо в запросе?». Конечно, большинство задач решаются в СКД, оставшаяся часть решается пост-обработкой результата, но чисто в качестве разминки для ума, кое-что в запросе сделать можно.

Во всех примерах я буду использовать следующие временные таблицы:

ВЫБРАТЬ
"_" КАК Симв ,
1 КАК КолСимв
ПОМЕСТИТЬ тзКоличествоСимволов9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"__" ,
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"___" ,
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"____" ,
4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"_____" ,
5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"______" ,
6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"_______" ,
7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"________" ,
8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"_________" ,
9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"" ,
0
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Прав . Симв КАК Симв ,
тзКоличествоСимволов9_Лев . КолСимв * 10 + тзКоличествоСимволов9_Прав . КолСимв КАК КолСимв
ПОМЕСТИТЬ тзКоличествоСимволов100
ИЗ
тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Лев ,
тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Прав
;
////////////////////////////////////////////////////////////////////////////////

Для приведенных примеров их вполне хватит, смысл, думаю, понятен, так что не будем заострять внимание на оптимальности их построения.

Так же рекомендую экспериментировать с приведенными запросами в файловых базах – серверные более нежные и работать автогеном в таком грязном месте не любят. :)

Тут всё очень просто

ВЫБРАТЬ
Номенклатура . Наименование ,
КоличествоСимволов . КолСимв
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволов
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволов . Симв )

Всё. Теперь можно отрезать последний пробел, например:

ВЫБРАТЬ
Номенклатура . Наименование ,
КоличествоСимволов . КолСимв ,
ВЫБОР
КОГДА Наименование подобно "% "
ТОГДА ПОДСТРОКА ( Номенклатура . Наименование , 1 , КоличествоСимволов . КолСимв - 1 )
ИНАЧЕ Номенклатура . Наименование
КОНЕЦ КАК НаименованиеБезПробела
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволов
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволов . Симв )

2. Разбить строку

Здесь чуть сложнее. Но теми же граблями.

Задача: в некоторой номенклатуре в наименовании записан некоторый текст в скобках. Надо вытащить этот текст в отдельное поле.

Для простоты договоримся, что скобочки в наименовании у нас один раз открываются и один раз закрываются.

ВЫБРАТЬ Различные
Номенклатура . Ссылка ,
Выразить ( ПОДСТРОКА ( Номенклатура . Наименование , КоличествоСимволовДоОткрытия . КолСимв + 2 , КоличествоСимволовДоЗакрытия . КолСимв - КоличествоСимволовДоОткрытия . КолСимв - 1 ) как строка ( 100 )) КАК ТекстВСкобках
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоОткрытия
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволовДоОткрытия . Симв + &СимволОткрытия + "%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоЗакрытия
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволовДоЗакрытия . Симв + &СимволЗакрытия + "%" )
ГДЕ
Номенклатура . Наименование ПОДОБНО "%" + &СимволОткрытия + "%" + &СимволЗакрытия + "%"

Тут &СимволОткрытия, понятно «(»,&СимволЗакрытия соответственно «)». Находим позицию символов и вытаскиваем подстроку. Помним, что запросы тошнит от строк неограниченной длины, поэтому используем ВЫРАЗИТЬ.

3. Сложное соединение по строке.

Ну и совсем извращение, но пример взят из реальной темы.

Существуют две таблицы:

В одной номера договоров в формате: «Номер-постфикс»

В другой номера тех же договоров, но дополненные неким доп-индексом в формате: «Номер/Индекс-постфикс».

Необходимо связать. Номер, индекс и постфикс могут быть разной длины, ориентироваться можно только на «/» и «-».

И начнем выпендриваться.

//Выделим из номеров те части, по которым сможем связывать
Выбрать
тз1сРазбиением . ВнутреннийНомер ,
Подстрока ( тз1сРазбиением . ВнутреннийНомер , 1 , КоличествоСимволовДоТире . КолСимв ) как ДоСлэша ,
Подстрока ( тз1сРазбиением . ВнутреннийНомер , КоличествоСимволовДоТире . КолСимв + 2 , СтрДлина . КолСимв ) как ПослеТире
поместить тз1сРазбиением
из тз1 как тз1сРазбиением
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоТире
ПО ( тз1сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоТире . Симв + "-%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК СтрДлина
ПО ( тз1сРазбиением . ВнутреннийНомер ПОДОБНО СтрДлина . Симв )
;
Выбрать
тз2сРазбиением . ВнутреннийНомер ,
Подстрока ( тз2сРазбиением . ВнутреннийНомер , 1 , КоличествоСимволовДоСлэша . КолСимв ) как ДоСлэша ,
Подстрока ( тз2сРазбиением . ВнутреннийНомер , КоличествоСимволовДоТире . КолСимв + 2 , СтрДлина . КолСимв ) как ПослеТире
поместить тз2сРазбиением
из тз2 как тз2сРазбиением
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоСлэша
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоСлэша . Симв + "/%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоТире
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоТире . Симв + "-%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК СтрДлина
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО СтрДлина . Симв )
;

ВЫБРАТЬ Различные
тз11 . ВнутреннийНомер ,
тз22 . ВнутреннийНомер
ИЗ
тз1сРазбиением КАК тз11
Левое СОЕДИНЕНИЕ тз2сРазбиением КАК тз22
ПО тз11 . ДоСлэша Подобно тз22 . ДоСлэша
и тз11 . ПослеТире Подобно тз22 . ПослеТире

Для любителей возмущающаться напомню, что целью было отвлечься от работы J Если кому-то пригодится в практических целях, буду рада.

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

1. Соединение строк

Пусть у нас имеется какое-то количество строк, с которыми нужно сделать группировку строк, как в примере таблицы ниже:



Рис. 1 Строки до соединения

Необходимо провести группировку так, чтобы результат выглядел следующим образом:



Рис. 2 Результат соединения строк

Для этого нужно обратиться к полю «Строковое число», после чего привить его к ресурсам, используя следующее выражение: «СоединитьСтроки(строковое_поле)».

Как было в примере до каких-либо действий:



Рис. 3 Пример до соединения

И вот какой результат получился после первых манипуляций:



Рис. 4 После использования поля Строковое число

В данном примере «Информация» – это вычисляемое поле, но вместо него может быть использован любой иной вид поля.

2. Соединение полей в строку в запросе в системе компоновки данных

Пусть необходимо создать строку путем сложения трёх различных полей (Поле1, Поле2 и Поле3) в системе компоновки данных. Но не у всех полей тип соответствует типу «Строка».

В таком случае наиболее очевидное действие – это преобразование численного типа в строчный тип внутри запроса. Для этого надо использовать оператор «Представление(Числовое_поле)», но это не будет полноценной строкой, следовательно, объединение строк не сможет быть осуществлено, то есть будет возникать ошибка, как показано на скриншоте с примером ниже:



Рис. 5 Ошибка при соеднинении строк

Внутри запроса поля не следует трогать, а чтобы произвести объединение строк воспользуемся разделом «Вычисляемые поля», после чего всё становится реализуемым, как показано ниже:




Рис. 6 Объединение строк с использованием Вычисляемых полей

То есть решением будет форматирование исходного типа с данными в строчный тип, это можно делать при помощи оператора «Формат» для придания необходимого вида, например, удалив разделители, как демонстрируется в примере ниже:



Рис. 7 Результат форматирования данных в строчный тип

3. Массовая конкатенация строк в 1С

Операция конкатенации может применяться как в управляемом приложении, так и в обычном, и в мобильном приложениях.

Для того чтобы произвести массовую конкатенацию строк в 1С, необходимо воспользоваться методами «СтрРазделить» и «СтрСоединить». Например, соединение строк будет выглядеть следующим образом:

Рис. 8 Операция конкатенации

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

Замечание: данная операция используется при 1000 и более строк, либо при меньшем количестве строк, но большой их длине.

Если нужно из некоторой коллекции строк получить одну единую, это можно сделать в цикле:

ИтогСтрока = Строка + ЭлементКоллекции;

Работа функции конкатенации не вызывает проблем с производительностью, когда обрабатывается небольшое количество данных. Производительность может упасть, когда счет строк идет на тысячи.

Есть несколько вариантов получения строки из коллекции.

Первый – с помощью текстового документа. В этом случае все составные части будут идти отдельными строками. При использовании функции ПолучитьТекст(), нужно будет сделать замену символов переноса строк в коде на пустую строку, а после получения результата использовать метод обратного преобразования.

Другой способ – занести все подстроки в массив, который преобразуется в текстовое представление с помощью функции ЗначениеВСтрокуВнутр(), а далее лишнее очищается.

При массовых операциях конкатенации строк можно использовать методы платформы СтрРазделить и СтрСоединить.

ИзвТекст= Новый Массив;
Для НомерКолонки = 1 По Макет.ШиринаТаблицы Цикл
ИзвТекст.Добавить(ТекстОбласти);

РезультатТекст = СтрСоединить(ИзвТекст, Символы.ПС);

Еще один способ операции конкатенации строк — использование объекта ЗаписьXML. У этого объекта можно использовать метод ЗаписатьБезОбработки() для «сборки» документа в том виде, какой подается на вход, т.е. без лишних тегов.

2. Конкатенация в запросах

При создании текстов запросов используя функцию конкатенации можно сделать запросы более гибкими.

Конкатенация в запросах может использоваться при программной "сборке" текста запроса. Пример:

ТекстЗапроса =
"ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
&ИмяПоляКод КАК КодНоменклатуры
ИЗ
Справочник.Номенклатура КАК Номенклатура ;

ТекстЗапроса = СтрЗаменить(ТекстЗапроса , "&ИмяПоляКод ", "Номенклатура." + ИмяПоляКод);

Пример изменения имени таблицы в запросе:

"ВЫБРАТЬ
|ТаблицаСправочника.Наименование КАК Наименование,
|ТаблицаСправочника.Код КАК КодСправочника
|ИЗ
|&ТабСправочника КАК ТаблицаСправочника";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса , "&ТабСправочника", "Справочник." + ИмяСправочника);

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

Читайте также: