1С 8.3 : Как в запросе объединить несколько значений в один столбец отобрав по условию?
Бывают ситуации, особенно когда формируешь отчеты по проводкам, где надо вывести отчет по одному типу значений и эти значения могут быть в разных колонках регистра.
В примере ниже, необходимо собрать отчет в разбивке по Номенклатурным группам.
Проводки разные — поэтому Субконто с типом Номенклатурная группа может быть как Дт1 и Дт2 или Дт3
Пример запроса объединяющий несколько значений в один столбец отобрав по условию и собирающий данные по этим условиям:
язык запросов: два реквизита в одно поле
Здравствуйте всем и удачного дня. Если нетрудно, дайте пожалуйста пример объединения двух реквизитов в одно поле. Поясню: мне нужно получить список партнеров и родитель в одном поле из такого запроса:
ВЫБРАТЬ
Партнеры.Ссылка КАК Партнер,
ВложенныйЗапрос.Ссылка КАК Родитель
ИЗ
(ВЫБРАТЬ
Партнеры.Ссылка КАК Ссылка
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Клиент = &Клиент) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры
ПО ВложенныйЗапрос.Ссылка = Партнеры.Родитель
Сейчас результат запроса — два поля Партнер и Родитель. Надо результаты запроса поместить в одно поле. Заранее спасибо за подсказку.
(0) > Надо результаты запроса поместить в одно поле.
Синтаксис подскажете? Может быть так:
ВЫБРАТЬ
ВложенныйЗапрос.Родитель КАК Родитель,
Партнеры.Ссылка КАК Подразделение
ИЗ
(ВЫБРАТЬ
Партнеры.Ссылка КАК Родитель
ИЗ
Справочник.Партнеры КАК Партнеры) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры
ПО ВложенныйЗапрос.Родитель = Партнеры.Родитель
но как указать наименование поля, в которое в итоге объединятся Родитель и Подразделение ?
Типа такого:
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.Наименование
ПОМЕСТИТЬ ВтРодитель
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Ссылка = &Клиент
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Контрагенты.Наименование + » » + ВтРодитель.Наименование КАК Поле1
ИЗ
ВтРодитель КАК ВтРодитель
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО ВтРодитель.Ссылка = Контрагенты.Родитель
ВЫБРАТЬ
ВложенныйЗапрос.Родитель КАК Родитель,
Партнеры.Ссылка КАК Подразделение
ИЗ
(ВЫБРАТЬ
Партнеры.Ссылка КАК Родитель
ИЗ
Справочник.Партнеры КАК Партнеры) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры
ПО ВложенныйЗапрос.Родитель = Партнеры.Родитель
ОБЪЕДИНИТЬ Родитель + Подразделение = Партнер
Пишет «ожидается выражение выбрать».
НекийПартнер
НекийПартнер2
РодительнекоегоПартнера
РодительнекоегоПартнера2
У меня в результате это
ПОДРАЗДЕЛЕНИЕ РОДИТЕЛЬ
дочь Пупкина Пупкин
сын пупкина Пупкин
ПАРТНЕР
Пупкин
дочь Пупкина
сын Пупкина
вот пример синтаксиса. Хотя следовало бы тебя в справку послать.
ВЫБРАТЬ
Партнеры.Ссылка КАК Ссылка
Поместить Родители
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Клиент = &Клиент
ВЫБРАТЬ
Родители.Ссылка КАК ОбщееПоле
из Родители
Объединить
ВЫБРАТЬ
Партнеры.Ссылка КАК Ссылка
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Родитель в (выбрать Родители.Ссылка из Родители)
ВЫБРАТЬ
Партнеры.Ссылка КАК Общее
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Клиент = &Клиент
Объединить
Партнеры.Ссылка
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Родитель.Клиент = &Клиент
(23) гм. честно: я не понял, как это работает. Здесь три запроса. При попытке скормить их контруктору он пишет «Синтаксическая ошибка «ВЫБРАТЬ»<<?>>ВЫБРАТЬ»
Первый запрос получает таблицу Родители? Второй превращает её в ОбщееПоле ? Третий находит партнеров, чей родитель содержится в Родители ? В чем смысл ?
————
Я написал запрос для формирования сегмента, состоящего из Партнеров-родителей. Сегмент формируется исходя из обслуживающего этого самого Партнера и его подразделения конкретного физ. лица — торгового представителя. Все работало чудесно.
Теперь оказалось, что мне надо включить в список Партнеров, входящих в сегмент, не только Родителей, но и их подразделения. Я добавил в исходный запрос строку «ЗапросПартнеров.Подразделение КАК Подразделение», и получилось вот что:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЗапросПартнеров.Родитель КАК Партнер,
ЗапросПартнеров.Подразделение КАК Подразделение,
УсловияОбслуживанияПартнеровТорговымиПредставителями.Ссылка КАК Представитель
<ВЫБРАТЬ
Партнер>
ИЗ
(ВЫБРАТЬ
ВложенныйЗапрос.Родитель КАК Родитель,
Партнеры.Ссылка КАК Подразделение
ИЗ
(ВЫБРАТЬ
Партнеры.Ссылка КАК Родитель
ИЗ
Справочник.Партнеры КАК Партнеры) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры
ПО ВложенныйЗапрос.Родитель = Партнеры.Родитель) КАК ЗапросПартнеров
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УсловияОбслуживанияПартнеровТорговымиПредставителями КАК УсловияОбслуживанияПартнеровТорговымиПредставителями
ПО ЗапросПартнеров.Подразделение = УсловияОбслуживанияПартнеровТорговымиПредставителями.Владелец
<ГДЕ
ЗапросПартнеров.Родитель.* КАК Партнер,
УсловияОбслуживанияПартнеровТорговымиПредставителями.Ссылка.* КАК Представитель>
Но мне не нужен список партнеров и их подразделений, подобный
РОДИТЕЛЬ ПОДРАЗДЕЛЕНИЕ
Пупкин дочь Пупкина
Пупкин сын пупкина
Мне надо получить в итоге для СКД лишь список партнеров и их подразделений:
ПАРТНЕР
Пупкин
дочь Пупкина
сын Пупкина
Партнеры.Ссылка как Общее
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Родитель.Клиент = &Клиент /// 1 уровень вложенности опять хотя
Итоги по Партнеры.Ссылка иерархия КАК Общее
Как в запросе 1с соединить 2 значения в одно поле
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: объединение
Автор уроков и преподаватель школы: Владимир Милькин
Объединение в запросах
В языке запросов имеется возможность объединять несколько запросов. При этом записи, полученные с помощью каждого из объединяемых запросов, будут собраны в один результат запроса.
Как всегда начнём с примера.
Пусть требуется написать запрос, который возвращает все названия цветов и вкусов в одной таблице.
Цвета мы умеем выбирать так:


