какие виды соединений двух наборов данных могут быть реализованы в системе компоновки
Какие виды соединений двух наборов данных могут быть реализованы в СК(Д)?
| 3. 4. Только\”Все ко всем\”, \”Левое\”, и\”Внутреннее | 100% (1) | ![]() |
| 1. 1. Все, что и в языке запросов: \”Все ко всем\”, \ | 0% (0) | ![]() |
| 2. 2. Только\”Все ко всем\”, \”Левое\”, \”Правое\” и\ | 0% (0) | ![]() |
| 4. 5. Только\”Левое\”, \”Правое\”, \”Внутреннее\” и\” | 0% (0) | ![]() |
Всего мнений: 1
В тестировании по платформе есть такой вопрос, из которого появляется еще больше вопросов, звучит он дословно так “Какие виды соединений двух наборов данных могут быть реализованы в системе компоновки?”
1. системе компоновки, это тоже самое, что СКД?
2. К чему в вопросе использована картинка http://manual1c.ru/test/img/T_Platf83_11_14.jpg
Варианты ответов:
1. Все, что и в языке запросов: “Все ко всем”, “Левое”, “Правое”, “Внутреннее” и
“Полное”
2. Только”Все ко всем”, “Левое”, “Правое” и”Внутреннее”
3. Только”Левое”, и”Внутреннее” (считается верным, НО НА САМОМ ДЕЛЕ НЕ ВЕРНЫЙ, ДОКАЗАНО ТЕСТАМИ, напр http://a.disquscdn.com/uploads/mediaembed/images/1535/9051/original.jpg)
4. Только”Все ко всем”, “Левое”, и”Внутреннее”
5. Только”Левое”, “Правое”, “Внутреннее” и”Полное”
Начал пробовать соединить два набора в СКД, но так и не нашел как это сделать, подскажите пожалуйста
Связи наборов данных в СКД
В СКД есть возможность соединять между собой разные наборы данных. Такая же возможность есть в Запросах. Какое соединение предпочтительнее: соединение наборов данных в СКД или соединение в Запросе внутри одного набора данных? Универсального алгоритма нет, но есть ключевые принципы, которые нужно учесть при выборе метода.
· Если есть возможность получить все данные в одном запросе, то это – более приоритетный вариант, чем соединение наборов данных в СКД:
– Запросы выполняются на сервере СУБД, а не на сервере 1С: Предприятие 8;
– У современных СУБД есть оптимизатор запросов, что способствует большей производительности при формировании отчета.
· Если нет возможности получить данные в одном запросе, то нужно использовать соединение наборов данных в СКД:
– Соединение разнородных наборов: Набор данных Запрос – Набор данных Объект, Набор данных Запрос – Набор данных Объединение, Набор данных Объект – Набор данных Объединение.
· Если текст запроса в одном наборе получается слишком длинным, сложным для отладки, то возможно лучше разбить этот запрос на несколько отдельных наборов данных. Иногда, когда это не критично, лучше пожертвовать производительностью для отладки и дальнейшего сопровождения системы.
1. Тип соединение наборов данных в СКД
Соединение наборов данных всегда левое внешнее. Что это значит? Предположим, у нас есть два набора данных: А и Б. Нам нужно соединить эти наборы по определенному условию и в результате получить 3 поля из набора А, и 1 поле из набора Б.
Пример соединения наборов данных
В результате внешнего левого соединения мы получим все строки из набора А. Из набора Б в результат попадут только те строки, которые соответствуют условию связей этих наборов. Таким образом из левого набора (Набор А) попадут все строки, а из правого (Набор Б) – только некоторые строки.
2. Чем соединение отличается от объединения набора данных?
Между объединением наборов данных и соединением есть большая разница. При объединении наборов данных в итоговую таблицу попадают все записи первого набора и все записи из второго набора данных в СКД. Это можно отобразить на схеме.
Объединение наборов данных
В отличии от Запросов, в объединении наборов данных количество полей может не совпадать. Например, в Наборе А всего 3 поля, а в Наборе Б – 4 поля. Такое объединение корректно отработает.
3. Настройка соединения наборов данных
Настройка связей наборов данных в СКД настраивается на вкладке «Связи наборов данных».
Связи наборов данных
Источник связи – это первый набор данных, из которого будут отобраны все строки. Приемник связи – это второй набор данных, из которого будут присоединены только те строки, которые соответствуют условию связи. Выражение источник и Выражение приемник – это поля наборов данных, по которым будет установлена связь между наборами. В СКД есть возможность передавать параметры из левого набора данных в правый. Параметр – это параметр из второго (правого) набора данных, которому присваивается значение из поля Выражение источник.
Потребность в передаче параметра данных может возникнуть при выводе отчета по продажам за каждый день с конечным остатком на день продажи или отчета о продажах за каждый день с установленной ценой на этот день.
При использовании параметров в связях наборов данных фактически получается, что второй (правый) набор данных формируется в цикле. Для оптимизации в такой ситуации можно установить галочку «Список параметров». В этом случае данные из второго (правого) набор будут получаться порциями по 1000 строк. Благодаря этому можно оптимизировать вывод отчета.
Связи наборов данных в СКД – удобный инструмент, но важно хорошо понимать, в каком случае его использовать. Если у Вас возникли вопросы, будем рады помочь!
Доброго времени суток.
Вступление
1. Подготовка и демонстрация
ВЫБРАТЬ
СпецификацииНоменклатурыВыходныеИзделия.Номенклатура КАК Продукция,
СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Комплектующая,
СРЕДНЕЕ(СпецификацииНоменклатурыИсходныеКомплектующие.Количество / ВЫБОР
КОГДА СпецификацииНоменклатурыВыходныеИзделия.Количество <> 0
ТОГДА СпецификацииНоменклатурыВыходныеИзделия.Количество
ИНАЧЕ 1
КОНЕЦ) КАК КоличествоНа1
ИЗ
Справочник.СпецификацииНоменклатуры.ВыходныеИзделия КАК СпецификацииНоменклатурыВыходныеИзделия
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
ПО СпецификацииНоменклатурыВыходныеИзделия.Ссылка = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка
ГДЕ
СпецификацииНоменклатурыВыходныеИзделия.Ссылка.Активная
И СпецификацииНоменклатурыВыходныеИзделия.Номенклатура В ИЕРАРХИИ(&Номенклатура)
СГРУППИРОВАТЬ ПО
СпецификацииНоменклатурыВыходныеИзделия.Номенклатура,
СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладКомплектующей,
ТоварыНаСкладахОстатки.Номенклатура КАК Комплектующая,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокКомплектующей
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, <(Склад).* КАК СкладОтбора, (Номенклатура).* КАК Комплектующая>) КАК ТоварыНаСкладахОстатки
Ресурсы пока простые: Сумма(КоличествоНа1) и Сумма(ОстатокКомлектующей).
Дальше была идея Склады в колонки, но тогда получается очень широко и почти не заполнено. Ну если одна комплектующая только на одном складе, то по всем остальным пусто. В общем не очень красиво выходит.
Проблема:
Тогда я еще не знал про “замену Левого на Внутреннее, если есть отбор”.
2. Попытка выкрутиться
Но вот беда: в отборе по группировке, среди доступных полей, нет поля “СкладОтбора”:
Хорошо, попробую использовать СкладКомплектующей. Добавил отборы в каждую группировку, но выключенные и стал включать по очереди. Первым включаю у группировки Комплектующая. Результат такой же, как с отбором по отчету целиком. Отключаю.
3. Хотелки и их исполнение.
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладПродукции,
ТоварыНаСкладахОстатки.Номенклатура КАК Продукция,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокПродукции
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, <(Склад).* КАК СкладОтбора, (Номенклатура).* КАК Продукция>) КАК ТоварыНаСкладахОстатки
Ну и добавляем еще одну связь.
Ну и в ресурсах определяем ОстатокПродукции.
Тут на помощь пришла вторая статья Агрегатные функции СКД, о которых мало кто знает. Сначала использовал функцию ТаблицаЗначений. Но при простом повторении формирования отчета строки складов прыгают. Тогда добавил Упорядочить в итоге получилось так:
Для ОстаткаКомплектующих: Упорядочить(ТаблицаЗначений(Различные СкладКомплектующей Как Склад, ОстатокКомплектующей Как Остаток), “Склад Автоупорядочивание”)
Для ОстаткаПродукции: Упорядочить(ТаблицаЗначений(Различные СкладПродукции Как Склад, ОстатокПродукции Как Остаток), “Склад Автоупорядочивание”)
Дальше немного “причесал” структуру: выключил детальные записи, сгруппировал поля, отключил “Общие Итоги по вертикали”.
Теперь влючаю отбор по складу и вижу результат, опять исчезли строки (что в прочем уже ожидаемо):
4. Поиск решения
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладКомплектующей,
СпрНоменклатура.Ссылка КАК Комплектующая,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокКомплектующей
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, ) КАК ТоварыНаСкладахОстатки
ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
<ГДЕ
ТоварыНаСкладахОстатки.Склад.* КАК СкладОтбора>
Дальше экспериментировал с настройками. Работало долго. На каком-то этапе вообще получил от сервера отлуп по памяти. Бросил.
День бодался. На следующий день пошел по второму кугу. Только все создавал с нуля.
5. Решение
И начал снова с Левого соединения в запросе. Получился такой запрос (правильный):
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладКомплектующей,
СпрНоменклатура.Ссылка КАК Комплектующая,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокКомплектующей
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, <(Склад).* КАК СкладОтбора, (Номенклатура).* КАК Комплектующая>) КАК ТоварыНаСкладахОстатки
ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
Сформировал, посмотрел нормальный результат. Включил отбор и увидел это:
Но самым удивительным для меня оказался такой результат (отбор по другому складу и еще одна продукция):
В общем дальше можно пытаться улучшить. Например, если основной запрос не сложный, то в НабореДанных2 связывать не со справочником номенклатуры, а поместить результат основного запроса во временную таблицу и связать с ним.
Конец
Прошу специалистов не смеяться над стилем изложения, я курсов не проходил. Общаюсь в большинстве своем с пользователями, которым надо объяснить понятно что, почему и как. Да и статья это первая, не потому что писать нечего, а потому, что большая часть уже написана Вами и надо только найти :).
Разбор тестирования 1С:Профессионал и PMP
Вопросы по разным конфигурациям 1С и проектному менеджменту
вторник, 27 марта 2018 г.
Наборы данных
Опция используется в случае, если для поля условие отбора необходимо отрабатывать нестандартным образом. Для поля может быть указан набор данных, в котором получаются данные для проверки принадлежности ссылки иерархии некоторого значения.
Правильный ответ четвертый, описание в посте.
Правильный ответ первый, через процессор.
4 комментария:
“Правильный ответ второй, если только один набор (причем источник), то и связывать нечего.”
А если не источник, то есть что связывать?
И опять же “Правильный ответ четвертый, согласно ответов.” царапает глаз.
Не сдержался, прокомментирую 🙂 Конструкция такая “Согласно [существительное в дательном падеже]” (кому? чему?). “Согласно ответам”, соответственно. Родительный падеж в литературной речи отсутствует, только в старых текстах можно встретить. А вообще в самом тесте ТАКОЕ количество ошибок, что волосы дыбом становятся. “Налету” (“на лету”), “договора” (“договоры”), “Что бы” (“чтобы”) и т.д., и т.п. Запятые вообще генератор случайных запятых проставлял. У вас тоже с запятыми много приколов, но в тексте ошибок мало (это похвала, если что 😉 ).
Какие виды соединений двух наборов данных могут быть реализованы в системе компоновки
Войдите как ученик, чтобы получить доступ к материалам школы
Система компоновки данных 1С 8.3 для начинающих: делаем связь наборов данных
Автор уроков и преподаватель школы: Владимир Милькин
Ставим цель
Создаем новый отчет
Открываем базу “Гастроном” в конфигураторе и через главное меню создаём новый отчет:
В форме нового отчёта указываем имя “Урок6” и нажимаем кнопку “Открыть схему компоновки данных”:
Оставляем имя схемы по умолчанию:
Добавляем первый набор данных
Добавился первый набор данных. Напишем запрос.
Вызываем конструктор запроса:
Указываем таблицу “Клиенты” и поля, которые требуется получить из запроса:
Получился такой текст запроса:
Добавляем второй набор данных
Выделяем мышкой пункт “Наборы данных”.
Выделяем его (НаборДанных2) и снова вызываем конструктор запроса:
Указываем таблицу справочника “Еда” и поля, которые требуется получить из запроса:
Получился такой текст запроса:
Обратите внимание, что у нас сейчас в отчёте присутствуют два набора данных: НаборДанных1 и НаборДанных2. У каждого свой текст запроса и свои данные.
Делаем имена более наглядными
Для наглядности, давайте переименуем НаборДанных1 в Клиенты, а НаборДанных2 в Еда.
Сделайте это двойным щелчком по каждому из наборов:
Данные каждого из наборов мы сможем использовать в нашем отчёте. К этим данным мы будем обращаться через поля.
В данный момент у набора “Клиенты” следующие поля: “Наименование” и “ЛюбимыйЦвет”, а у набора “Еда”: “Наименование” и “Цвет”.
Видим, что имена пересекаются и мы легко запутаемся. Поэтому давайте изменим имена полей на более говорящие.
Выделяем набор “Клиенты” и меняем имена полей так:
Затем выделяем набор “Еда” и меняем имена полей так:
Вызываем конструктор настроек
Наконец, переходим на закладку “Настройки” и нажимаем волшебную палочку, чтобы вызвать конструктор настроек:
Выбираем поля для отчета из обоих наборов:
Видите почему так важно было изменить имена полей? На этапе настроек компоновки данных мы не видим из каких наборов эти поля. Видим только их имена.
Проверяем отчёт
Сохраняем отчет и формируем в режиме пользователя:
Ага. Хорошо, но не совсем. Произошло так называемое перекрёстное соединение двух наборов (вам это должно быть хорошо знакомо по соединениям в запросах, которые мы изучали в прошлых модулях). Каждой записи из таблицы “Клиенты” сопоставлена запись из таблицы “Еда”.
Но нам нужно из всех этих записей оставить только те у которых поле “ЛюбимыйЦветКлиента” равно полю “ЦветЕды”:
Осуществляем связь двух наборов данных
Для этого осуществим связь двух наборов данных (Клиенты и Еда) по полям ЛюбимыйЦветКлиента и ЦветЕды.
Переходим на закладку “Связи наборов данных” и нажимаем на кнопку-плюсик, чтобы добавить новую связь:
Настраиваем параметры как на рисунке ниже:
Источник и приёмник связи. Ну тут всё понятно. Указываем первый набор (Клиенты) и второй набор (Еда) данных. Хочу обратить особое внимание, что связь будет осуществляться по принципу внешнего левого соединения (мы его проходили в теме запросов в прошлых модулях). Исходя из этого и нужно выбирать какой набор будет источником, а какой приёмником.
Выражение источник. Указываем здесь выражение или просто поле из набора данных источника (мы здесь указали поле ЛюбимыйЦветКлиента из набора Клиенты).
Выражение приемник. Указываем здесь выражение или просто поле из набора данных приёмника (мы здесь указали поле ЦветЕды из набора Еда).
Таким образом данная связь оставит из прошлого списка только те строки, у которых поле ЛюбимыйЦветКлиента равно полю ЦветЕды.
Сохраним отчёт и запустим в режиме пользователя:
Сделаю пояснение про поле “Условие связи“, об которое так часто бьют свои копья начинающие программисты.
В этом случае для всех строк из источника связи перед осуществлением связи будет проверяться это выражение (условие связи). И если это выражение равно ИСТИНА, то будет предприниматься попытка установить связи этой строки со строками из приемника связи. Если же выражение равно ЛОЖЬ, то таких попыток предприниматься не будет.
Очень просто. Напишем в условии связи выражение ИмяКлиента = “Андрей”:
Сохраним отчёт и сформируем в режиме пользователя:
Войдите на сайт как ученик
Авторизуйтесь, чтобы получить доступ ко всем материалам школы
Прибегайте к изучению эталонного варианта только после самостоятельного выполнения всех шагов.
Войдите как ученик, чтобы получить доступ к материалам школы




























