Имя: Пароль:
1C
1С v8
Вопрос про разузлование спецификаций номенклатуры
,
0 vfrcbv
 
17.07.15
03:27
Здравствуйте, для разузлование номенклатуры в БП 3.0 был использован следующий код:

ТекстЗапроса = "ВЫБРАТЬ
                   |    ЕСТЬNULL(Спец.Номенклатура, Исх.Номенклатура)                 КАК Номенклатура,
                   |    Исх.Количество * ЕСТЬNULL(Спец.Количество, 1)                    КАК Количество,
                   |    Исх.СтрокаКодов + ЕСТЬNULL(Спец.КодНоменклатуры, """")   КАК СтрокаКодов,
                   |    ВЫБОР
                   |        КОГДА Исх.ПризнакКонцаВетки > 0
                   |            ТОГДА Исх.ПризнакКонцаВетки
                   |        КОГДА Спец.КодНоменклатуры ЕСТЬ NULL
                   |            ТОГДА 1 // нормальное завершение ветки
                   |        КОГДА Исх.СтрокаКодов ПОДОБНО Спец.КодНоменклатуры
                   |            ТОГДА 2 // зацикливание
                   |        ИНАЧЕ 0     // ветка продолжается
                   |    КОНЕЦ                                                                                  КАК ПризнакКонцаВетки
                   |ПОМЕСТИТЬ Последующая
                   |ИЗ
                   |    Исходная КАК Исх
                   |     ЛЕВОЕ СОЕДИНЕНИЕ Спецификация КАК Спец
                   |     ПО (Исх.ПризнакКонцаВетки = 0) // соединяемся только тогда, когда ветка продолжается
                   |            И Исх.Номенклатура = Спец.Владелец
                   |;
                   |УНИЧТОЖИТЬ Исходная
                   |;
                   |ВЫБРАТЬ ПЕРВЫЕ 1 Посл.Номенклатура
                   |ИЗ  Последующая КАК Посл
                   |ГДЕ Посл.ПризнакКонцаВетки = 0";

    //Цикл получения выходной таблицы
    Для Счетчик =0 по КоличествоЦиклов+1  Цикл
         Запрос.Текст = СтрЗаменить(ТекстЗапроса,"Исходная","ВремТаблица"+ Счетчик);
         Запрос.Текст = СтрЗаменить(Запрос.Текст,"Последующая","ВремТаблица"+(Счетчик+1));
         РезультатЗапроса = Запрос.Выполнить();
         Если РезультатЗапроса.Пустой() Тогда
              Счетчик = Счетчик + 1 ;
              Прервать;
         КонецЕсли;
    КонецЦикла;
взятый с http://catalog.mista.ru/public/78285/. В результате получил материалы из которых состоит номенклатура. (ветки неимеющие подчиненных ("детей") с количеством).

Подскажите пожалуйста, как модифицировать этот код, чтобы получить не только материалы, но и все подчиненные узлы номенклатуры?
1 Peltzer
 
17.07.15
05:55
У себя решал своими силами.
В такой формулировке, на мой взгляд, решение очевидно:
1. Дан граф вложенности номенклатуры, а именно массив ребёр вложенности с процентом участия номенклатуры-сырья в номенклатуре-изделии.
2. Дан массив затрат, составляющих полную стоимость изделия.
3. Задача получить массив затрат в разрезе "первичной" номенклатуры. То есть, той, которая ни из чего не выпускается.
2 vfrcbv
 
17.07.15
10:29
(1) то что вы описали, решает алгоритм приведённый сверху. в результате получаем "первичную" номенклатуру, но мне еще надо получить все узлы входящие в изделие...

подскажите как доработать код сверху?
3 ХардHard
 
17.07.15
10:39
(2) В 0  фигня какая-то. Делал рекурсией запрос писал сам.
Там делов то на часик-два.
Позови специалистов.
4 vdeemer
 
17.07.15
10:47
(3) Рекурсия рулит однозначно. Как ни странно, везде разузлование в УПП делается тоже как в (1)...
5 vdeemer
 
17.07.15
10:47
(4) конечно, "в (0)"
Независимо от того, куда вы едете — это в гору и против ветра!