Имя: Пароль:
1C
1С v8
Рекурсия в функции 1С, ошибка
0 JamesStep
 
01.03.23
10:17
Добрый день, подскажите, почему рекурсия зацикливается и не возвращает значение в переменную? Задача следующая, необходимо выгрузить справочник с иерархией групп и элементов, соблюдая иерархию в JSON. Входным параметром будет папка, нужно выгрузить все входящее в нее. Помогите, который день голову ломаю.

&НаКлиенте
Процедура Выгрузить(Команда)    
    
   Группа = Новый Структура();
   Счетчик = 0;
   Данные = ПолучитьГруппы(Реквизит1, Группа, Счетчик);  
  
    
        
КонецПроцедуры



Функция ПолучитьГруппы(Номенклатура, Группа, Счетчик)
    Счетчик = Счетчик + 1;
    Услуги = Новый Массив();
    ТекущиеГруппы = Новый Массив();
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    НоменклатураСсылка.Ссылка КАК Ссылка,
        |    НоменклатураСсылка.ЭтоГруппа КАК ЭтоГруппа
        |ИЗ
        |    Справочник.Номенклатура КАК НоменклатураСсылка
        |ГДЕ
        |    НоменклатураСсылка.Родитель = &Номенклатура
        |    И НоменклатураСсылка.ПометкаУдаления = ЛОЖЬ";
    
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
        
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл  
        Если ВыборкаДетальныеЗаписи.ЭтоГруппа = Истина Тогда  
            ТекущиеГруппы.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
        Иначе
            Услуги.Добавить(ВыборкаДетальныеЗаписи.Ссылка);      
            КонецЕсли;
    КонецЦикла;  
    
    Группа.Вставить("Group", Номенклатура);
    Группа.Вставить("Nomencl", Услуги);
    
    Если ТекущиеГруппы.Количество() > 0 Тогда
        
        Для Каждого Эл Из ТекущиеГруппы Цикл
            
            Группа.Вставить("Inc", ПолучитьГруппы(Эл, Группа, Счетчик));    
            
        КонецЦикла
        
    Иначе  
        
        
        Возврат Группа;    
        
    КонецЕсли;
    

    ЗаписьJSON = Новый ЗаписьJSON;
    ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина);  
    ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);    
    ЗаписатьJSON(ЗаписьJSON, Группа);
    
    СтрокаЗаписьJSON = ЗаписьJSON.Закрыть();
    
    Возврат Группа;
    
    
    
КонецФункции
1 sikuda
 
01.03.23
10:21
(0) Вместо запросов в цикле предлагаете запросы в рекурсии?
2 JamesStep
 
01.03.23
10:36
(1) Не так все просто, используя рекурсию в Поле "Inc" я при закрытии стэка вставляю все входящие элементы в эту группу
3 unenu
 
01.03.23
10:55
(0) делайте выгрузку за два шага: сначала выгружаем группы, а на втором шаге элементы.
сушить мозг с выгрузкой иерархической структуры в один проход такое себе удовольствие
4 JamesStep
 
01.03.23
10:59
Какой тип данных лучше использовать для хранения групп? (3)
5 unenu
 
01.03.23
11:03
(4) ну два массива можно сделать
в первом массиве структуры групп
во втором элементов

при загруке пишите сначала группы
потом элементы

и плевать что-там с иерерхией - сама ляжет по уидам.
6 НафНаф
 
01.03.23
11:11
(0) зацикливания рекурсии я тут не вижу, но данные сами себя знатно перетирают, это да
7 brainguard
 
01.03.23
11:14
(0) Один запрос к справочнику с использованием конструкции ИТОГИ