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

18.08.13

Разработка - СКД

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

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

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

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

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

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

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

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

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

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

 

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122170    670    389    

714

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

3 стартмани

05.02.2024    4041    25    obmailok    17    

63

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8161    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

05.12.2023    4656    PROSTO-1C    13    

61

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5807    15    kalyaka    5    

86

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    6703    accounting_cons    5    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

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

01.09.2023    4520    KVIKS    15    

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

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

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

На рисунке ниже представлен вывод отчета на СКД. Без хитростей.
- программный код не используется вовсе ( не нужно удалять лишние строки как у автора)
- вложенные схемы не нужны
Прикрепленные файлы:
SharlySka; cleaner_it; pbazeliuk; +3 Ответить
14. InformSES 286 13.06.13 13:07 Сейчас в теме
Статья о хитростях СКД, а не об идельном способе решении задачи. Сделать 1 соединение запросом и обработать 1 источник данных куда проще, чем добиться такого результата исключительно средствами СКД.
adhocprog; +1 Ответить
15. Ish_2 1104 13.06.13 13:18 Сейчас в теме
(14) Вот я и говорю. Наиболее просто задача решается исключительно средствами СКД.
Без хитростей , без дополнительного программного кода для удаления лишних строк, без вложенных схем.
16. SpartakM 71 13.06.13 13:30 Сейчас в теме
(15)Можете сюда приложить свое решение, интересно посмотреть...
18. Ish_2 1104 13.06.13 13:39 Сейчас в теме
(16) Автор должен сам найти решение.
20. InformSES 286 13.06.13 13:45 Сейчас в теме
(18) Ish_2, кхм, мне не составляет труда написать запрос для получения тех же самых данных, публикация о возможностях СКД и хитростях использования этих возможностей.
22. Ish_2 1104 13.06.13 13:56 Сейчас в теме
(20) Ну , что ж.
Вы считаете , что Ваше решение "хитро" демонстрирует возможности СКД.
Я считаю , что Ваше решение - ужасно.
На этом и разойдемся.
Дмитрий74Чел; +1 Ответить
17. _Ramzes 125 13.06.13 13:39 Сейчас в теме
Автор Молодец. А я вот так и не добрался до вложенных схем СКД. Т.к. информации по ней и демонстрации использования я не смог нигде найти.
34. webester 26 14.06.13 17:26 Сейчас в теме
(17) у гилева есть бесплатный курс по СКД единственный его минус: он оооочень объемный, материала очень много. Но по содержанию сможете найти где они говорят именно про вложенные схемы и послушать только про них.
19. InformSES 286 13.06.13 13:44 Сейчас в теме
Прикладываю самое лучшее решение по версии авторов задачи. / Взято где-то на форуме. /
Прикрепленные файлы:
Доминикана. Самое лучшее решение.dt
33. Silenser 592 14.06.13 15:48 Сейчас в теме
(19) Приложенное решение - красиво и оптимально. Ваше решение, к сожалению, решением не является, т.к. не соответствует требованиям авторов задачи, которые на рисунке вполне четко нарисовали какую именно таблицу они хотят получить на выходе. Минус ставить не стал, т.к. мало кто использует встроенные схемы и ваше описание может кому-то пригодиться.
Дмитрий74Чел; +1 Ответить
21. DoctorRoza 13.06.13 13:54 Сейчас в теме
Однозначно! + за статью!
23. a-novoselov 1155 13.06.13 14:27 Сейчас в теме
(0) если мне не изменяет память, то в задании было условие "решение должно быть без единой строчки программного кода, только средствами запросов или СКД". Или я ошибаюсь?
24. hasp_x 156 13.06.13 15:15 Сейчас в теме
А мне статья понравилась. Без последнего абзаца может и скачивать бы не стал. Плюсую
25. Chif13 1248 13.06.13 17:55 Сейчас в теме
Не, ну давайте всеми тут решим и выложим всеми эти решения... Мы всеми горды что ее решили... Мы молодцы...
Не ну было ж уже: Проект "Доминикана", решение первой задачи автора _Ramzes
Не ну а что? У меня тоже есть решение данной задачки. Вот Вам рисуночек (заметьте без строчки кода)

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