Хитрости системы компоновки данных на примере решения тестового задания проекта "Доминикана"

Недавно мне встретилось тестовое задание проекта "Доминикана", а также выложенные решения, которые показались мне слишком тривиальными, поэтому было решено сделать тестовое задание, используя минимум возможностей языка запросов и максимум возможностей СКД. О том как это было и пойдет речь в данной публицации. В публикации опишем лишь основные моменты, которые будут нам полезны в будущем, сами настройки подробно рассматривать не будем, для этого есть специлизированные курсы :).

Итак, перед нами стоит следующая задача:

Есть регистр сведений «Остановки по маршруту» в котором хранится информация о расстоянии от начальной до конечной остановки.

Рис. №1 Регистр сведений «Остановки по маршруту».

Требуется разработать отчет на СКД, который покажет расстояние между двумя остановками по маршруту.

Отчет представляет собой прямоугольный треугольник, на гипотенузе названия остановок по порядку. На пересечении горизонтальной и вертикальной линии от двух остановок заполнено значение, равное расстоянию между этими остановками. Например, расстояние между «Борок» и «Мологино» 6,3 км (Рисунок №2).

Важно: Отчет должен быть разработан без программного кода при помощи набора данных – Запрос. Текст запроса должен быть один.

Рис. №2 Отчет «Таблица расстояний».

Решение

1. Самым важным был первый шаг, в ходе долгих мучений и экспериментов, было принято решение использовать вложенные схемы компоновки данных. Зачем это необходимо? Все очень просто, для того, чтобы была возможность соединения идентичных данных между собой. Ведь, если мы используем 1 схему, система компоновки данных понимает, что обращение идет к одной и той же таблице и не дает нам представить эти данные в виде кросс-таблицы. Т.е. даже если мы создадим таблицу колонками и строками, которой будут идентичные данные из 1 источника, мы не сможем заполнить ресурсы, которые у нас будут располагаться ниже или выше диагонали (при этом, на диагонале будут расположены ресурсы с расстояниями до пункта назначения, т.е. данные мы сможем вывести только на пересечении одинаковых остановок, что нас не очень устраивает).

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

Итак, сделаем схему компоновки данных с набором данных Запрос:

Сразу создадим элемент отбора «Маршрут» в родительской схеме, как того требует задание:

После чего к получившейся схеме добавим вложенную схему с таким же набором данных, назовем ее «ПредыдущиеОстановкиПоМаршруту». Во вложенной схеме при этом не делаем никаких настроек (потому что родительская схема все равно будет отдельно хранить свои настройки для вложенной схемы). Теперь мы можем приступить к склейке этих наборов средствами СКД.

2. Настраиваем группировки в родительской схеме компоновки данных, в верхней группировке добавляем 2 группировочных поля «Маршрут» и «Остановка» («Маршрут» нам необходим для того, чтобы была возможность накладывать отборы на вложенную схему по этому полю):

На выходе получаем отчет вида:

Видим, что для каждой остановки родительской схемы у нас существует связанный набор всех остановок. Соединение 2-х наборов средствами СКД мы уже получили, теперь остается самое интересное…

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

Так же настроим сортировку по расстоянию для родительской схемы (это необходимо для того, чтобы остановки шли в порядке следования, соответственно и для корректного отображения отчета):

И не забываем упорядочить колонки вложенного отчета по возрастанию расстояния от начала маршрута:

Получаем отчет вида:

Видим, что наш прямоугольный треугольник уже начинает быть похожим на истину 🙂

Теперь нам необходимо рассчитать расстояние, которое будет выводиться во вложенном отчете.

4. Создаем во вложенной схеме компоновки данных вычисляемое поле:

Это поле работает следующим образом: сначала получаем расстояние до последней точки маршрута (при этом учтем, что последней точкой маршрута с учетом наложенных отборов на вложенную схему будет являться остановка, расположенная на диагонали, остановка из верхней группировки родительской схемы), далее мы берем разницу между значением этого поля и расстоянием от начала маршрута для каждой из наших остановок, присутствующих во вложенной схеме и получаем искомое значение, которое мы будем выводить в отчет. Не забываем добавить созданное вычисляемое поле на вкладку «Ресурсы» вложенной схемы.

В итоге у нас получается вот, что:

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

После манипуляций отчет имеет следующий вид:

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

В общем, осваивайте СКД и ее новые функции, они позволят вам делать самые сложные невообразимые отчеты, и скоро вы сможете получать удовольствие от использования СКД.

© senior-soft.ru Все права защищены. 

38 Comments

  1. tango

    почему минус: автор сначала излил жидкость на участнегов темы, где это все было обсосано до последних косточек;

    потом долго парил моск всякой фигней; потом сказал, что больше не будет, потому что дальше осталась всякая фигня; потом оказалось, что задачу так и не решил, поскольку надо еще кодом подработать выход…

    ничего личного, каждый 1снег зачем-нибудь нужен

    Reply
  2. InformSES

    Основное условие задачи: «Требуется разработать отчет на СКД, который покажет расстояние между двумя остановками по маршруту.» В каком месте задача не решена?

    Reply
  3. tango

    (2) последний скрин: табличка не соответствует, и

    остаются промежутки, и убрать их можно только программным кодом

    — это именно задача не решена

    Reply
  4. InformSES

    Табличка не соответствует условию задачи или скриншоту в задаче, данному для примера?

    В задаче вот, что написано:

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

    и этому отчет соответствует. Если нет — прошу прокомментировать, чему именно не соответствует отчет по условиям задачи?

    Reply
  5. tango

    (4) молодой человек, в (3) приведена цитата из вашей собственной публикации.

    Reply
  6. InformSES

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

    Между прочим и публикация называется «Хитрости системы компоновки данных…», а не «Самое лучшее решение…».

    P.S. Скоро сделаю воронку средствами 1С, правда не такую страшненькую как у Вас, но все же готовьте минусы для следующей публикации :).

    Reply
  7. tango

    (6) ага, ужос н…, какая страшная. все пропало 🙁

    Reply
  8. InformSES

    По сравнению с воронкой из аксапты, да, смотреть страшно. А другую видимо Вы сделать не в силах.

    ничего личного, каждый 1снег зачем-нибудь нужен
    Reply
  9. Поручик

    (8) Не обращай внимания, ему только желчь излить.

    Reply
  10. Поручик

    (7) Сделай что получше.

    Reply
  11. tango

    гм… да вы тут не на шутку разошлись пофлудить…

    ладно, слушайте сюда

    1. это была — воронка

    2. это была первая воронка штатными средствами 1с, все что было до меня — представлено в статье Elisy

    Reply
  12. paybaseme

    Спасибо. Интересно показан ход мысли!

    Reply
  13. Ish_2

    (0) Представленное решение — ужасно.

    На рисунке ниже представлен вывод отчета на СКД. Без хитростей.

    — программный код не используется вовсе ( не нужно удалять лишние строки как у автора)

    — вложенные схемы не нужны

    Reply
  14. InformSES

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

    Reply
  15. Ish_2

    (14) Вот я и говорю. Наиболее просто задача решается исключительно средствами СКД.

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

    Reply
  16. SpartakM

    (15)Можете сюда приложить свое решение, интересно посмотреть…

    Reply
  17. Ish_2

    (16) Автор должен сам найти решение.

    Reply
  18. _Ramzes

    Автор Молодец. А я вот так и не добрался до вложенных схем СКД. Т.к. информации по ней и демонстрации использования я не смог нигде найти.

    Reply
  19. InformSES

    Прикладываю самое лучшее решение по версии авторов задачи. / Взято где-то на форуме. /

    Reply
  20. InformSES

    (18) Ish_2, кхм, мне не составляет труда написать запрос для получения тех же самых данных, публикация о возможностях СКД и хитростях использования этих возможностей.

    Reply
  21. DoctorRoza

    Однозначно! + за статью!

    Reply
  22. Ish_2

    (20) Ну , что ж.

    Вы считаете , что Ваше решение «хитро» демонстрирует возможности СКД.

    Я считаю , что Ваше решение — ужасно.

    На этом и разойдемся.

    Reply
  23. a-novoselov

    (0) если мне не изменяет память, то в задании было условие «решение должно быть без единой строчки программного кода, только средствами запросов или СКД». Или я ошибаюсь?

    Reply
  24. hasp_x

    А мне статья понравилась. Без последнего абзаца может и скачивать бы не стал. Плюсую

    Reply
  25. Chif13

    Не, ну давайте всеми тут решим и выложим всеми эти решения… Мы всеми горды что ее решили… Мы молодцы…

    Не ну было ж уже: Проект «Доминикана», решение первой задачи автора _Ramzes

    Не ну а что? У меня тоже есть решение данной задачки. Вот Вам рисуночек (заметьте без строчки кода)



    Если уж так, то откройте форум на обсуждение решения данной задачки чтоль.

    Хотя может я просто злая, мелкое ГЫ…

    Reply
  26. SpartakM

    (25) Chif13, приложи сюда выгрузку базы с решением

    Reply
  27. WalterMort

    Только один вопрос.

    Накой нужна таблица расстояний?

    Reply
  28. Chif13

    (26) SpartakM, вот мое решение:

    Задача_ОстановкиПоМаршруту_Ответ.dt

    Выбираем варианте отчета «Основной вариант с выбранным маршрутом» и нажимаем кнопочку сформировать ))))

    Как то так.

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

    Блин, я опять злая, да?

    Reply
  29. SpartakM

    (29) Chif13, мое мнение — статья хороша не решением задачи, о чем автор явно указал, а о различных возможностях СКД, и судя по комментариям — не все знали такие особенности.

    поэтому — не стоит подходить именно как к решению задачи…

    Reply
  30. Chif13

    (30) SpartakM, может быть… Тогда не удачно подобранный пример, надо было б оформлять по другому статью… Поставлена задача, результата не достигнуто. Большой минус.

    Reply
  31. SpartakM

    (31) Chif13, вот тут сложно не согласиться)))

    Reply
  32. Silenser

    (19) Приложенное решение — красиво и оптимально. Ваше решение, к сожалению, решением не является, т.к. не соответствует требованиям авторов задачи, которые на рисунке вполне четко нарисовали какую именно таблицу они хотят получить на выходе. Минус ставить не стал, т.к. мало кто использует встроенные схемы и ваше описание может кому-то пригодиться.

    Reply
  33. webester

    (17) у гилева есть бесплатный курс по СКД единственный его минус: он оооочень объемный, материала очень много. Но по содержанию сможете найти где они говорят именно про вложенные схемы и послушать только про них.

    Reply
  34. Ish_2

    (32),(23),(33),(28),(29),(17) Мне кажется , скучновата задачка — скучноваты решения.

    Буду рад , если кого-то развеселит — «вращение» отчета по часовой стрелке.

    Попробуйте на досуге . В условие задачи добавляется один параметр : ВариантОтчета.

    Далее смотри ниже.

    Reply
  35. Ish_2

    Ну , и для полноты картины варианты 5,6,7,8.

    См.Ниже.

    Reply
  36. aleksey.kubovtsov

    спасибо автору за решение, если кто — то считает решение не совсем корректным, поделились бы лучше опытом. я не смог решить данную задачу, не являюсь программистом . любое решение интересно

    Reply
  37. wowik

    Что такое, минус нельзя поставить, а плюс можно. Верните мой голос обратно.

    Reply
  38. adhocprog

    (0) поддержу автора за желание поделиться знаниями с другими.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *