Как в запросе объединить строки в одну в 1с
Если нужно из некоторой коллекции строк получить одну единую, это можно сделать в цикле:
ИтогСтрока = Строка + ЭлементКоллекции;
Работа функции конкатенации не вызывает проблем с производительностью, когда обрабатывается небольшое количество данных. Производительность может упасть, когда счет строк идет на тысячи.
Есть несколько вариантов получения строки из коллекции.
Первый – с помощью текстового документа. В этом случае все составные части будут идти отдельными строками. При использовании функции ПолучитьТекст(), нужно будет сделать замену символов переноса строк в коде на пустую строку, а после получения результата использовать метод обратного преобразования.
Другой способ – занести все подстроки в массив, который преобразуется в текстовое представление с помощью функции ЗначениеВСтрокуВнутр(), а далее лишнее очищается.
При массовых операциях конкатенации строк можно использовать методы платформы СтрРазделить и СтрСоединить.
ИзвТекст= Новый Массив;
Для НомерКолонки = 1 По Макет.ШиринаТаблицы Цикл
ИзвТекст.Добавить(ТекстОбласти);
…
РезультатТекст = СтрСоединить(ИзвТекст, Символы.ПС);
Еще один способ операции конкатенации строк — использование объекта ЗаписьXML. У этого объекта можно использовать метод ЗаписатьБезОбработки() для «сборки» документа в том виде, какой подается на вход, т.е. без лишних тегов.
2. Конкатенация в запросах
При создании текстов запросов используя функцию конкатенации можно сделать запросы более гибкими.Конкатенация в запросах может использоваться при программной "сборке" текста запроса. Пример:
ТекстЗапроса =
"ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
&ИмяПоляКод КАК КодНоменклатуры
ИЗ
Справочник.Номенклатура КАК Номенклатура ;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса , "&ИмяПоляКод ", "Номенклатура." + ИмяПоляКод);
Пример изменения имени таблицы в запросе:
"ВЫБРАТЬ
|ТаблицаСправочника.Наименование КАК Наименование,
|ТаблицаСправочника.Код КАК КодСправочника
|ИЗ
|&ТабСправочника КАК ТаблицаСправочника";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса , "&ТабСправочника", "Справочник." + ИмяСправочника);
Также к данной функции можно прибегнуть, когда нужно сложить части строки, чтобы результат мог потом стать проверяемым параметром.
Подскажите как правильно объединять две строки в запросе 1С 8.3
Пишу так (
ВЫРАЗИТЬ(Хар.Полнота КАК СТРОКА(10))) + "","" + (ВЫРАЗИТЬ(Хар.Размер КАК СТРОКА(10)))
возвращает пустую строку, по отдельности выводить строки
скорее всего "размер" нестроковый, так что не получится
Не работает в запросе соединение строк.
Сволочи конечно.Но придется с этим как то жить.
(5) и как быть мне нужно получить сводное значение и по нему расчитать итоги
(6)*зевая
Да ты настырный я смотрю:-)
Ну как удастся- не забудь оповестить.
(11)ты родился не так. Нот с этим уже ничего не поделаешь.
не работает, вот тект запроса:
если по отдельности тогда возвращает текстовую строку, если вместе - возвращает пустую строку
конфигурация Управление торговлей, редакция 11.1 (11.1.1.13)
(20) да, потому что даже без выразить возращает строку = "48"
Сделай запрос для размера, второй запрос для полноты и вырази через подзапрос. Положи в таблицы и потом подсоедини их к своим ценам
(24) если это будет опять два реквизита тогда смысл?
можешь пример кода написать
26 постов о том, что не соединяется строка с не строкой. Щикарно.
(26)Смысл в том, что получится. Писать код неохота. Ты сам-то попробуй. Пример кода по клавише Shift-F1 найдешь так где временные таблицы
(27) где там не строка, оба реквизита строковые и по отдельности выводятся как строка
(28) так не просто так, напиши текст запроса чтобы заработал - 500р за помощь
Пару раз нарывался на задачу выбора дополнительных реквизитов и потом дальнейшее использование. Когда делал сразу, то был отрицательный результат. А вот пакетным запросом из ВТ и потом дальнейшей работой с ними получил нужный результат.
(30)Мне деньги не нужны )) Сделай два запроса с получением ВТ (метод Поместить) и потом используй эти две таблицы.
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: объединение
Автор уроков и преподаватель школы: Владимир Милькин
Объединение в запросах
В языке запросов имеется возможность объединять несколько запросов. При этом записи, полученные с помощью каждого из объединяемых запросов, будут собраны в один результат запроса.
Как всегда начнём с примера.
Пусть требуется написать запрос, который возвращает все названия цветов и вкусов в одной таблице.
Цвета мы умеем выбирать так:
А вот, чтобы объединить эти два результата в один как раз и потребуется операция объединения:
Обратите внимание на то, что операция объединения вовсе не гарантирует, что элементы будут идти в каком-то определённом порядке. В общем случае они могут следовать друг за другом как угодно, поэтому если важен порядок необходимо как и всегда указывать его явно (через секцию УПОРЯДОЧИТЬ).
Требования к запросам, участвующим в объединении
У объединяемых запросов должно быть одинаковое количество полей . Иначе мы получим такую ошибку:
В объединяемых запросах соответствующие друг другу (по порядку) поля должны иметь одинаковый тип . Но это требование, в отличие от предыдущего, не является обязательным. Если соответствующие друг другу поля имеют разный тип, то поле результата будет иметь СОСТАВНОЙ тип, который разбирался нами на одном из прошлых уроков:
Несмотря на то, что поле первого запроса имеет тип СТРОКА, а второго ЧИСЛО, нам удалось объединить их в одну таблицу. Но тип результатирующего поля стал составным и нам придётся учитывать это в дальнейшем. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Кстати, вы заметили, что поле итоговой таблицы (после объединения) называется Наименование, а не Калорийность? Эта такое правило : поля итоговой таблицы всегда имеют названия совпадающие с именами описанными в первом из объединяемых запросов.
Объединение более двух запросов
При объединении каждый запрос собирает данные независимо, а уже затем результаты объединяются в один. Количество объединяемых запросов не ограничено.
Напишем объединение трёх запросов:
Повторяющиеся строки
Давайте объединим один и тот же запрос сам с собой:
Обратите внимание на то, что мы объединили две одинаковые таблицы цветов, а в результате каждый цвет встречается ровно один раз.
Всё потому, что по умолчанию при объединении запросов полностью одинаковые строки в результате запроса, заменяются одной. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Если требуется, чтобы были оставлены в том числе одинаковые строки (дубли), необходимо указать ключевое слово ВСЕ:
Упорядочивание при объединении
Пытаться отдельно упорядочивать результаты запросов, участвующих в объединении не имеет смысла. Поэтому при попытке написать:
Упорядочивать можно только результат объединения :
Обратите внимание на то, что секция УПОРЯДОЧИТЬ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.
Подведение итогов при объединении
Пытаться отдельно подводить итоги по запросам, участвующим в объединении, также не имеет смысла. Поэтому при попытке написать:
Подводить итоги можно только по результату объединения :
Обратите внимание на то, что секция ИТОГИ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.
Рабочий пример
Давайте решим такую задачу. Требуется вывести для каждого элемента справочника Еда закупленное и проданное количество за весь период.
Поступление еды у нас в базе происходит документом ПоступлениеЕды. У документа есть табличная часть Еда, с реквизитами Номенклатура и Количество.
Сначала выберем все строки табличной части Еда из всех поступлений:
Теперь сгруппируем этот результат по еде с суммированием количества:
Аналогичным образом получим продажу еды из документов ПродажаЕды:
Осталось объединить эти два запроса:
Обратите внимание на то, как мы дополнили оба запроса ещё одним полем СУММА(0). Мы вынуждены были сделать это, так как оба запроса содержат по два поля, а объединение запросов должно содержать три поля. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Если бы мы не сделали этого, а написали просто:
В данной статье будет рассмотрено как реализовано соединение строк / строки с числом внутри запроса системы 1С, и как производится соединение полей с различными типами в строку СКД. Кроме того, поговорим о массовой конкатенации строк в 1С.
1. Соединение строк
Пусть у нас имеется какое-то количество строк, с которыми нужно сделать группировку строк, как в примере таблицы ниже:
Рис. 1 Строки до соединения
Необходимо провести группировку так, чтобы результат выглядел следующим образом:
Рис. 2 Результат соединения строк
Для этого нужно обратиться к полю «Строковое число», после чего привить его к ресурсам, используя следующее выражение: «СоединитьСтроки(строковое_поле)».
Как было в примере до каких-либо действий:
Рис. 3 Пример до соединения
И вот какой результат получился после первых манипуляций:
Рис. 4 После использования поля Строковое число
В данном примере «Информация» – это вычисляемое поле, но вместо него может быть использован любой иной вид поля.
2. Соединение полей в строку в запросе в системе компоновки данных
Пусть необходимо создать строку путем сложения трёх различных полей (Поле1, Поле2 и Поле3) в системе компоновки данных. Но не у всех полей тип соответствует типу «Строка».
В таком случае наиболее очевидное действие – это преобразование численного типа в строчный тип внутри запроса. Для этого надо использовать оператор «Представление(Числовое_поле)», но это не будет полноценной строкой, следовательно, объединение строк не сможет быть осуществлено, то есть будет возникать ошибка, как показано на скриншоте с примером ниже:
Рис. 5 Ошибка при соеднинении строк
Внутри запроса поля не следует трогать, а чтобы произвести объединение строк воспользуемся разделом «Вычисляемые поля», после чего всё становится реализуемым, как показано ниже:
Рис. 6 Объединение строк с использованием Вычисляемых полей
То есть решением будет форматирование исходного типа с данными в строчный тип, это можно делать при помощи оператора «Формат» для придания необходимого вида, например, удалив разделители, как демонстрируется в примере ниже:
Рис. 7 Результат форматирования данных в строчный тип
3. Массовая конкатенация строк в 1С
Операция конкатенации может применяться как в управляемом приложении, так и в обычном, и в мобильном приложениях.
Для того чтобы произвести массовую конкатенацию строк в 1С, необходимо воспользоваться методами «СтрРазделить» и «СтрСоединить». Например, соединение строк будет выглядеть следующим образом:
Рис. 8 Операция конкатенации
Подобная обработка данных имеет довольно быстрое исполнение, а также уменьшает нагрузку и потребление оперативной памяти.
Замечание: данная операция используется при 1000 и более строк, либо при меньшем количестве строк, но большой их длине.
&НаСервере
Процедура ОбъединениеДвухТаблицВОдну ()
// Объединение "Контрагенты" и "Классификатор Сроков Полезного Использования"
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Контрагенты
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.КлассификаторСроковПИ" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ОбъединениеБолееДвухТаблицВОдну ()
// Объединение трех таблиц Контрагенты, Материалы и Страны
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Контрагенты
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Материалы
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Страны" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура СохранениеДубликатовВРезультатеОбъединенияТаблиц ()
// Объединение таблицы "Классификатор Сроков Полезного Использования" саму с собой так,
// чтобы дубликаты, которые получились сами по себе - остались в выборке (задвоились)
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.КлассификаторСроковПИ
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.КлассификаторСроковПИ" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ОбъединениеТаблицСРазнымКоличествомПолей ()
// Создание дополнительных (недостающих) полей и заполнение их значениями
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| Наименование,
| 0
|ИЗ
| Справочник.Контрагенты" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура УпорядочиваниеПриОбъединенииТаблиц ()
// Упорядочивание таблиц Материалы и КлассификаторСроковПИ по наименованию (алфавиту)
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Материалы
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.КлассификаторСроковПИ
|
|УПОРЯДОЧИТЬ ПО
| Наименование УБЫВ" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Читайте также: