Имя: Пароль:
1C
1С v8
Своя иерархия в СКД
0 Jokero
 
04.08.16
08:32
Делаю дерево спецификаций. Разузлование делаю циклом, в итоге получаю таблицу вида:
Номенклатура - Владелец - ...
Где номенклатура  - сырье из спецификации, а владелец - это полуфабрикат.
(На верхнем уровне для готовой продукции соответственно владелец пустой)

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

Как бы так указать СКД для какого продукта идет сырье и полуфабрикаты, что бы она не дублировала их?
1 Jokero
 
04.08.16
14:56
Все оказалось просто. Нужно было связывать не по ссылкам, которые могут повторяться в разных продуктах, а по индексам строк. Тоесть, использовать не ТЗ, а ТЧ. а у владельца указывать НомерСтрокиВладельца и так связывать.
2 aleks_default
 
04.08.16
15:05
Индексы тоже могут совпадать. Добавь еще одно поле - ссылку на ГП (передавать как параметр) и в связи сомой с собой добавить еще одну связь по ГП.
3 aleks_default
 
04.08.16
15:08
Хотя в СКД это не получится. Ерунду сказал
4 Jokero
 
04.08.16
15:15
(2) Индекс это типо номер строки в ТЧ. У одинаковых полуфабрикатов в разных ГП не может быть одинакового владельца номера строки.
Ссылку на ГП я тоже добавил, я ее использую, что бы зацикленность спецификаций обрабатывать.
5 ovrfox
 
04.08.16
15:18
(4) Как ты решил вопрос зацикленности? Как проверяешь, что цикла нет?
6 Jokero
 
04.08.16
15:41
(5) Если в пределах ГП встречается строка у которой уже есть такой разузлованный полуфабрикат с таким владельцем, то эту номенклатуру не разузловываю дальше и пишу юзверю, что возможно зацикленность.

Отбор = новый Структура;
        Отбор.Вставить("Номенклатура", ТекЭлемент.Номенклатура);
        Отбор.Вставить("Владелец", ТекЭлемент.Владелец);
        Отбор.Вставить("ГП", ТекЭлемент.ГП);
        
        Если ИтогТЗ.НайтиСтроки(Отбор).Количество() > 1 тогда  //Если кроме самой себя найдет еще одну такую же позицию
            Сообщить("При разузловании номенклатуры """ + ТекЭлемент.ГП + """ произошла зацикленность спецификации, полуфабрикат """ + ТекЭлемент.Номенклатура + """ не будет разузлован.");
        Иначе ...// разузловываем
7 aleks_default
 
04.08.16
15:47
(3) Стоп. Так разузлование ты делаешь не в СКД? Ну тогда можно так сделать. Ну т. е. добавить поле ГП и передавать его в каждый вложенный узел. Ну а потом в СКД соединять по нему.
(5) решается просто ограничением на количество уровней вложенности.
8 DrZombi
 
гуру
04.08.16
15:50
(1) Как замечательно. Вот и ответ нашелся :)
9 Jokero
 
04.08.16
15:56
(7) я бы хотел сделать разузлование запросом, но не представляю как это возможно.
Ограничение на количество уровней, хм, а это количество не фиксированно, может быть и 9 может и 15. А зацикливание может в 2-3 м быть, так и будет вся табица до 15 уровней повторяться, это не красиво.

(8) Ага, ответ в (1)  )),
10 aleks_default
 
04.08.16
16:07
(9) "я бы хотел сделать разузлование запросом, но не представляю как это возможно" - а вот в СКД произвольная иерархия что делает по-твоему?
    
"Ограничение на количество уровней, хм, а это количество не фиксированно, может быть и 9 может и 15. А зацикливание может в 2-3 м быть, так и будет вся таблица до 15 уровней повторяться, это не красиво." - зацикленность может быть с любым шагом и через 5 и 10 уровней. Тут задача не в красивости, а в предотвращении падения сервера. А красивость пусть определяют те кто такую сецификацию создал.