Проект "Доминикана", решение первой задачи
















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

Добрый день Коллеги.

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

Итак Задача:

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

Регистр сведений

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

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

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

Отчет Таблица расстояний

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

 

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

Скачайте DT файл, создайте новый отчет, в котором постарайтесь решить самостоятельно задачу. Обещаю решение не оставит вас равнодушными.

 

 

Решение задачи:

Создаем текст запроса:

ВЫБРАТЬ
ОстановкиПоМаршруту.Остановка КАК Остановка,
ОстановкиПоМаршруту.РасстояниеОтНачалаМаршрута КАК РасстояниеОтНачалаМаршрута
ПОМЕСТИТЬ ВТМаршрут
{ВЫБРАТЬ
Остановка.*,
РасстояниеОтНачалаМаршрута}
ИЗ
РегистрСведений.ОстановкиПоМаршруту КАК ОстановкиПоМаршруту
ГДЕ
ОстановкиПоМаршруту.Маршрут = &Маршрут
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстановкиПоМаршруту.Остановка КАК Остановка,
СУММА(1) КАК ПорядковыйНомер
ПОМЕСТИТЬ ВТПорядковыеНомера
ИЗ
РегистрСведений.ОстановкиПоМаршруту КАК ОстановкиПоМаршруту
ЛЕВОЕ СОЕДИНЕНИЕ ВТМаршрут КАК ВТМаршрут
ПО (ВЫБОР
КОГДА ОстановкиПоМаршруту.РасстояниеОтНачалаМаршрута >= ВТМаршрут.РасстояниеОтНачалаМаршрута
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ)
ГДЕ
ОстановкиПоМаршруту.Маршрут = &Маршрут

СГРУППИРОВАТЬ ПО
ОстановкиПоМаршруту.Остановка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТПорядковыеНомераДополнительный.Остановка КАК ОстановкаОтправление,
ВТПорядковыеНомераОсновной.Остановка КАК ОстановкаПрибытие
ПОМЕСТИТЬ ВТВозможныеМаршруты
ИЗ
ВТПорядковыеНомера КАК ВТПорядковыеНомераОсновной
ЛЕВОЕ СОЕДИНЕНИЕ ВТПорядковыеНомера КАК ВТПорядковыеНомераДополнительный
ПО ВТПорядковыеНомераОсновной.ПорядковыйНомер > ВТПорядковыеНомераДополнительный.ПорядковыйНомер
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТВозможныеМаршруты.ОстановкаОтправление,
ВТВозможныеМаршруты.ОстановкаПрибытие,
ВТМаршрутТочкаНачала.РасстояниеОтНачалаМаршрута КАК РасстояниеОтНачалаМаршрутаОтправление,
ВТМаршрутТочкаОкончания.РасстояниеОтНачалаМаршрута КАК РасстояниеОтНачалаМаршрутаПрибытие
ПОМЕСТИТЬ ВТРасстояния
ИЗ
ВТВозможныеМаршруты КАК ВТВозможныеМаршруты
ЛЕВОЕ СОЕДИНЕНИЕ ВТМаршрут КАК ВТМаршрутТочкаНачала
ПО ВТВозможныеМаршруты.ОстановкаОтправление = ВТМаршрутТочкаНачала.Остановка
ЛЕВОЕ СОЕДИНЕНИЕ ВТМаршрут КАК ВТМаршрутТочкаОкончания
ПО ВТВозможныеМаршруты.ОстановкаПрибытие = ВТМаршрутТочкаОкончания.Остановка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
ВТПорядковыеНомера.ПорядковыйНомер КАК ПорядковыйНомер,
ВТПорядковыеНомера.Остановка
ПОМЕСТИТЬ ВТПерваяОстановка
ИЗ
ВТПорядковыеНомера КАК ВТПорядковыеНомера

УПОРЯДОЧИТЬ ПО
ПорядковыйНомер
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
ВТПорядковыеНомера.ПорядковыйНомер КАК ПорядковыйНомер,
ВТПорядковыеНомера.Остановка
ПОМЕСТИТЬ ВТПоследняяОстановка
ИЗ
ВТПорядковыеНомера КАК ВТПорядковыеНомера

