1с как объединить два запроса в скд
В этом цикле статей мы рассмотрим особенности работы системы компоновки данных (СКД) с запросами в 1С.
При использовании подсистемы СКД 1C первое, с чем вы столкнетесь это необходимость написания запроса. Конечно, система компоновки данных умеет строить отчеты без использования запросов, например с помощью набора данных объект вы можете сделать отчет из таблицы значений. Но 90% отчетов, которые вы будете создавать с помощью СКД, потребуют написания запроса. Поэтому важно знать об особенностях работы с запросами в 1С СКД, ограничениях, способах и инструментах поиска ошибок.
Если у вас хоть раз возникал вопрос: почему запрос в консоли запросов выдает правильные данные, а в вашем отчете на СКД нет, то в этой статье вы найдете ответ.
Возможности и ограничения языка запросов при использовании в 1С СКД
В СКД можно использовать практически все возможности языка запросов 1С:
Параметры в запросах. При этом параметры, определенные в запросе автоматически, заполняются в 1С СКД на закладке «Параметры»
Обращение к внешним источникам данных. С помощью СКД вы можете связывать разные внешние источники данных, используя несколько наборов данных, что невозможно сделать в одном запросе. Правда, при этом нужно учитывать особенности использования наборов данных в СКД
В системе компоновки данных (СКД) недоступны:
Секция ИТОГИ. Использование данной секции в запросе добавляет в стандартную «плоскую» выборку дополнительные итоговые записи. В СКД такие записи добавляются самой подсистемой по своим правилам, поэтому данная секция для СКД неактуальна.
Предложение «АВТОУПОРЯДОЧИВАНИЕ». Обычно эта опция языка запросов редко используется, а в отчетах она практически не имеет смысла.
В СКД дополнительно с помощью расширения языка запросов 1С для СКД имеется возможность:
Подключать характеристики объектов (например, с использованием механизма плана видов характеристик). В этом случае характеристики объектов становятся как бы дополнительными полями объектов, для которых они подключены и могут использоваться в отчете в выбранных полях, условиях, группировках и т.д.
С помощью специальных конструкций можно указывать СКД, какие поля в запросе будут доступны для выборки, для использования в условиях, какие таблицы или параметры являются необязательными в запросе.
Расширение языка запросов 1С для СКД
В предыдущем разделе мы определили, что язык запросов, используемый в 1С СКД, имеет больше возможностей, чем просто запросы, выполняемые через объект платформы «Запрос». К сожалению, упорядоченной документации по этому разделу в 1С нет. Крупицы информации разбросаны: по справке к платформе, ИТС, различным неофициальным интернет ресурсам. Я постараюсь коротко объяснить основную суть данного дополнения к языку запросов и дам ссылки на источники информации, где вы можете более подробно изучить эту тему.
Лучше всего описан в официальной документации механизм использования (подключения) характеристик объектов конфигурации. Правда синтаксис в этой статье отличается от текущего, но смысл описанного от этого не страдает. Коротко этот механизм также описан в справке к платформе (с актуальным синтаксисом):
Как известно, во многих типовых конфигурациях в 1С используется механизм дополнительных реквизитов, когда к объектам конфигурации пользователь может самостоятельно, без изменения конфигурации, добавить дополнительные реквизиты.
Чтобы предоставить пользователю возможность работы с этими реквизитам в отчетах, построенных на СКД, используется механизм подключения характеристик. С помощью специального оператора «ХАРАКТЕРИСТИКИ» программист может привязать характеристики к выбранным объектам отчета. При этом необходимо указать тип объекта, к которому производится подключение характеристик, список дополнительных свойств для данного объекта, таблицу, в которой хранятся значения этих свойств.
Войдите как ученик, чтобы получить доступ к материалам школы
Система компоновки данных 1С 8.3 для начинающих: объединяем наборы данных
Автор уроков и преподаватель школы: Владимир Милькин
На прошлом уроке мы познакомились с соединением наборов данных. Сегодня же мы научимся объединять различные наборы данных в один набор.
Ставим цель
- Создать новый отчёт, в котором будут выводиться закупки (дата, поставщик) и продажи (дата, клиент) одновременно.
- Для этого сделаем два отдельных набора данных с выборкой из таблиц документов "ПоступлениеЕды" и "ПродажаЕды", а затем объединим их в один набор.
Создаем новый отчет
Открываем базу "Гастроном" в конфигураторе и через главное меню "Файл->Новый. " создаём отчёт:
Вид документа - "Внешний отчет":
В форме нового отчёта указываем имя "Урок7" и нажимаем кнопку "Открыть схему компоновки данных":
Соглашаемся с именем макета по умолчанию:
Создаем первый набор данных
Создаём новый набор данных - запрос (через зелёный плюсик), выделяем его и вызываем конструктор запроса:
Делаем выборку из таблицы документов "ПоступлениеЕды" следующих полей:
Вот он, текст нашего запроса к таблице по закупкам:
Создаем второй набор данных
Выделяем мышкой пункт "Наборы данных".
. и добавляем ещё один набор данных - запрос:
Выделяем его и вызываем конструктор запроса:
Делаем выборку из таблицы документов "ПродажаЕды" следующих полей:
Текст запроса будет таким:
Сделаем имена более читабельными. Для этого двойным щелчком переименуем "НаборДанных1" в "Покупки" и поле "Дата" в "ДатаПокупки":
Второй же набор "НаборДанных2" переименуем в "Продажи", а поле "Дата" переименуем в "ДатаПродажи":
Мы получили два набора данных. В первом - информация по покупкам (дата покупки и поставщик), во втором- информация по продажам (дата продажи и клиент). Давайте попробуем теперь вывести всё это в отчет.
Проверяем результат
Переходим на закладку "Настройки" и нажимаем волшебную палочку для вызова конструктора:
Тип отчета - "Список. ":
Выбираем поля для отчёта из обоих наборов:
Сохраняем отчёт и формируем в режиме пользователя:
Получилось не совсем то, что ожидали. Получилось перекрёстное соединение одного набора данных с другим. А нам нужно именно объединение. Исправим.
Создаем объединение наборов данных
Для этого переходим на закладку "Наборы данных".
Снова выделяем мышкой пункт "Наборы данных".
. и добавляем туда набор данных - объединение:
Видим, что этот набор добавился и у него совершенно другая картинка (не таблица, как у двух других, а два объединяющихся круга):
Затем перетаскиваем мышкой наборы "Покупки" и "Продажи" в "НаборДанных1":
Вот это и значит, что теперь "Покупки" и "Продажи" будут не соединяться, а именно объединяться в отчёте.
Сохраним отчёт и сформируем в режиме пользователя:
Отлично. То, что надо.
А давайте зададимся целью объединить столбцы "Поставщик" и "Клиент" в один? И пусть этот новый столбец будет называться "Контрагент".
Для этого заходим на закладку "Наборы данных" и меняем имя поля "Поставщик" в наборе "Покупки" на имя "Контрагент":
Затем в наборе "Продажи" меняем имя поля "Клиент" на имя "Контрагент":
Переходим на закладку "Настройки", выделяем пункт "Отчет", переходим внизу на закладку "Выбранные поля", удаляем уже не существующие поля "Поставщик" и "Клиент" и перетаскиваем из первой колонки во вторую новое поле "Контрагент":
Должно получится вот так:
Готово
Сохраняем отчёт и проверяем в режиме пользователя:
Замечательно всё получилось.
Войдите на сайт как ученик
Для учеников
Прибегайте к изучению эталонного варианта только после самостоятельного выполнения всех шагов.
На вопросы учеников — отвечаю по почте, но прежде загляните в ЧАВО (ссылка) .
Задача состояла в том, чтобы создать отчет, который показывал бы оплаты по заказу покупателя. Деятельность компании подразумевает что оплаты по заказу могут производится частями. Такой отчет:
Микрозадачи, которые нужно было решить по ходу выполнения:
- объединение данных из двух запросов
- связь запросов по ключевому полю
- установка стандартного периода в отчете
- собственная шапка заголовка в отчете
- вычисляемые поля в отчете
ЗАПРОС
Первое что нужно проделать - выборку данных. Для этого создаем в СКД обычный набор данных, отбираем Заказ покупателя (основной запрос) и Платежное поручение входящее (вложенный запрос). Во вложенном запросе обязательно должно быть поле со ссылкой на сделку, по которой проходит платеж. В итоге должна получится такая выборка данных:
СВЯЗЬ ТАБЛИЦ ЗАПРОСА
Во вложенном и в основном запросе необходимо установить связь по полю - заказ покупателя. Нужно применить Левое соединение к заказу, чтобы заказы в отчете показывались все, а оплаты в зависимости от наличия.
ПЕРИОД В ОТЧЕТЕ
Для реализации отбора документов за период в конструктор запроса нужно добавить условие отбора с полем Дата и критерием Между.
На вкладке Параметры конструктора СКД нужно добавить вручную новое поле с названием "Период" с типом Стандартный период. Стандартный период будет использоваться при настройке отчета. Начальную и Конечную дату передаем как параметр в стандартный период с помощью &Период.ДатаНачала / &Период.ДатаОкончания. Отключаем из пользовательской доступности параметры ДатаНачала, ДатаОкончания.
СВОЯ ШАПКА ОТЧЕТА
Бывает так, что при разработке отчета используется слишком много полей в группировке, которые все отображаются в шапке. Это не очень удобно с точки зрения пользования. К тому же часто пользователи хотят видеть в отчете название колонок со знакомыми и понятными им названиями. Решается эта задача так.
1. На вкладке Настройки конструктора СКД назначаете имя для верхней группировки с помощью меню Установить имя.
2. На вкладке Макеты добавляете Добавить Макет заголовка группировки. Выбираете диапазон применения как в Excel и пропишите на макете свои названия колонок.
ВЫЧИСЛЯЕМЫЕ ПОЛЯ
Для математических вычислений, в нашем случае разница между суммой заказа и суммой оплаты, мы использовали механизм вычисляемые поля. На соответствующей вкладке СКД создаете новое поле с произвольным названием, а в поле Выражение прописываете формулу СуммаДокумента - СуммаДокумента1. Не забываем добавить вычисляемое поле в Ресурсы отчета, как и другие суммы, чтобы данные выводились в отчет.
СКРИНШОТ ШАБЛОНА КОДА ОТЧЕТА
ИТОГОВЫЙ КОД ОТЧЕТА
СГРУППИРОВАТЬ ПО
ЗаказПокупателя.Ссылка,
ЗаказПокупателя.Дата,
ЗаказПокупателя.Контрагент,
ЗаказПокупателя.СуммаДокумента,
ВложенныйЗапрос.Ссылка.Проведен
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: объединение
Автор уроков и преподаватель школы: Владимир Милькин
Объединение в запросах
В языке запросов имеется возможность объединять несколько запросов. При этом записи, полученные с помощью каждого из объединяемых запросов, будут собраны в один результат запроса.
Как всегда начнём с примера.
Пусть требуется написать запрос, который возвращает все названия цветов и вкусов в одной таблице.
Цвета мы умеем выбирать так:
А вот, чтобы объединить эти два результата в один как раз и потребуется операция объединения:
Обратите внимание на то, что операция объединения вовсе не гарантирует, что элементы будут идти в каком-то определённом порядке. В общем случае они могут следовать друг за другом как угодно, поэтому если важен порядок необходимо как и всегда указывать его явно (через секцию УПОРЯДОЧИТЬ).
Требования к запросам, участвующим в объединении
У объединяемых запросов должно быть одинаковое количество полей . Иначе мы получим такую ошибку:
В объединяемых запросах соответствующие друг другу (по порядку) поля должны иметь одинаковый тип . Но это требование, в отличие от предыдущего, не является обязательным. Если соответствующие друг другу поля имеют разный тип, то поле результата будет иметь СОСТАВНОЙ тип, который разбирался нами на одном из прошлых уроков:
Несмотря на то, что поле первого запроса имеет тип СТРОКА, а второго ЧИСЛО, нам удалось объединить их в одну таблицу. Но тип результатирующего поля стал составным и нам придётся учитывать это в дальнейшем. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Кстати, вы заметили, что поле итоговой таблицы (после объединения) называется Наименование, а не Калорийность? Эта такое правило : поля итоговой таблицы всегда имеют названия совпадающие с именами описанными в первом из объединяемых запросов.
Объединение более двух запросов
При объединении каждый запрос собирает данные независимо, а уже затем результаты объединяются в один. Количество объединяемых запросов не ограничено.
Напишем объединение трёх запросов:
Повторяющиеся строки
Давайте объединим один и тот же запрос сам с собой:
Обратите внимание на то, что мы объединили две одинаковые таблицы цветов, а в результате каждый цвет встречается ровно один раз.
Всё потому, что по умолчанию при объединении запросов полностью одинаковые строки в результате запроса, заменяются одной. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Если требуется, чтобы были оставлены в том числе одинаковые строки (дубли), необходимо указать ключевое слово ВСЕ:
Упорядочивание при объединении
Пытаться отдельно упорядочивать результаты запросов, участвующих в объединении не имеет смысла. Поэтому при попытке написать:
Упорядочивать можно только результат объединения :
Обратите внимание на то, что секция УПОРЯДОЧИТЬ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.
Подведение итогов при объединении
Пытаться отдельно подводить итоги по запросам, участвующим в объединении, также не имеет смысла. Поэтому при попытке написать:
Подводить итоги можно только по результату объединения :
Обратите внимание на то, что секция ИТОГИ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.
Рабочий пример
Давайте решим такую задачу. Требуется вывести для каждого элемента справочника Еда закупленное и проданное количество за весь период.
Поступление еды у нас в базе происходит документом ПоступлениеЕды. У документа есть табличная часть Еда, с реквизитами Номенклатура и Количество.
Сначала выберем все строки табличной части Еда из всех поступлений:
Теперь сгруппируем этот результат по еде с суммированием количества:
Аналогичным образом получим продажу еды из документов ПродажаЕды:
Осталось объединить эти два запроса:
Обратите внимание на то, как мы дополнили оба запроса ещё одним полем СУММА(0). Мы вынуждены были сделать это, так как оба запроса содержат по два поля, а объединение запросов должно содержать три поля. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Если бы мы не сделали этого, а написали просто:
Цитата из справки 1С:
"По умолчанию при объединении запросов полностью одинаковые строки в результате запроса, сформированные РАЗНЫМИ запросами, заменяются одной. Если требуется, чтобы были оставлены разные строки, необходимо указать ключевое слово ВСЕ."
Конструкция ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ объединяет два результата запроса в один.
Пример запроса для вывода всех документов Приход и Расход:
Код 1C v 8.х
Конструкция ОБЪЕДИНИТЬ - соединяет два результата и группирует повторяющие строки,
А конструкция ОБЪЕДИНИТЬ ВСЕ - НЕ группирует автоматически строки результата.
Подробнее:
Порядок следования определяется порядком в списке полей в предложении ВЫБРАТЬ.
Количество полей можно изменить добавлением пустого фиктивного поля:
Код 1C v 8.х
До некоторой степени, операции объединения и соединения прямо противоположны: при соединении у источников обязательно должен быть ключ (при объединении наличие ключа абсолютно не имеет значения), при соединении количество полей может быть произвольным (при объединении количество нолей должно совпадать и поля должны следовать в одном и то же порядке), при соединении природа данных в источниках может быть различна (при объединении связываются однотипные данные).
Смысл механизма
При объединении, фактически, выполняются два запроса, а потом их результаты объединяются в один общий. Конструкция ОБЪЕДИНИТЬ ВСЕ оставит в итоговом запросе только неповторяющиеся записи (то есть, результат её действия аналогичен использованию фразы РАЗЛИЧНЫЕ после выполнения объединения).
Назначение псевдонимов, упорядочивание и расчёт итогов выполняются после объединения и действуют на результирующую таблицу.
Похожие FAQ
Еще в этой же категории
Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL()) 48
NULL – отсутствующие значения. Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено. NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа. NULL значения появляются в 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 23
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 19
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Посмотреть все в категории Запросы
Читайте также: