Имя: Пароль:
1C
1С v8
Не могу придумать запрос...
,
0 live in sky dreams
 
26.12.16
08:47
Уверен, задача давно избита, но не могу найти хоть примерно реализацию, чтобы подсмотреть. Может тут подскажут..

Есть иерархический справочник, номенклатура.


Группа_1__________________|__2__
__Подгруппа_1_____________|__6__
_____Подподгруппа_1_______|_____
____________Элемент_1_____|__12_
____________Элемент_2_____|_____
_____Подподгруппа_2_______|__14_
____________Элемент_3_____|__8__
____________Элемент_4_____|_____
Группа_2__________________|_____
__Подгруппа_2_____________|_____
_____Подподгруппа_3_______|_____
____________Элемент_5_____|_____

Первый столбец - собственно номенклатура, второй столбец - порядок номенклатуры в конечном итоге.
Все подчиненные элементы группы (Например "Подподгруппа_1","Элемент_2", "Элемент_4") с заданным порядком ("Подгруппа_1", "Подгруппа_2") должны иметь порядок равный порядку родительской группы (6, 14), если таковой задан, за исключением номенклатуры, для которой задан свой порядок ("Элемент_1", "Элемент_3").

На выходе из исходной хочу такую таблицу:

Группа_1__________________|__2__
__Подгруппа_1_____________|__6__
_____Подподгруппа_1_______|__6__
____________Элемент_1_____|__12_
____________Элемент_2_____|__6__
_____Подподгруппа_2_______|__14_
____________Элемент_3_____|__8__
____________Элемент_4_____|__14_
Группа_2__________________|_999_
__Подгруппа_2_____________|_999_
_____Подподгруппа_3_______|_999_
____________Элемент_5_____|_999_

Как построить запрос?
1 Мимохожий Однако
 
26.12.16
08:52
А надо именно запросом? Другие средства не приемлимы?
2 butterbean
 
26.12.16
08:57
если я правильно понял задачу, то нужно выводить сначала иерархию без элементов, а потом ниже уровнем - только элементы, и соответственно два поля упорядочивания
3 live in sky dreams
 
26.12.16
09:07
Именно запросом, потому как итоговые данные необходимо потом сунуть в ВТ_для джойна в другом запросе.
Это вывод прайса, клиент попросил задавать порядок номенклатуры в прайсе.
Можно конечно данные обработать сперва не в запросе, а затем сунуть ТЗ в ВТ, но я даже не подумываю об этом, так как позиций номенклатуры - тысячи и для каждой делать множественные запросы в бд - убийство времени..4Оптимальнее всего запрос
4 live in sky dreams
 
26.12.16
09:08
(2)эммм... не совсем понял, но скорее всего нет..
5 FIXXXL
 
26.12.16
09:09
(3) сделай иерархию запросом с твоими порядками, обойди циклом, потом в ВТ и запрос окончательный
6 wertyu
 
26.12.16
09:15
(0) а почему элемент 1 идёт раньше элемент 2 ?
7 Мимохожий Однако
 
26.12.16
09:19
Может быть, сделать обработку справочника, чтобы не было пустых значений в колонке Порядок. А потом по нему запрос и сделать.
8 live in sky dreams
 
26.12.16
09:19
(5) держу как запасной вариант..

(6) Потому как я представил в данной визуализации структуру справочника и соответствие значения порядка элементам.
Это не результат запроса или что-либо в этом роде.
9 live in sky dreams
 
26.12.16
09:21
(7) тогда "порядок" придется обслуживать обработкой (для новых элементов справочника номенклатура).
Так же писать код обработчиков при смене родителя (ПриЗаписи), и т.д.и т.п.
Не совсем верно...
10 live in sky dreams
 
26.12.16
09:22
Сейчас порядок номенклатуры хранится в очень простеньком РС.
Ключи: Номенклатура
Значение: Порядок
11 Мимохожий Однако
 
26.12.16
09:23
(9) В таком случае режим "обслуживания" придётся реализовывать при каждом запросе.
12 live in sky dreams
 
