Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Разузлование спецификации в СКД

Разузлование спецификации в СКД
Я
   1snik_d
 
28.04.21 - 10:07
Все привет. Пытаюсь решить следующую задачу: необходимо по планам производства построить таблицу комплектующих по спецификациям из этого плана. Спецификации многоуровневые, может доходить до 20 уровня вложенности. Т.е. необходимо разузлование.
Знаю, как сделать рекурсивным алгоритмом, но сильно не устраивает скорость его работы. Нашел на просторах интернета, что СКД умеет иерархию при связи набора с самим собой

ВЫБРАТЬ
    Т.Ссылка КАК СпецификацияРодитель,
    Т.Спецификация КАК Спецификация,
    Т.Номенклатура,
    Т.Количество * &КоличествоСпецификации КАК Количество,
    Т.Количество КАК КоличествоНормативное,
    &КоличествоСпецификации КАК КоличествоСпецификации
ИЗ
    Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Т
ГДЕ
    Т.Ссылка В(&СписокСпецификаций)

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

ВЫБРАТЬ
    ЗНАЧЕНИЕ(Справочник.СпецификацииНоменклатуры.ПустаяСсылка),
    &Спецификация,
    &Спецификация,
    1,
    1,
    1

Это пример запроса, и он работает, разузловывает как надо и самое главное, что очень быстро. Но ему надо скармливать конкретную спецификацию в качестве начального значения связи в СКД, а мне нужно передавать список спецификаций, которые я выбрал из планов производства. Не могу понять, как это можно реализовать.
   Почему 1С
 
1 - 28.04.21 - 10:29
Ничего не понял как это работает, дай ссылку на исходник?
   1snik_d
 
2 - 28.04.21 - 10:41
   toypaul
 
3 - 28.04.21 - 11:29
вторая часть запроса выбирает не одну спецификацию, а список начальных
   1snik_d
 
4 - 28.04.21 - 11:35
(3) Если туда подпихнуть список, то запрос не выполняется, т.к. в объединении разные типы получаются в 2-х запросах
   1snik_d
 
5 - 28.04.21 - 11:37
Как бы хотелось сделать: добавить еще один набор, в нем сделать выборку нужных мне спецификаций. Потом соединить этот набор с первоначальным каким-то образом, чтобы для каждой спецификации из второго набора произошло разузлование
   toypaul
 
6 - 28.04.21 - 11:47
не надо туда подпихивать список. надо (если возможно) ВЫБРАТЬ ИЗ
   1snik_d
 
7 - 28.04.21 - 11:58
(6) Вложенный запрос сделать, в смысле?
   WebberNSK
 
8 - 28.04.21 - 12:06
(0) это будет еще медленнее, или разузловывай пакетно в цикле (на каждый уровень 1 запрос) или реализуй хранения таким образом, чтобы по родителю можно получить все дочерние элементы.
   1snik_d
 
9 - 28.04.21 - 12:09
(6) Ура, заработало (©Кот Матроскин). Сделал вложенный запрос и второй набор не понадобился. Работает как надо. Спасибо за идею.
   1snik_d
 
10 - 28.04.21 - 12:10
(8) Это работает пипец как быстрее обычного разузлования. На порядок быстрее
   DrShad
 
11 - 28.04.21 - 12:11
(10) это будет медленно и не гарантированно от сваливания в бесконечный цикл
в общем задача решаема с помощью СКД, но результат тебе не понравится
   1snik_d
 
12 - 28.04.21 - 12:12
А самое приятное, что можно пользовать все плюшки СКД в виде отборов, группировок и т.д.
   1snik_d
 
13 - 28.04.21 - 12:12
(11) Да он мне уже нравится. На рабочей базе скорость построения дерева в 10 раз быстрее, чем рекурсией
   1snik_d
 
14 - 28.04.21 - 12:13
(11) Для того, чтобы в бесконечный цикл не падало, есть условия в связи наборов
   DrShad
 
15 - 28.04.21 - 12:17
тебе из личного опыта рассказывают, а ты почему то думаешь, что именно у тебя все будет иначе)))
   1snik_d
 
16 - 28.04.21 - 12:22
(15) А как лучше сделать, чтобы работало быстро?
   DrShad
 
17 - 28.04.21 - 12:29
(16) см (8)
но самый прикол начнется когда ты будешь не просто получать разузловывание, а когда нужно будет посчитать на определенное количество
   1snik_d
 
18 - 28.04.21 - 12:32
(17) А в чем проблема, то, что у меня сейчас получилось в СКД считает на нужное количество, причем правильно на каждом уровне - проверил.
   DrShad
 
19 - 28.04.21 - 12:39
(18) вот если сделаешь по списку продукции поймешь

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.