для чего используется набор данных объединение в скд
Профессия — 1С
рубрики: СКД | Дата: 7 апреля, 2017
Использование системы компоновки данных 1С невозможно без наборов данных. В одной схеме компоновки данных их может быть несколько. И они могут связываться между собой определенным образом. А точнее либо соединяться, либо объединяться. В этой статье рассмотрим объединение наборов данных. Объединение наборов данных в СКД подобно объединению таблиц в языке запросов.
Чтобы объединить два или более набора данных в СКД, необходимо на закладке Наборы данных предварительно создать специальный набор данных — объединение
Получаем вот такую картину
И уже в этот созданный объект добавляем наборы, которые будут непосредственно объединяться. Давайте добавим два набора данных. Один из которых будет запрос, а второй для разнообразия — объект (внешний источник данных). Вот так:
В качестве примера рассмотрим объединение наборов данных с остатками товаров.
В том наборе, где будем использовать внешний источник данных, вручную добавляем поля Товар, Количество и прописываем имя объекта, содержащего данные
Для набора данных где используется запрос будем получать данные с использованием виртуальной таблицы остатков вот из такого регистра накопления:
Делаем простейший запрос
Чтобы избавиться от складов, пришлось задействовать в запросе компоновку данных (все, что в фигурных скобках) и отключить внизу флаг автозаполнения. Также в качестве товара был взят не элемент справочника, а его представление, чтобы тип был такой же как и в наборе с внешним источником данных. Чтобы данные из разных наборов попали в одно поле у них должно быть одинаковое наименование в поле Путь. Поэтому для поля Остатки путь был вручную исправлен на Количество, чтобы синхронизировать его со вторым набором данных. На самом деле лучше конечно же использовать нужный псевдоним сразу в запросе. В данном случае умышленно не стал это делать, чтобы заострить внимание на такой особенности.
Теперь обратимся непосредственно к данным
В регистре накопления у меня хранятся следующие остатки товаров
Товар | Количество |
---|---|
Карандаш | 47 |
Лампа | 15 |
Ручка | 10 |
а во внешнем источнике данных вот такая картина
Товар | Количество |
---|---|
Скотч | 5 |
Лампа | 1 |
Кисточка | 15 |
Выполним настройку схемы компоновки самым примитивным образом.
Поле Количество естественно сделаем ресурсом, а на закладке настройки в структуру просто добавим Детальные записи. Ну и конечно не забудем поместить Товар и Количество в выбранные поля. И для полного счастья сделаем упорядочивание по товару.
В результате выполнения отчета с такими настройками СКД получаем вот такую таблицу
Товар | Количество |
---|---|
Карандаш | 47 |
Кисточка | 15 |
Лампа | 15 |
Лампа | 1 |
Ручка | 10 |
Скотч | 5 |
Как видим, Лампа, которая есть в обоих наборах данных, представлена в результате запроса двумя строчками. Чтобы свернуть их в одну строку необходимо немного видоизменить структуру в настройках СКД и вместо детальных записей сделать группировку по полю Товар.
И теперь получаем результат без задвоенных строк.
Отчетность в 1С: Система Компоновки Данных (СКД), идея и архитектура
Одна из самых важных областей бизнес-софта – это отчетность. От того, насколько легко настроить под меняющиеся потребности бизнеса (и законодательства) существующий отчет или сделать новый, может зависеть (причем не в переносном смысле!) судьба бизнеса, будь то отчет для налоговой инспекции или диаграмма зависимости спроса на товары от сезона и других факторов. Мощная и гибкая система отчетности, позволяющая легко извлечь из системы нужные данные, представить их в доступном для понимания виде, позволяющая конечному пользователю перенастроить стандартный отчет так, чтобы увидеть данные в новом свете – это идеал, к которому должна стремиться каждая бизнес-система.
В платформе «1С:Предприятие» за построение отчётов отвечает механизм под названием «Система компоновки данных» (сокращенно СКД). В этой статье мы постараемся дать краткое описание идеи и архитектуры механизма СКД и его возможностей.
СКД – это механизм, основанный на декларативном описании отчетов. СКД предназначен для построения отчетов и для вывода информации, имеющей сложную структуру. Кстати, помимо разработки отчетов механизм СКД также используется в «1С:Предприятии» в динамическом списке, средстве показа списочной информации с богатой функциональностью (показ плоских и иерархических списков, условное оформление строк, группировки и т.п.).
Немного истории
В самой первой версии платформы «1С:Предприятие 8», версии 8.0, отчеты делались так:
Одной из идей, легших в основу СКД, была гибкость и настраиваемость отчетов, причем доступная как разработчику, так и конечному пользователю. В идеале хотелось бы дать доступ конечному пользователю к тому же набору инструментов для дизайна отчета, что и разработчику. Логично было бы сделать единый набор инструментов, доступный всем. Ну а раз инструменты предполагают участие конечного пользователя – значит, нужно использование программирования в них убрать до минимума (лучше всего – устранить совсем), и по максимуму использовать визуальные настройки.
Постановка задачи
Задача перед командой разработки стояла такая – сделать систему создания отчетов, основанную не на алгоритмическом (т.е. через написание кода), а на декларативном подходе к созданию отчетов. И мы считаем, что задачу успешно решили. По нашему опыту, около 80% требуемой отчетности может быть реализована с помощью СКД без единой строчки кода (за исключением написания формул вычисляемых полей), по большей части — через визуальные настройки.
Разработка первой версии СКД заняла около 5 человеко-лет.
Два языка
В создании отчетов задействованы два языка. Один – язык запросов, используемый для выборки данных. Второй – язык выражений компоновки данных, предназначен для записи выражений, используемых в различных частях системы, например, в настройках компоновки данных, для описания выражений пользовательских полей.
Язык запросов
Язык запросов основан на SQL и легко осваивается знающими SQL. Пример запроса:
Легко видеть аналоги стандартных для SQL-запроса секций — SELECT, FROM, GROUP BY, ORDER BY.
При этом язык запросов содержит значительное количество расширений, ориентированных на отражение специфики финансово-экономических задач и на максимальное сокращение усилий по разработке прикладных решений:
Есть также специальные расширения языка запросов для СКД. Расширение осуществляется при помощи специальных синтаксических инструкций, заключаемых в фигурные скобки и помещаемых непосредственно в текст запроса. С помощью расширений разработчик определяет, какие операции конечный пользователь сможет проводить, настраивая отчет.
Связи наборов данных в СКД
В СКД есть возможность соединять между собой разные наборы данных. Такая же возможность есть в Запросах. Какое соединение предпочтительнее: соединение наборов данных в СКД или соединение в Запросе внутри одного набора данных? Универсального алгоритма нет, но есть ключевые принципы, которые нужно учесть при выборе метода.
· Если есть возможность получить все данные в одном запросе, то это – более приоритетный вариант, чем соединение наборов данных в СКД:
— Запросы выполняются на сервере СУБД, а не на сервере 1С: Предприятие 8;
— У современных СУБД есть оптимизатор запросов, что способствует большей производительности при формировании отчета.
· Если нет возможности получить данные в одном запросе, то нужно использовать соединение наборов данных в СКД:
— Соединение разнородных наборов: Набор данных Запрос – Набор данных Объект, Набор данных Запрос – Набор данных Объединение, Набор данных Объект – Набор данных Объединение.
· Если текст запроса в одном наборе получается слишком длинным, сложным для отладки, то возможно лучше разбить этот запрос на несколько отдельных наборов данных. Иногда, когда это не критично, лучше пожертвовать производительностью для отладки и дальнейшего сопровождения системы.
1. Тип соединение наборов данных в СКД
Соединение наборов данных всегда левое внешнее. Что это значит? Предположим, у нас есть два набора данных: А и Б. Нам нужно соединить эти наборы по определенному условию и в результате получить 3 поля из набора А, и 1 поле из набора Б.
Пример соединения наборов данных
В результате внешнего левого соединения мы получим все строки из набора А. Из набора Б в результат попадут только те строки, которые соответствуют условию связей этих наборов. Таким образом из левого набора (Набор А) попадут все строки, а из правого (Набор Б) – только некоторые строки.
2. Чем соединение отличается от объединения набора данных?
Между объединением наборов данных и соединением есть большая разница. При объединении наборов данных в итоговую таблицу попадают все записи первого набора и все записи из второго набора данных в СКД. Это можно отобразить на схеме.
Объединение наборов данных
В отличии от Запросов, в объединении наборов данных количество полей может не совпадать. Например, в Наборе А всего 3 поля, а в Наборе Б – 4 поля. Такое объединение корректно отработает.
3. Настройка соединения наборов данных
Настройка связей наборов данных в СКД настраивается на вкладке «Связи наборов данных».
Связи наборов данных
Источник связи – это первый набор данных, из которого будут отобраны все строки. Приемник связи – это второй набор данных, из которого будут присоединены только те строки, которые соответствуют условию связи. Выражение источник и Выражение приемник – это поля наборов данных, по которым будет установлена связь между наборами. В СКД есть возможность передавать параметры из левого набора данных в правый. Параметр – это параметр из второго (правого) набора данных, которому присваивается значение из поля Выражение источник.
Потребность в передаче параметра данных может возникнуть при выводе отчета по продажам за каждый день с конечным остатком на день продажи или отчета о продажах за каждый день с установленной ценой на этот день.
При использовании параметров в связях наборов данных фактически получается, что второй (правый) набор данных формируется в цикле. Для оптимизации в такой ситуации можно установить галочку «Список параметров». В этом случае данные из второго (правого) набор будут получаться порциями по 1000 строк. Благодаря этому можно оптимизировать вывод отчета.
Связи наборов данных в СКД – удобный инструмент, но важно хорошо понимать, в каком случае его использовать. Если у Вас возникли вопросы, будем рады помочь!
Доброго времени суток.
Вступление
1. Подготовка и демонстрация
ВЫБРАТЬ
СпецификацииНоменклатурыВыходныеИзделия.Номенклатура КАК Продукция,
СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Комплектующая,
СРЕДНЕЕ(СпецификацииНоменклатурыИсходныеКомплектующие.Количество / ВЫБОР
КОГДА СпецификацииНоменклатурыВыходныеИзделия.Количество <> 0
ТОГДА СпецификацииНоменклатурыВыходныеИзделия.Количество
ИНАЧЕ 1
КОНЕЦ) КАК КоличествоНа1
ИЗ
Справочник.СпецификацииНоменклатуры.ВыходныеИзделия КАК СпецификацииНоменклатурыВыходныеИзделия
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
ПО СпецификацииНоменклатурыВыходныеИзделия.Ссылка = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка
ГДЕ
СпецификацииНоменклатурыВыходныеИзделия.Ссылка.Активная
И СпецификацииНоменклатурыВыходныеИзделия.Номенклатура В ИЕРАРХИИ(&Номенклатура)
СГРУППИРОВАТЬ ПО
СпецификацииНоменклатурыВыходныеИзделия.Номенклатура,
СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладКомплектующей,
ТоварыНаСкладахОстатки.Номенклатура КАК Комплектующая,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокКомплектующей
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, <(Склад).* КАК СкладОтбора, (Номенклатура).* КАК Комплектующая>) КАК ТоварыНаСкладахОстатки
Ресурсы пока простые: Сумма(КоличествоНа1) и Сумма(ОстатокКомлектующей).
Дальше была идея Склады в колонки, но тогда получается очень широко и почти не заполнено. Ну если одна комплектующая только на одном складе, то по всем остальным пусто. В общем не очень красиво выходит.
Проблема:
Тогда я еще не знал про «замену Левого на Внутреннее, если есть отбор».
2. Попытка выкрутиться
Но вот беда: в отборе по группировке, среди доступных полей, нет поля «СкладОтбора»:
Хорошо, попробую использовать СкладКомплектующей. Добавил отборы в каждую группировку, но выключенные и стал включать по очереди. Первым включаю у группировки Комплектующая. Результат такой же, как с отбором по отчету целиком. Отключаю.
3. Хотелки и их исполнение.
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладПродукции,
ТоварыНаСкладахОстатки.Номенклатура КАК Продукция,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокПродукции
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, <(Склад).* КАК СкладОтбора, (Номенклатура).* КАК Продукция>) КАК ТоварыНаСкладахОстатки
Ну и добавляем еще одну связь.
Ну и в ресурсах определяем ОстатокПродукции.
Тут на помощь пришла вторая статья Агрегатные функции СКД, о которых мало кто знает. Сначала использовал функцию ТаблицаЗначений. Но при простом повторении формирования отчета строки складов прыгают. Тогда добавил Упорядочить в итоге получилось так:
Для ОстаткаКомплектующих: Упорядочить(ТаблицаЗначений(Различные СкладКомплектующей Как Склад, ОстатокКомплектующей Как Остаток), «Склад Автоупорядочивание»)
Для ОстаткаПродукции: Упорядочить(ТаблицаЗначений(Различные СкладПродукции Как Склад, ОстатокПродукции Как Остаток), «Склад Автоупорядочивание»)
Дальше немного «причесал» структуру: выключил детальные записи, сгруппировал поля, отключил «Общие Итоги по вертикали».
Теперь влючаю отбор по складу и вижу результат, опять исчезли строки (что в прочем уже ожидаемо):
4. Поиск решения
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладКомплектующей,
СпрНоменклатура.Ссылка КАК Комплектующая,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокКомплектующей
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, ) КАК ТоварыНаСкладахОстатки
ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
<ГДЕ
ТоварыНаСкладахОстатки.Склад.* КАК СкладОтбора>
Дальше экспериментировал с настройками. Работало долго. На каком-то этапе вообще получил от сервера отлуп по памяти. Бросил.
День бодался. На следующий день пошел по второму кугу. Только все создавал с нуля.
5. Решение
И начал снова с Левого соединения в запросе. Получился такой запрос (правильный):
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладКомплектующей,
СпрНоменклатура.Ссылка КАК Комплектующая,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокКомплектующей
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, <(Склад).* КАК СкладОтбора, (Номенклатура).* КАК Комплектующая>) КАК ТоварыНаСкладахОстатки
ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
Сформировал, посмотрел нормальный результат. Включил отбор и увидел это:
Но самым удивительным для меня оказался такой результат (отбор по другому складу и еще одна продукция):
В общем дальше можно пытаться улучшить. Например, если основной запрос не сложный, то в НабореДанных2 связывать не со справочником номенклатуры, а поместить результат основного запроса во временную таблицу и связать с ним.
Конец
Прошу специалистов не смеяться над стилем изложения, я курсов не проходил. Общаюсь в большинстве своем с пользователями, которым надо объяснить понятно что, почему и как. Да и статья это первая, не потому что писать нечего, а потому, что большая часть уже написана Вами и надо только найти :).
Для чего используется набор данных объединение в скд
Войдите как ученик, чтобы получить доступ к материалам школы
Система компоновки данных 1С 8.3 для начинающих: делаем связь наборов данных
Автор уроков и преподаватель школы: Владимир Милькин
Ставим цель
Создаем новый отчет
Открываем базу «Гастроном» в конфигураторе и через главное меню создаём новый отчет:
В форме нового отчёта указываем имя «Урок6» и нажимаем кнопку «Открыть схему компоновки данных»:
Оставляем имя схемы по умолчанию:
Добавляем первый набор данных
Добавился первый набор данных. Напишем запрос.
Вызываем конструктор запроса:
Указываем таблицу «Клиенты» и поля, которые требуется получить из запроса:
Получился такой текст запроса:
Добавляем второй набор данных
Выделяем мышкой пункт «Наборы данных».
Выделяем его (НаборДанных2) и снова вызываем конструктор запроса:
Указываем таблицу справочника «Еда» и поля, которые требуется получить из запроса:
Получился такой текст запроса:
Обратите внимание, что у нас сейчас в отчёте присутствуют два набора данных: НаборДанных1 и НаборДанных2. У каждого свой текст запроса и свои данные.
Делаем имена более наглядными
Для наглядности, давайте переименуем НаборДанных1 в Клиенты, а НаборДанных2 в Еда.
Сделайте это двойным щелчком по каждому из наборов:
Данные каждого из наборов мы сможем использовать в нашем отчёте. К этим данным мы будем обращаться через поля.
В данный момент у набора «Клиенты» следующие поля: «Наименование» и «ЛюбимыйЦвет», а у набора «Еда»: «Наименование» и «Цвет».
Видим, что имена пересекаются и мы легко запутаемся. Поэтому давайте изменим имена полей на более говорящие.
Выделяем набор «Клиенты» и меняем имена полей так:
Затем выделяем набор «Еда» и меняем имена полей так:
Вызываем конструктор настроек
Наконец, переходим на закладку «Настройки» и нажимаем волшебную палочку, чтобы вызвать конструктор настроек:
Выбираем поля для отчета из обоих наборов:
Видите почему так важно было изменить имена полей? На этапе настроек компоновки данных мы не видим из каких наборов эти поля. Видим только их имена.
Проверяем отчёт
Сохраняем отчет и формируем в режиме пользователя:
Ага. Хорошо, но не совсем. Произошло так называемое перекрёстное соединение двух наборов (вам это должно быть хорошо знакомо по соединениям в запросах, которые мы изучали в прошлых модулях). Каждой записи из таблицы «Клиенты» сопоставлена запись из таблицы «Еда».
Но нам нужно из всех этих записей оставить только те у которых поле «ЛюбимыйЦветКлиента» равно полю «ЦветЕды»:
Осуществляем связь двух наборов данных
Для этого осуществим связь двух наборов данных (Клиенты и Еда) по полям ЛюбимыйЦветКлиента и ЦветЕды.
Переходим на закладку «Связи наборов данных» и нажимаем на кнопку-плюсик, чтобы добавить новую связь:
Настраиваем параметры как на рисунке ниже:
Источник и приёмник связи. Ну тут всё понятно. Указываем первый набор (Клиенты) и второй набор (Еда) данных. Хочу обратить особое внимание, что связь будет осуществляться по принципу внешнего левого соединения (мы его проходили в теме запросов в прошлых модулях). Исходя из этого и нужно выбирать какой набор будет источником, а какой приёмником.
Выражение источник. Указываем здесь выражение или просто поле из набора данных источника (мы здесь указали поле ЛюбимыйЦветКлиента из набора Клиенты).
Выражение приемник. Указываем здесь выражение или просто поле из набора данных приёмника (мы здесь указали поле ЦветЕды из набора Еда).
Таким образом данная связь оставит из прошлого списка только те строки, у которых поле ЛюбимыйЦветКлиента равно полю ЦветЕды.
Сохраним отчёт и запустим в режиме пользователя:
Сделаю пояснение про поле «Условие связи«, об которое так часто бьют свои копья начинающие программисты.
В этом случае для всех строк из источника связи перед осуществлением связи будет проверяться это выражение (условие связи). И если это выражение равно ИСТИНА, то будет предприниматься попытка установить связи этой строки со строками из приемника связи. Если же выражение равно ЛОЖЬ, то таких попыток предприниматься не будет.
Очень просто. Напишем в условии связи выражение ИмяКлиента = «Андрей»:
Сохраним отчёт и сформируем в режиме пользователя:
Войдите на сайт как ученик
Авторизуйтесь, чтобы получить доступ ко всем материалам школы
Прибегайте к изучению эталонного варианта только после самостоятельного выполнения всех шагов.
Войдите как ученик, чтобы получить доступ к материалам школы