26.12.16
09:24
Можно было бы сделать аналогию срезу последних, только не по датам, а по значению поля "Уровень", но..... Нет в запросах Уровня :( А даже если бы и был - один фиг это сильно бы тормозило, потому как узнать уровень кроме как родитель.родитель.родитель не представляется возможным :(
13 live in sky dreams
 
26.12.16
09:25
(11)Ваша правда, от части...
14 FIXXXL
 
26.12.16
09:26
вообще то задача несколько бредово выглядит, т.к. пользователь может превратить отчет в кашу

ну а по сути: быстрый отчет = хранение данных в базе
динамические расчеты - тормоза
15 Мимохожий Однако
 
26.12.16
09:28
Помнится в 77у справочника было свойство ПолныйКод(). Нечто аналогичное можно реализовать в регистре сведений, имя вторым ресурсом аналогичную последовательность.
А обработку обслуживания можно запускать периодически регламентным заданием, чтобы не писать в события.
16 wertyu
 
26.12.16
09:29
(8) у него порядковый номер больше, должен быть после
17 live in sky dreams
 
26.12.16
09:33
(14)им и нужна своя, настроенная "каша"..

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

Хотя.. этот костыль наиболее гладко решает задачу..
Прицеплюсь ка я к подписке ПриЗаписи... И обработкой единожды задам порядок. А далее при записи система будет этот порядок, или кашу, кому как больше нравится, поддерживать сама..

(16) в примере иерархия представлена в порядке справочника. Там еще ничего не сортировалось по полю "порядок"
18 live in sky dreams
 
26.12.16
09:34
Главное обработать правильно все варианты (Пустой родитель, у родителей всех уровней нет порядка, записывается новый элемент в корень и т.д.)
19 wertyu
 
26.12.16
09:36
(17) а если есть две или больше группы нулевого уровня, которых нет в регистре, у них у всех 999?
20 Мимохожий Однако
 
26.12.16
09:37
А каким образом заполняется регистр сведений для упорядочивания? Руками или обработкой?
21 live in sky dreams
 
26.12.16
09:38
(19)Да.. У них да, у подчиненных элементов тоже да, если не задан порядок индивидуально
22 live in sky dreams
 
26.12.16
09:38
(20) обработкой. Пользователь набивает в него группы, подгруппы, сортирует стрелочками, жмакает "записать"
23 live in sky dreams
 
26.12.16
09:39
Оппаа
24 wertyu
 
26.12.16
09:39
(21) а вложенность справочника какая?
25 live in sky dreams
 
26.12.16
09:39
Вот точно одна голова хорошо, а много - змей горыныч..
26 live in sky dreams
 
26.12.16
09:40
Не имеет смысла задавать порядок у подгрупп и элементов. И задачи такой не озвучивалось.. Уточню у заказчика.. Похоже это я уже выдумал "на все случаи жизни"
27 Мимохожий Однако
 
26.12.16
09:40
(22) В эту обработку и запихни пересчет порядка.
28 live in sky dreams
 
26.12.16
09:42
(27) Лучше "при записи", потому как если только обработкой - то гонять ее нужно будет после каждой записи номенклатуры (новой старой - пофиг). Только это будет происодить не автоматом как через подписки а в ручном режиме или регламентном задании, что больше путаницы создаст пользователям
29 wertyu
 
26.12.16
09:43
(27) да ладно, если в лоб, то это запрос с УровеньИерархииСправочика - 1 временными таблицами
30 Мимохожий Однако
 
26.12.16
09:46
(28) Хозяин - барин. Но я сторонник минимализма. Пока пользователь вводит изменения в регистр сведений, он вряд ли будет формировать прайс. Поэтому сразу использовать подписку при записи - это с большим запасом. Но если ты уже эту подписку внедрил раньше, то конечно.
31 live in sky dreams
 
26.12.16
10:00
(30) Да, он не будет в 2 копиях программы одновременно вводить порядок и тут же во втором формировать прайс. По этому последовательность действий вполне допустима, но... Дело не только в последовательности, но и в перемещении номенклатуры из группы в группу. И в создании новой номенклатуры.
Если пользователь создал номенклатуру, внес ее в группу, ему придется не забывать попросить ответственного перезаписать значения порядка обработкой.
Как результат
1) человеческий фактор забывчивости\"забивчивости"
2) увеличение стоимости обслуживания данных в человеко-часах (если угодно - в человеко-минутах). Смысл..? Тут уже само решение (подход) будет похоже на костыль. А если таких доработок будет много - пользователям много чего придется держать в голове, что не есть гут..

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