А вот, чтобы объединить эти два результата в один как раз и потребуется операция объединения:

Обратите внимание на то, что операция объединения вовсе не гарантирует, что элементы будут идти в каком-то определённом порядке. В общем случае они могут следовать друг за другом как угодно, поэтому если важен порядок необходимо как и всегда указывать его явно (через секцию УПОРЯДОЧИТЬ).
Требования к запросам, участвующим в объединении
У объединяемых запросов должно быть одинаковое количество полей . Иначе мы получим такую ошибку:

В объединяемых запросах соответствующие друг другу (по порядку) поля должны иметь одинаковый тип . Но это требование, в отличие от предыдущего, не является обязательным. Если соответствующие друг другу поля имеют разный тип, то поле результата будет иметь СОСТАВНОЙ тип, который разбирался нами на одном из прошлых уроков:

Несмотря на то, что поле первого запроса имеет тип СТРОКА, а второго ЧИСЛО, нам удалось объединить их в одну таблицу. Но тип результатирующего поля стал составным и нам придётся учитывать это в дальнейшем. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Кстати, вы заметили, что поле итоговой таблицы (после объединения) называется Наименование, а не Калорийность? Эта такое правило : поля итоговой таблицы всегда имеют названия совпадающие с именами описанными в первом из объединяемых запросов.
Объединение более двух запросов
При объединении каждый запрос собирает данные независимо, а уже затем результаты объединяются в один. Количество объединяемых запросов не ограничено.
Напишем объединение трёх запросов:

Повторяющиеся строки
Давайте объединим один и тот же запрос сам с собой:

Обратите внимание на то, что мы объединили две одинаковые таблицы цветов, а в результате каждый цвет встречается ровно один раз.
Всё потому, что по умолчанию при объединении запросов полностью одинаковые строки в результате запроса, заменяются одной. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Если требуется, чтобы были оставлены в том числе одинаковые строки (дубли), необходимо указать ключевое слово ВСЕ:

Упорядочивание при объединении
Пытаться отдельно упорядочивать результаты запросов, участвующих в объединении не имеет смысла. Поэтому при попытке написать:

Упорядочивать можно только результат объединения :

Обратите внимание на то, что секция УПОРЯДОЧИТЬ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.
Подведение итогов при объединении
Пытаться отдельно подводить итоги по запросам, участвующим в объединении, также не имеет смысла. Поэтому при попытке написать:

Подводить итоги можно только по результату объединения :

Обратите внимание на то, что секция ИТОГИ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.
Рабочий пример
Давайте решим такую задачу. Требуется вывести для каждого элемента справочника Еда закупленное и проданное количество за весь период.
Поступление еды у нас в базе происходит документом ПоступлениеЕды. У документа есть табличная часть Еда, с реквизитами Номенклатура и Количество.
Сначала выберем все строки табличной части Еда из всех поступлений:

Теперь сгруппируем этот результат по еде с суммированием количества:

Аналогичным образом получим продажу еды из документов ПродажаЕды:

Осталось объединить эти два запроса:

Обратите внимание на то, как мы дополнили оба запроса ещё одним полем СУММА(0). Мы вынуждены были сделать это, так как оба запроса содержат по два поля, а объединение запросов должно содержать три поля. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Если бы мы не сделали этого, а написали просто:
Как в 1С объединить два поля в запросе в одно
Как я уже говорил запросы в изучение 1С программирования занимают очень важное место, без них стать разработчиком будет не возможно, так как большая часть задач решается именно с помощью них. Я решил посвятить несколько статей запросам. Они будут очень полезны начинающим программистам. В этих статьях Я постараюсь рассказать о небольших но зато очень полезных возможностях. Сегодня посмотрим как в запросе можно объединить два и более полей в одно. Запрос выводит таблицу с полями (колонками) в некоторых случаях некоторые колонки нужно объединить, для придания более простого и понятного внешнего вида. Реализовать это очень просто, можно объединить например, не две колонки а три или четыре.
Как в запросе объединить два и более полей в одно
Для примера я буду использовать консоль запросов и собственно вот такой простенький запрос, который выводить из справочника «Субъекты РФ» следующие поля «Ссылка», «Код», «Наименование», «Код ОКАТО», «Код Для Налоговой», «Федеральный Округ» и «Представление». При необходимости все эти колонки можно объединить в одну, но мы для примера объединим три «Наименование», «Код ОКАТО», «Код Для Налоговой».

Для этого открываем конструктор запросов, выбираем поле «Наименование» и изменяем его. Выбрали его так как к нему будем присоединять остальные поля.

В открывшемся окне «Произвольное выражение» объединяем нужные поля с помощью + » «+.
В кавычках указывается количество пробелов между объединяемыми значениями.

После этого поля «Код ОКАТО», «Код Для Налоговой» можно удалить так как эта информация будет теперь выводиться в поле «Наименование». Но я дли наглядности оставлю их.

Дальше нужно изменить название колонки «Наименование» так как в нем теперь будет выводить еще и информация об ОКАТО и коде для налоговой.

Тоже самое можно были сделать и без конструктора дописав все это руками в тексте запроса, но тут уже нужен опыт чтобы не ошибиться в синтаксисе.
Вообще по возможности лучше все делать с помощью конструкторов, это позволить сократить время и избежать ошибок.
Пробуем выполнить написанный запрос, если вы все сделали то должно произойти объединение полей. Как в моем случае, теперь информация из полей «Код ОКАТО», «Код Для Налоговой» так же выводиться в поле «Наименование».

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

Вот теперь все выгладить более понятно. Как видите объединять поля в запросе очень просто. Но если у Вас остались вопросы или что-то не получается обязательно напишите об этом.