gifts2017

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

Опубликовал Jack Smith (InformSES) в раздел Программирование - Практика программирования

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

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

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

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

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

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

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

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

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Скачать файлы

Наименование Файл Версия Размер
Выгрузка информационной базы с решением тестового задания 92
.dt 124,96Kb
11.06.13
92
.dt 124,96Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Михаил Ражиков (tango) 12.06.13 18:12
почему минус: автор сначала излил жидкость на участнегов темы, где это все было обсосано до последних косточек;
потом долго парил моск всякой фигней; потом сказал, что больше не будет, потому что дальше осталась всякая фигня; потом оказалось, что задачу так и не решил, поскольку надо еще кодом подработать выход...

ничего личного, каждый 1снег зачем-нибудь нужен
Yakud3a; wowik; Stim213; wunderland; cleaner_it; AlexO; Chif13; baton_pk; e.kogan; +9 1 Ответить
2. Jack Smith (InformSES) 12.06.13 18:17
Основное условие задачи: "Требуется разработать отчет на СКД, который покажет расстояние между двумя остановками по маршруту." В каком месте задача не решена?
3. Михаил Ражиков (tango) 12.06.13 18:23
(2) InformSES, последний скрин: табличка не соответствует, и
остаются промежутки, и убрать их можно только программным кодом
- это именно задача не решена
4. Jack Smith (InformSES) 12.06.13 18:28
Табличка не соответствует условию задачи или скриншоту в задаче, данному для примера?
В задаче вот, что написано:
Отчет представляет собой прямоугольный треугольник, на гипотенузе названия остановок по порядку. На пересечении горизонтальной и вертикальной линии от двух остановок заполнено значение, равное расстоянию между этими остановками.

и этому отчет соответствует. Если нет - прошу прокомментировать, чему именно не соответствует отчет по условиям задачи?
5. Михаил Ражиков (tango) 12.06.13 18:40
(4) InformSES, молодой человек, в (3) приведена цитата из вашей собственной публикации.
6. Jack Smith (InformSES) 12.06.13 18:51
Все верно, промежутки остаются, но нигде не говорится, что их не должно быть. Объективно нас тут рассудят только постановщики задачи, если доберутся до этой публикации.
Между прочим и публикация называется "Хитрости системы компоновки данных...", а не "Самое лучшее решение...".
P.S. Скоро сделаю воронку средствами 1С, правда не такую страшненькую как у Вас, но все же готовьте минусы для следующей публикации :).
7. Михаил Ражиков (tango) 12.06.13 18:57
(6) InformSES, ага, ужос н..., какая страшная. все пропало :(
8. Jack Smith (InformSES) 12.06.13 19:03
По сравнению с воронкой из аксапты, да, смотреть страшно. А другую видимо Вы сделать не в силах.
ничего личного, каждый 1снег зачем-нибудь нужен
9. Сергей Ожерельев (Поручик) 12.06.13 21:40
(8) Не обращай внимания, ему только желчь излить.
10. Сергей Ожерельев (Поручик) 12.06.13 21:42
11. Михаил Ражиков (tango) 12.06.13 22:06
гм... да вы тут не на шутку разошлись пофлудить...
ладно, слушайте сюда
1. это была - воронка
2. это была первая воронка штатными средствами 1с, все что было до меня - представлено в статье Elisy
12. Игорь Иванов (paybaseme) 13.06.13 11:02
Спасибо. Интересно показан ход мысли!
13. Игорь Исхаков (Ish_2) 13.06.13 13:02
(0) Представленное решение - ужасно.

На рисунке ниже представлен вывод отчета на СКД. Без хитростей.
- программный код не используется вовсе ( не нужно удалять лишние строки как у автора)
- вложенные схемы не нужны
Прикрепленные файлы:
SharlySka; cleaner_it; pbazeliuk; +3 Ответить
14. Jack Smith (InformSES) 13.06.13 13:07
Статья о хитростях СКД, а не об идельном способе решении задачи. Сделать 1 соединение запросом и обработать 1 источник данных куда проще, чем добиться такого результата исключительно средствами СКД.
15. Игорь Исхаков (Ish_2) 13.06.13 13:18
(14) Вот я и говорю. Наиболее просто задача решается исключительно средствами СКД.
Без хитростей , без дополнительного программного кода для удаления лишних строк, без вложенных схем.
16. Жека Moscow (SpartakM) 13.06.13 13:30
(15)Можете сюда приложить свое решение, интересно посмотреть...
17. Роман Гаманец (_Ramzes) 13.06.13 13:39
Автор Молодец. А я вот так и не добрался до вложенных схем СКД. Т.к. информации по ней и демонстрации использования я не смог нигде найти.
18. Игорь Исхаков (Ish_2) 13.06.13 13:39
(16) Автор должен сам найти решение.
19. Jack Smith (InformSES) 13.06.13 13:44
Прикладываю самое лучшее решение по версии авторов задачи. / Взято где-то на форуме. /
Прикрепленные файлы:
Доминикана. Самое лучшее решение.dt
20. Jack Smith (InformSES) 13.06.13 13:45
(18) Ish_2, кхм, мне не составляет труда написать запрос для получения тех же самых данных, публикация о возможностях СКД и хитростях использования этих возможностей.
21. Алексей Роза (DoctorRoza) 13.06.13 13:54
22. Игорь Исхаков (Ish_2) 13.06.13 13:56
(20) Ну , что ж.
Вы считаете , что Ваше решение "хитро" демонстрирует возможности СКД.
Я считаю , что Ваше решение - ужасно.
На этом и разойдемся.
23. Алексей Новоселов (a-novoselov) 13.06.13 14:27
(0) если мне не изменяет память, то в задании было условие "решение должно быть без единой строчки программного кода, только средствами запросов или СКД". Или я ошибаюсь?
24. hasp_x 13.06.13 15:15
А мне статья понравилась. Без последнего абзаца может и скачивать бы не стал. Плюсую
25. Виктория Коршанова (Chif13) 13.06.13 17:55
Не, ну давайте всеми тут решим и выложим всеми эти решения... Мы всеми горды что ее решили... Мы молодцы...
Не ну было ж уже: Проект "Доминикана", решение первой задачи автора _Ramzes
Не ну а что? У меня тоже есть решение данной задачки. Вот Вам рисуночек (заметьте без строчки кода)

Если уж так, то откройте форум на обсуждение решения данной задачки чтоль.
Хотя может я просто злая, мелкое ГЫ...
26. Жека Moscow (SpartakM) 13.06.13 18:16
(25) Chif13, приложи сюда выгрузку базы с решением
27. Walter (WalterMort) 13.06.13 20:21
Только один вопрос.
Накой нужна таблица расстояний?
adhocprog; +1 Ответить
29. Виктория Коршанова (Chif13) 13.06.13 23:07
(26) SpartakM, вот мое решение:
Задача_ОстановкиПоМаршруту_Ответ.dt
Выбираем варианте отчета "Основной вариант с выбранным маршрутом" и нажимаем кнопочку сформировать ))))
Как то так.
А данная статья мне не понравилась, решение задачи не соответствует поставленной задаче. Ну эт нормально, у нас большинство так и программирует. Минус не ставлю, все таки старания должны учитываться. Например, решение _Ramzes мне нравится больше, хоть запрос и построен не рационально, но результат то что просил заказчик.
Блин, я опять злая, да?
slax; dddxddd; gluker; baobingo; +4 Ответить 2
30. Жека Moscow (SpartakM) 13.06.13 23:53
(29) Chif13, мое мнение - статья хороша не решением задачи, о чем автор явно указал, а о различных возможностях СКД, и судя по комментариям - не все знали такие особенности.
поэтому - не стоит подходить именно как к решению задачи...
Spacer; adhocprog; +2 Ответить 1
31. Виктория Коршанова (Chif13) 14.06.13 09:14
(30) SpartakM, может быть... Тогда не удачно подобранный пример, надо было б оформлять по другому статью... Поставлена задача, результата не достигнуто. Большой минус.
32. Жека Moscow (SpartakM) 14.06.13 09:30
(31) Chif13, вот тут сложно не согласиться)))
33. Алексей Соловьев (Silenser) 14.06.13 15:48
(19) InformSES, Приложенное решение - красиво и оптимально. Ваше решение, к сожалению, решением не является, т.к. не соответствует требованиям авторов задачи, которые на рисунке вполне четко нарисовали какую именно таблицу они хотят получить на выходе. Минус ставить не стал, т.к. мало кто использует встроенные схемы и ваше описание может кому-то пригодиться.
34. Роман Ложкин (webester) 14.06.13 17:26
(17) у гилева есть бесплатный курс по СКД единственный его минус: он оооочень объемный, материала очень много. Но по содержанию сможете найти где они говорят именно про вложенные схемы и послушать только про них.
35. Игорь Исхаков (Ish_2) 15.06.13 14:23
(32),(23),(33),(28),(29),(17) Мне кажется , скучновата задачка - скучноваты решения.
Буду рад , если кого-то развеселит - "вращение" отчета по часовой стрелке.
Попробуйте на досуге . В условие задачи добавляется один параметр : ВариантОтчета.
Далее смотри ниже.
Прикрепленные файлы:
w-divin; Puk2; +2 Ответить
36. Игорь Исхаков (Ish_2) 15.06.13 19:03
Ну , и для полноты картины варианты 5,6,7,8.
См.Ниже.
Прикрепленные файлы:
37. Алексей Кубовцов (aleksey.kubovtsov) 18.06.13 17:46
спасибо автору за решение, если кто - то считает решение не совсем корректным, поделились бы лучше опытом. я не смог решить данную задачу, не являюсь программистом . любое решение интересно
38. Vladimir A (wowik) 19.06.13 10:53
Что такое, минус нельзя поставить, а плюс можно. Верните мой голос обратно.
39. Владимир Гусев (adhocprog) 21.08.13 14:56
(0) поддержу автора за желание поделиться знаниями с другими.