УПОРЯДОЧИТЬ ПО
ПорядковыйНомер УБЫВ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТРасстояния.ОстановкаОтправление КАК ОстановкаОтправление,
ВТРасстояния.ОстановкаПрибытие КАК ОстановкаПрибытие,
ЕСТЬNULL(ВТРасстояния.РасстояниеОтНачалаМаршрутаПрибытие, 0) — ЕСТЬNULL(ВТРасстояния.РасстояниеОтНачалаМаршрутаОтправление, 0) КАК Расстояние,
ПорядковыйНомерОстОтправление.ПорядковыйНомер КАК ПорядковыйНомерОтправление,
ПорядковыйНомерОстПрибытие.ПорядковыйНомер КАК ПорядковыйНомерПрибытие
{ВЫБРАТЬ
ОстановкаОтправление.*,
ОстановкаПрибытие.*,
Расстояние,
ПорядковыйНомерОтправление,
ПорядковыйНомерПрибытие}
ИЗ
ВТРасстояния КАК ВТРасстояния
ЛЕВОЕ СОЕДИНЕНИЕ ВТПорядковыеНомера КАК ПорядковыйНомерОстОтправление
ПО ВТРасстояния.ОстановкаОтправление = ПорядковыйНомерОстОтправление.Остановка
ЛЕВОЕ СОЕДИНЕНИЕ ВТПорядковыеНомера КАК ПорядковыйНомерОстПрибытие
ПО ВТРасстояния.ОстановкаПрибытие = ПорядковыйНомерОстПрибытие.Остановка
ГДЕ
НЕ ВТРасстояния.ОстановкаОтправление ЕСТЬ NULL

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ВТПерваяОстановка.Остановка,
ВТПерваяОстановка.Остановка,
NULL,
ВТПерваяОстановка.ПорядковыйНомер,
ВТПерваяОстановка.ПорядковыйНомер
ИЗ
ВТПерваяОстановка КАК ВТПерваяОстановка

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ВТПоследняяОстановка.Остановка,
ВТПоследняяОстановка.Остановка,
NULL,
ВТПоследняяОстановка.ПорядковыйНомер,
ВТПоследняяОстановка.ПорядковыйНомер
ИЗ
ВТПоследняяОстановка КАК ВТПоследняяОстановка

 

Далее переходим к корректировке настроек СКД

На Рис. 3

Рис. 3

показано, что мы для полей Остановка отправление, Остановка прибытие и Расстояние мы делаем пустые заголовки. Точнее один пробел. Т.к. пустой указать не удается.

Делаем упорядочивание представления:

Для реквизита ОстановкаОтправление — ПорядковыйНомерОтправление возр

Для реквизита ОстановкаПрибытие — ПорядковыйНомерПрибытие возр

 

Для реквизита Расстояние делаем набор свойств как на рисунке. Рис. 4.

Рис. 4

А именно Размещение — Обрезать.

И минимальная и максимальная ширина равная — 9.12

 

На этом настройка набора данных завершена

Настройка ресурсов:

Рис. 5

Рис. 5

Создаем ресурс — Расстояние

В выражении пишем:

Выбор Когда Представление(ОстановкаОтправление) = Представление(ОстановкаПрибытие) Тогда Представление(ОстановкаОтправление) Иначе  Сумма(Расстояние) Конец

 Рассчитываем по группировкам ОстановкаОтправление, ОстановкаПрибытие.

Макеты:

Рис. 6

Рис.6,

Рис. 7 

Рис. 7

Пожалуй самое сложное было добиться результата.

Были созданы макет для группировки ОстановкаОтправления

Рис. 8

(Рис.  8)

Были созданы макет для группировки ОстановкаПрибытия (Рис.  9)
В качестве области для вывода были выбраны для Группировки Остановка отправления поле шириной — 1
Для группировки Остановка прибытия — максимально минимальное значение, что-то около 0.03
Если посмотрите внимательно на Рис. 7 почти не видно ячейки R4C1.

Настройка параметров:
Рис. 10
Рис. 10
Параметр уже был получен из запроса, я сделал запрет незаполненных значений и использование — всегда.

Настройки вывода отчета.

На

Рис. 11

Рис. 11

показано, что была использована для представления Таблица

Ресурс — Расстояние

Строки — Остановка прибытия

Колонки — Остановка отправления

 

Настраиваем внешний вид

Рис. 12

Рис. 12,

Рис. 13

Рис. 13

Отключаем вывод итогов

Делаем заголовок- Таблица расстояний

Указываем что надо выводить параметры 

 

Заканчиваем настройку.

Делаем условное оформление.

Рис. 14

Рис. 14

Указываем что цвет границы будет белым для всех строк у которых не заполнено расстояние.

И указываем что стиль границы сверху — будет без линии для тех полей, где Расстояние = «»

Рис. 15

Рис. 15

 

Вот собственно и все. В результате у меня получилась:

Рис. 16

Рис. 16

Это мой способ решения. На решение ушло около 3-х часов.

С радостью рассмотрю предложения по упрощению и улучшению данного решения.

72 Comments

  1. anton.fly7

    Мне понравилось!

    Reply
  2. _Ramzes

    Спасибо. получилось самостоятельно решить задачу?

    Reply
  3. baton_pk

    На днях другу помогал решать эту задачку. Как-то у нас гораздо прощё всё это получилось: и запрос без временных таблиц — в одно соединение, и без макетов полей.

    Reply
  4. tango

    прочитал, скачал, сходил покурить.

    уточняющий вопрос:

    Отчет должен быть разработан без программного кода

    настройки схемы СКД не считаются программным кодом?

    пока потратил на покурить, подумалсо, что текстом запроса можно вытащить саму и только табличку регистра, остальное сделать СКД, нет?

    Reply
  5. _Ramzes

    (4) tango, честно, не знаю. Я сделал как мог.

    Reply
  6. tango

    эх, пойду еще покурить. давненько не брал я в руки скд 🙂

    Reply
  7. 0tto

    Имхо, замудрил с решением:

    достаточно соединиться с регистром (сделать декартово произведение)

    далее рассчитать разность между городами — как разность.

    Если разность положительная или равна 0 — оставляем,

    отрицательная — зануляем,

    если равна 0, и города равны то ставим город

    типа такого:

    ВЫБРАТЬ

    ОстановкиПоМаршруту.Остановка,

    ОстановкиПоМаршруту.РасстояниеОтНачалаМаршрута

    ПОМЕСТИТЬ Т

    ИЗ

    РегистрСведений.ОстановкиПоМаршруту КАК ОстановкиПоМаршруту

    ГДЕ

    ОстановкиПоМаршруту.Маршрут = &Маршрут

    ;

    ////////////////////////////////////////////////////////////­////////////////////

    ВЫБРАТЬ

    Т1.Остановка КАК Остановка1,

    Т2.Остановка КАК Остановка2,

    ВЫБОР

    КОГДА Т1.РасстояниеОтНачалаМаршрута — Т2.РасстояниеОтНачалаМаршрута > 0

    ТОГДА Т1.РасстояниеОтНачалаМаршрута — Т2.РасстояниеОтНачалаМаршрута

    КОГДА Т1.РасстояниеОтНачалаМаршрута — Т2.РасстояниеОтНачалаМаршрута < 0

    ТОГДА 0

    КОГДА Т1.РасстояниеОтНачалаМаршрута — Т2.РасстояниеОтНачалаМаршрута = 0

    ТОГДА Т1.Остановка

    КОНЕЦ КАК Расстояние

    ИЗ

    Т КАК Т1,

    Т КАК Т2

    Показать

    Ну и в оформлении ставим если «( Расстояние Равно «0» ИЛИ Остановка1 Равно Остановка2 )» то устанавливаем стиль границы + ограничиваем максимальную ширину для всех столбцов, и отсортировать по расстоянию

    Reply
  8. BorisMor

    Не стал с макетами париться. Все таки тестовое задание.

    Запрос такой:

    ВЫБРАТЬ
    Начальная.Маршрут,
    Начальная.Остановка КАК Остановка,
    Конечная.Остановка КАК ДоОстановки,
    Конечная.РасстояниеОтНачалаМаршрута — Начальная.РасстояниеОтНачалаМаршрута КАК Растояние,
    Начальная.РасстояниеОтНачалаМаршрута КАК РастНач,
    Конечная.РасстояниеОтНачалаМаршрута КАК РастКон,
    Конечная.Остановка КАК СтрДоОстановки
    ИЗ
    РегистрСведений.ОстановкиПоМаршруту КАК Начальная
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОстановкиПоМаршруту КАК Конечная
    ПО (Конечная.РасстояниеОтНачалаМаршрута — Начальная.РасстояниеОтНачалаМаршрута >= 0)
    
    УПОРЯДОЧИТЬ ПО
    РастНач,
    РастКон

    Показать

    Сам отчет http://yadi.sk/d/4CfzXviH4rXcu

    Reply
  9. tango

    да, один раз слева все-таки придется

    вычисляемыми/пользовательскими полями фигня получается хуже алгоритмической обработки

    Reply
  10. tango

    (8) BorisMor,

    ПО Начальная.РасстояниеОтНачалаМаршрута <= Конечная.Остановка

    упс

    Reply
  11. aavolkoff

    Зачем здесь вообще соединения? Результат нужный можно получить прямым запросом к регистру. Можно спорить о том — класть ли во временную таблицу результат запроса к регистру или оптимизатор скулевский (файлово-одинэсовский) сам неплохо справится с кэшированными данными из таблицы.

    Reply
  12. BorisMor

    (10) tango, и правда))

    Reply
  13. pahich

    (11) aavolkoff, и как без соединений решить задачу?

    Reply
  14. _Ramzes

    (11) покажите запрос, скорее всего я такого варианта не встречал еще

    Reply
  15. aavolkoff

    (13)(14)

    Что будет, если одним запросом получить одни и те-же данные из одной из той-же таблицы (регистра), обратившись к ней 2 раза?

    Reply
  16. pahich

    (15) aavolkoff, и что же будет, если к ним обратиться без соединений?

    Reply
  17. tango

    (11) aavolkoff, соединение здесь — самый простой способ решить обратную задачу нарастающего итога

    Reply
  18. aavolkoff

    (17)(16)(13)

    Чем левое соединение проще декартова произведения? В чем заключается «простота»?

    Reply
  19. 0tto

    У меня такое решение

    Reply
  20. mixqn

    (8) BorisMor, у меня приблизительно такое же решение. получил за него 4.

    Reply
  21. pahich

    (20) mixqn, за что балл снизили?

    Reply
  22. mixqn

    (21) pahich, ну так внешний вид не 1 в 1.

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

    оформление я не сделал. вот собственно за это и минус балл.

    Reply
  23. mixqn

    P.S. сам запрос без оформления занял у меня примерно 10-15 минут и выглядит он так:

    ВЫБРАТЬ
    ОстановкиПоМаршруту.Остановка,
    ОстановкиПоМаршруту1.Остановка КАК Остановка1,
    ОстановкиПоМаршруту1.РасстояниеОтНачалаМаршрута — ОстановкиПоМаршруту.РасстояниеОтНачалаМаршрута КАК Расстояние,
    ОстановкиПоМаршруту.РасстояниеОтНачалаМаршрута КАК Порядок
    ИЗ
    РегистрСведений.ОстановкиПоМаршруту КАК ОстановкиПоМаршруту
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОстановкиПоМаршруту КАК ОстановкиПоМаршруту1
    ПО ОстановкиПоМаршруту.Маршрут = ОстановкиПоМаршруту1.Маршрут
    И ОстановкиПоМаршруту.РасстояниеОтНачалаМаршрута <= ОстановкиПоМаршруту1.РасстояниеОтНачалаМаршрута

    Показать

    решение, предложенное в статье и правда сильно мудреное, я пока даже не вникал в суть этого огромного запроса…

    Reply
  24. tango

    (19) 0tto, хи-хи

    Reply
  25. tango

    (22) mixqn, оформление, если рука не набита, сожрет времени больше, чем запрос

    Reply
  26. tango

    (23) mixqn, а отбор по маршруту?

    Reply
  27. mixqn

    (25) tango, согласен, я об этом честно написал в письме, приложенном к решению — мол не делал такого, не знаю, как сделать.

    (26) tango, ну его не долго добавить 🙂 +2 строки в запросе и поле в форме. в приложенной базе всего 1 маршрут, поэтому сработало так.

    Reply
  28. 0tto

    (24) Параметр нужно задать

    Я не знаю на что сдал, но меня пригласили на проект.

    Будет он кстати далеко не в Доминикане:) несмотря на название проекта

    Reply
  29. Программист 1С
    Если будут предложения об ускорении, то с радостью их рассмотрю

    — посмотрите Решение задачи

    Reply
  30. pahich

    (28) 0tto, а где будет проходить? в москве? 🙂

    Reply
  31. 0tto

    (30) pahich, нет в дальнем забугорье 🙂 точное место не пишу, так как если бы организаторы хотели сами написали)

    Reply
  32. tango

    (31) 0tto, а личное можно? как решили коллизию с текущей занятостью? вообще, на что жить собираетесь во время проекта?

    Reply
  33. BorisMor

    (30) pahich, о.Самуи (Тайланд)

    Reply
  34. 0tto

    (32) tango, А кто сказал что я согласился? 🙂 Мне только прислали предложение.

    А так оплата на проекте достаточно нормальная, я бы очень сильно не потерял.

    Reply
  35. BorisMor

    (34) 0tto, да надо соглашаться!

    Надо что бы в жизни было что вспомнить)

    Reply
  36. tango

    (35) BorisMor, не все воспоминания одинаково приятны

    Reply
  37. BorisMor

    (36) tango, если не чума или тайфун то все будет ок.

    Reply
  38. tango

    (37) BorisMor, сильно подозреваю, что организаторы отожмут каждую копеечку — не до экзотики будет

    так что весь позитив, на который стоит рассчитывать — это сам проект.

    но, конечно, интересно

    но — со стороны

    но интересно

    **

    эх, вот бы кто-нибудь выклал здесь договор между фейсами 🙂

    Reply
  39. 0tto

    (38) в отношениях есть оговорка, что организатор вправе снять участника с проекта — если он не справляется с задачами, на этот случай — компенсируется период участия + 1 месяц

    Reply
  40. pahich

    (39) 0tto, компенсируется кем?

    Reply
  41. 0tto

    Организаторами конечно 🙂

    Reply
  42. tango

    (41) 0tto, ну то есть это официальный договор или слово джентльмена?

    Reply
  43. tango

    и дорога домой — она за чей счет в этом случае?

    Reply
  44. 0tto

    Вы очень мнительно относитесь :).

    Орги не скрывают, что вкалывать придется. Условия предложены более чем справедливые.

    Я готов вкалывать если проект мне интересен (впрочем если и не очень интересен :)).

    Смысла заманить в другую страну и под страхом невыезда — заставить разрабатывать прототип, думаю нет.

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

    Reply
  45. Chif13

    О, тоже решала данную задачку, час убила. Задачка реально интересная. Друг прислал, он участвовал в проекте и прошел конкурс. Решила по другому, запрос попроще был, да и красоту наводила. Жаль выложили ответ, хотела тестить на ней кандидатов на место программиста, ибо кандидатов много, а программистов нет.

    Reply
  46. _Ramzes

    Вот такая вот я сволочь. 🙂 Но мне кажется тестировать на ней программистов не стоит. Стоит тестировать на ней разработчиков отчетов. Ибо это только для разработки отчетов, да и то, сколько работал такого никогда не надо. Чем проще отчет, тем лучше. Чем проще запрос, тем лучше. Это я вам как эксперт по тех вопросам говорю.

    Reply
  47. tango

    (44) 0tto, на заре века меня заманили в публичный дом (реально) и что-то пытались выжать по поводу 1с. выходил с милицией (с автоматами).

    вот тогда-то у меня в первый раз слизистая и слетела

    Reply
  48. AlexO

    (45) Chif13,

    Жаль выложили ответ, хотела тестить на ней кандидатов на место программиста, ибо кандидатов много, а программистов нет.

    Найдите грамотного подборщика кадров на 1С.

    Reply
  49. Chif13

    (46) да я то в курсе всего этого. Но блин выбрать программиста оказалось достаточно проблематично. Просто мне предстоит отбор в ближайшем будущем. И как бы более подробно узнать что покупаешь очень бы хотелось ибо работать мне с ним.

    (48) AlexO,

    Кадры все равно не найдут нормального программиста. Я знаю программиста с сертификатами более 10 штук, однако ему приходится объяснять элементарные вещи… И знаю прогера без сертификатов — он напишет грамотно и красиво все что попросишь на 1С. Так что кадры тут не катят…

    Reply
  50. _Ramzes

    (49) Chif13, Извините что вмешиваюсь, но вопрос был не в сертификатах, а в

    Цитирую

    НачалоЦитаты

    Найдите грамотного подборщика кадров на 1С.

    КонецЦитаты

    Сертификаты — показатель что человек хоть немного знает о чем речь. Мне достаточно около часа поговорить с человеком и я с уверенностью могу сказать какой уровень знаний у человека. И его применимость к продуктам 1С.

    А если мериться пиписками, то сертификаты у меня есть, и количество больше 10.

    Могу только посоветовать, заставляйте людей писать код на бумаге.

    Reply
  51. Chif13

    (50) ключевое слово грамотный подборщик кадров… Подбирать буду я, но я боюсь, что мне легче убиться в коде, чем подобрать человека. Опять таки заставить писать код на бумаге может и хорошо, но даже я много так не напишу. Я работаю с Ctrl+пробел, что зашибись удобно. Т.е. синтаксис я наизусь не помню, только основной. Но я б не сказала что я плохой программист (хотя это мое субъективное мнение). У каждого своя специфика работы.

    По мне по наверное легче взять кого то, у кого может быть мало опыта, но который всего добивается сам, у кого есть способность и стремление развиваться. Чем например того кто как то научился делать достаточно сносно и все, дальше не пойдет. Угадать бы… Тут посоветовали взять задачки со специалиста по платформе, надо глянуть…

    Reply
  52. Project Dominikana

    Лучший вариант решения задачки по оценкам команды Проекта Доминикан

    Reply
  53. Ambakollajder

    Решение хорошее, видно, что кто-то на скд собаку съел

    Reply
  54. _Ramzes

    (53) Ambakollajder, Спасибо. Да, я в последнее время на СКД что только не творил с отчетами. Году в 2008 было совсем мало информации по СКД, и было больше вопросов чем ответов. А вот просмотрев курс Гилева по СКД я нашел очень много ответов по построению отчетов на СКД два года назад и понеслось.

    Reply
  55. Rustig

    (0) спасибо за статью: за твой (ваш) труд тебе (вам) плюс.

    Я поставил минус, потому что считаю, что задача некорректно поставлена: неверно запроектирована структура хранения данных и столь мощный инструмент СКД применяется не в тему — «пилить дрова можно шлифмашинкой, и все же для дров есть электропила»…

    Мое мнение — решения задачи: нужно завести регистр сведений, в котором будет храниться информация о том, какое расстояние между остановками, и регистр сведений, который будет хранить порядок остановок друг за другом. Исходя из такой структуры хранения данных возможно решить большинство задач, связанных с остановками, простым способом — простыми алгоритмами. Я никогда не был сторонником решать сложные и не сложные алгоритмические задачи с помощью запросов и ограниченных действий с запросом (объединение, соединение и т.д.)

    Reply
  56. AlexandrIII

    Поучительно ! А вторая задача будет ?

    Reply
  57. _Ramzes

    (55) А минус то мне за что? 🙁 Я к доминикане имел отношение постольку поскольку. Еще и задачу вам решил. А про распил дров микроскопом согласен.

    Reply
  58. _Ramzes

    (56) У меня нет второй задачи. Могу только предложить вариант задачи, который я давал на собеседованиях.

    Reply
  59. Rustig

    (57) исправил. 🙂

    Reply
  60. no_limits

    Интересная задачка

    Reply
  61. krava_vlad

    не просто ее и задачкой назвать, это целое задание (чтобы пошевелить мозгами) 🙂

    Reply
  62. Serj1C

    (58)(56) Второй задачи вроде не было

    Reply
  63. DrongoGOD

    В оформлении есть лишние элементы

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

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

    ВЫБРАТЬ

    ТабСтрок.Остановка КАК ОстановкаСтроки,

    ТабСтолбцов.Остановка КАК ОстановкаСтолбцы,

    ТабСтолбцов.РасстояниеОтНачалаМаршрута — ТабСтрок.РасстояниеОтНачалаМаршрута КАК Расстояние

    ИЗ

    РегистрСведений.ОстановкиПоМаршруту КАК ТабСтрок

    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОстановкиПоМаршруту КАК ТабСтолбцов

    ПО ТабСтрок.Маршрут = ТабСтолбцов.Маршрут

    ГДЕ

    ТабСтрок.Маршрут = &Маршрут

    И ТабСтолбцов.Маршрут = &Маршрут

    И ТабСтолбцов.РасстояниеОтНачалаМаршрута — ТабСтрок.РасстояниеОтНачалаМаршрута >= 0

    Reply
  64. spezc

    на решение задачи — 20 мин. из которых 15 минут ушло на оформление СКД.

    Примитивный запрос и пару штрихов в СКД.

    Результат отчета:

    http://s47.radikal.ru/i116/1306/e5/5982524acaf2.png

    Схема СКД (работает в любой конфе, даже без данных)

    http://zalil.ru/34575137

    Одно только не решено. Для полного соответствия требованиям задачи нужно чтобы еще линии в ячейках с названиями городов слева и сверху отсутствовали. У меня сходу не получилось.

    Reply
  65. romansun

    задача интересная, но тестировать по ней кандидатов себе на работу я б не стал — достаточно специфическая задача

    Reply
  66. _Ramzes

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

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

    Reply
  67. _Ramzes

    (64) spezc, Здорово. Сталкивались с подобными задачами уже?

    Reply
  68. e.kogan

    (52) Project Dominikana, вот за то, что в Текст можно поле компоновки впихнуть — это спасибо автору решения, я не замечала.

    Reply
  69. Ks_83

    Какие-то запросы у вас все сложные. У меня получилось обычной кросс-таблицей.

    ВЫБРАТЬ
    ОстановкиПоМаршруту.Остановка КАК Остановка,
    ОстановкиПоМаршруту1.Остановка КАК Остановка1,
    ОстановкиПоМаршруту.РасстояниеОтНачалаМаршрута,
    ВЫБОР
    КОГДА ОстановкиПоМаршруту1.РасстояниеОтНачалаМаршрута — ОстановкиПоМаршруту.РасстояниеОтНачалаМаршрута = 0
    ТОГДА ОстановкиПоМаршруту1.Остановка.Наименование
    ИНАЧЕ ОстановкиПоМаршруту1.РасстояниеОтНачалаМаршрута — ОстановкиПоМаршруту.РасстояниеОтНачалаМаршрута
    КОНЕЦ КАК Расстояние
    ИЗ
    РегистрСведений.ОстановкиПоМаршруту КАК ОстановкиПоМаршруту,
    РегистрСведений.ОстановкиПоМаршруту КАК ОстановкиПоМаршруту1

    Показать

    Reply
  70. Ish_2

    (69) Конечно. Нужна обычная кросс-таблица ( хотя запрос немного не такой).

    И тогда возможны манипуляции , нереализуемые в приведенных выше решениях.

    http://forum.infostart.ru/forum24/topic87790/message927311/#message927311

    Reply
  71. murat_

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

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

    Учел, что применяется параметр «Маршрут», а не отбор. Нет полей группировок. Нет границ у ячеек остановок, и т.п. по мелочи.

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

    Дальше также тип группировки «Таблица», сортировка строк и колонок по возрастанию.

    Больше всего времени потратил на оформление отчета. Ненужные границы ячеек скрыл условным оформлением. Поля группировок строк удалось скрыть только установкой максимальной ширины -1 (значение 0 СКД не принимает). При этом отчет съехал влево, пришлось у первой колонки сделать дополнительный отступ. У группировки колонок СКД не дает установить максимальную высоту -1, поставил 1 (значение 0 СКД также не принимает), группировка превратились в жирную линию — просто убрал границы ячеек.

    Задание делал на платформе 8.3.10.2299. Заметил два момента:

    1) Скрыть название автозаголовков полей пробелом уже не получится. Платформа упорно сбрасывает наименование из незначащих символов в название по умолчанию. Как минимум можно назвать в виде «.», «/», «_», «|» и т.д.

    2) Оформить заголовки полей группировок пустыми макетами тоже уже не получается.

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

    Выложенное в (52) «самое лучшее решение» действительно более изящно в плане оформления отчета СКД.

    Для меня также было не очевидным возможность установки поля компоновки в текст оформления.

    Reply
  72. seperblunt2

    Reply

Leave a Comment

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