[РЕШЕНО] Дерево номенклатуры

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Peroman, 10 янв 2017.

  1. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    936
    Симпатии:
    18
    Баллы:
    29
    Платформа: 1С:Предприятие 8.3 (8.3.8.1652)
    Конфигурация: Управление торговлей, редакция 11.2 (11.2.3.189)

    Всем доброго времени суток и с наступившем!)

    Нужно перестроить иерархию в нумерованный список так:

    upload_2017-1-10_12-10-9.png

    Максимальная вложенность может быть 5 уровней. Весь мозг сломал как мне из дерева номенклатуры сделать нумерованный список.
  2. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.143
    Симпатии:
    553
    Баллы:
    204
    В СКД можно выводить уровень вложенности
  3. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    936
    Симпатии:
    18
    Баллы:
    29
    Да? А не подскажете как?
  4. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.143
    Симпатии:
    553
    Баллы:
    204
    Вот так:
    111.png
  5. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    936
    Симпатии:
    18
    Баллы:
    29
    Немного не то что мне нужно, да и СКД в моём случае мне не подойдёт.

    Я делаю всё через запрос:
    Код:
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ    Номенклатура.ЭтоГруппа
        |И НЕ Номенклатура.ПометкаУдаления
        | УПОРЯДОЧИТЬ ПО
        |Номенклатура.Ссылка ИЕРАРХИЯ
        |АВТОУПОРЯДОЧИВАНИЕ";
    
    Потом:
    Код:
        РезультатЗапроса = Запрос.Выполнить();
        Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Потом нумерую верхний уровень и закидываю результат в ТЗ
    Код:
        Пока Выборка.Следующий() Цикл
            Если Выборка.Уровень() = 0 Тогда
                НомерУровня = НомерУровня+1;
                НоваяСтрока = ТЗ.Добавить();
                НоваяСтрока.НомерУровня = НомерУровня;
                НоваяСтрока.НоменклатурнаяГруппа = Выборка.Ссылка;
            КонецЕсли;
    
    и на этом всё))). Ну т.е. дальше я пробовал делать так:
    Код:
            Если Выборка.Уровень()=1 Тогда
                НомерПапки = НомерПапки+1;
                НоваяСтрока = Тз.Добавить();
                НужнаяСтрока = ТЗ.Найти(Выборка.Ссылка.Родитель,"НоменклатурнаяГруппа");
                НомерУровняРодителя = НужнаяСтрока.НомерУровня;
                НоваяСтрока.НомерУровня = Строка(НомерУровняРодителя)+"."+Строка(НомерПапки);
                НоваяСтрока.НоменклатурнаяГруппа = Выборка.Ссылка;
    
    В итоге получается не совсем то:

    upload_2017-1-10_16-58-6.png

    Мне нужно чтобы нумерация обнулялась как только я начал работать с другой папкой.

    Вообще я почему то думал что если я сделаю так:
    Код:
            Для i=0 По Выборка.Уровень() Цикл
               
                Пока Выборка.Следующий() Цикл
                   
                КонецЦикла;       
               
            КонецЦикла;
    
    То мне это поможет, но не получилось не смотря на то что я вроде бы пробегаюсь в цикле по уровням. Цикл Пока Выборка.Следущий() всё равно пробегается по всему результату запроса.
  6. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.143
    Симпатии:
    553
    Баллы:
    204
    Вы посмотрите как строится обработка результата запроса, если есть группировки, там как минимум два цикла - один для группировки, второй для детальных записей.
  7. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    936
    Симпатии:
    18
    Баллы:
    29
    Не совсем понимаю о чём вы? Дело в том что Выборка проходит всё в хаотичном порядке. Т.е. элемент выборки может иметь Уровень 1, а следующий 3, потом следующий 5, а потом опять 1. Мне же надо как-то организовать обход таким образом: сначала весь первый уровень, пронумеровываю его, потом новый цикл, для каждой папки первого уровня, получаю внутри них подчинёные папки, пронумеровываю их так до самого нижнего уровня. Так сказать некая рекурсия получается.
  8. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    7.347
    Симпатии:
    439
    Баллы:
    104
  9. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    936
    Симпатии:
    18
    Баллы:
    29
    Да уже сделал. Просто совсем забыл про рекурсию.
    праздники видно сказались)))
    alexburn нравится это.
  10. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    936
    Симпатии:
    18
    Баллы:
    29
    Код:
    &НаСервере
    Процедура ПронумероватьИерархиюНоменклатурыНаСервере()
       
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ    Номенклатура.ЭтоГруппа
        |И НЕ Номенклатура.ПометкаУдаления
        | УПОРЯДОЧИТЬ ПО
        |Номенклатура.Ссылка ИЕРАРХИЯ
        |АВТОУПОРЯДОЧИВАНИЕ";
        РезультатЗапроса = Запрос.Выполнить();
        Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
        Сч=0;
        Тз = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("НомерУровня");
        ТЗ.Колонки.Добавить("НоменклатурнаяГруппа");
        ТЗ.Колонки.Добавить("КодГруппы");
       
        НумерованиеГруппРекурсивно(Выборка, ТЗ, Сч);
        УровеньГруппы.Загрузить(ТЗ);
        КодГруппыДляТоваровБезГрупп = Сч+1;
       
    КонецПроцедуры
    
    &НаСервере
    Процедура НумерованиеГруппРекурсивно(Выборка, ТЗ, Сч)
       
        НомерУровня = 0;
        НомерПапки = 0;
        Пока Выборка.Следующий() Цикл
            Сч=Сч+1;
            Если Выборка.Уровень() = 0 Тогда
                НомерПапки = НомерПапки+1;
                НоваяСтрока = ТЗ.Добавить();
                НоваяСтрока.НомерУровня = Строка(НомерПапки)+".";
                НоваяСтрока.НоменклатурнаяГруппа = Выборка.Ссылка;
                НоваяСтрока.КодГруппы = Строка(Сч);
            Иначе
                НомерУровня = НомерУровня+1;
                НоваяСтрока = Тз.Добавить();
                НужнаяСтрока = ТЗ.Найти(Выборка.Ссылка.Родитель,"НоменклатурнаяГруппа");
                НомерУровняРодителя = НужнаяСтрока.НомерУровня;
                НоваяСтрока.НомерУровня = Строка(НомерУровняРодителя+Строка(НомерУровня)+".");
                НоваяСтрока.КодГруппы = Строка(Сч);
                НоваяСтрока.НоменклатурнаяГруппа = Выборка.Ссылка;
            КонецЕсли;       
            СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
            НумерованиеГруппРекурсивно(Выборка.Выбрать(СпособВыборки), ТЗ, Сч);
        КонецЦикла;
       
    КонецПроцедуры
    
    Листинг решения. Может кому пригодится
    alexburn нравится это.
Похожие темы
  1. Trex_alex
    Ответов:
    0
    Просмотров:
    976
  2. Aleks
    Ответов:
    3
    Просмотров:
    1.047
  3. MyNameNoName
    Ответов:
    6
    Просмотров:
    1.171
  4. Ivan2014
    Ответов:
    4
    Просмотров:
    504
  5. nsk1C
    Ответов:
    0
    Просмотров:
    181
Загрузка...

Поделиться этой страницей