Имя: Пароль:
1C
 
Иерархическая нумерация строк при выводе данных
0 Alex70
 
10.08.18
10:28
Добрый день! Есть задание вывести иерархическую нумерацию строк при формировании строк, в строке "ОбластьСтрокаОсновное.Параметры.Номер" и должен выводиться номерстроки с увеличением. Думаю, что в запросе можно что-то "подкрутить", возможно ошибаюсь. Подтолкните пожалуйста в нужную сторону))
Иерархическая структура должна быть типа:
1
1.1
1.1.1
1.1.1.1
1.1.1.2
1.1.2
1.2
1.2.1
2
2.1. ну и т.п.
_________________________________

// Определяем спецификацию поумолчанию
    Если Спецификация = Неопределено Тогда
        СпецификацияОбхода = УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(ТекущаяНоменклатура,,ТекущаяДата());
    Иначе
        СпецификацияОбхода = Спецификация;
    КонецЕсли;
    
    Если Не ЗначениеЗаполнено(СпецификацияОбхода) Тогда
        Возврат;
    КонецЕсли;
    
    ЗапросПодборКомплектующих = Новый Запрос;
    ЗапросПодборКомплектующих.Текст = "ВЫБРАТЬ
                                      |    СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Номенклатура,
                                      |    СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура.Артикул,
                                      |    СпецификацииНоменклатурыИсходныеКомплектующие.Количество,
                                      |    СпецификацииНоменклатурыИсходныеКомплектующие.НомерСтроки КАК НомерСтроки
                                      |ИЗ
                                      |    Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
                                      |ГДЕ
                                      |    СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка = &Спецификация";

    ЗапросПодборКомплектующих.УстановитьПараметр("Спецификация", СпецификацияОбхода);
    
    ВыборкаПодборКомплектующих = ЗапросПодборКомплектующих.Выполнить().Выбрать();
    
    Пока ВыборкаПодборКомплектующих.Следующий() Цикл
        
        Строка = ЭлементыФормы.Товары.ТекущаяСтрока;
        
        Если Уровень = 0 Тогда
            ОбластьСтрокаОсновное = Макет.ПолучитьОбласть("Строка|ОсновноеСтрока");
            ОбластьСтрокаКолонка = Макет.ПолучитьОбласть("Строка|КолонкаСтрока");
            Если Строка.ВидСтроки = Перечисления.тлкВидыСтрокиГС.ЭтоПокрытие Тогда
                ЦветОранжевый = Новый Цвет(240, 150, 40);
                ОбластьСтрокаОсновное.Область(1,1,1,7).ЦветФона = ЦветОранжевый;
            КонецЕсли;
        ИначеЕсли Уровень > 6 Тогда
            ОбластьСтрокаОсновное = Макет.ПолучитьОбласть("Строка7|ОсновноеСтрока7");
            ОбластьСтрокаКолонка = Макет.ПолучитьОбласть("Строка7|КолонкаСтрока7");
            Если Строка.ВидСтроки = Перечисления.тлкВидыСтрокиГС.ЭтоПокрытие Тогда
                ЦветОранжевый = Новый Цвет(240, 150, 40);
                ОбластьСтрокаОсновное.Область(1,1,1,14).ЦветФона = ЦветОранжевый;
            КонецЕсли;
        Иначе
            ОбластьСтрокаОсновное = Макет.ПолучитьОбласть("Строка"+Уровень+"|ОсновноеСтрока"+Уровень);
            ОбластьСтрокаКолонка = Макет.ПолучитьОбласть("Строка"+Уровень+"|КолонкаСтрока"+Уровень);
            Если Строка.ВидСтроки = Перечисления.тлкВидыСтрокиГС.ЭтоПокрытие Тогда
                ЦветОранжевый = Новый Цвет(240, 150, 40);
                ОбластьСтрокаОсновное.Область(1,1,1,7+Уровень).ЦветФона = ЦветОранжевый;
            КонецЕсли;
        КонецЕсли;
        
        Артикул = СОКРЛП(ВыборкаПодборКомплектующих.Номенклатура.Артикул);
        
        ПутьКФайлуКартинки = "\\pdm-sql\Pictures\Image\"+Артикул+".png";
        
        Файл = Новый Файл (ПутьКФайлуКартинки);
        Если НЕ Файл.Существует() Тогда
            ПозицияДефис = Найти(Артикул,"-");
            
            Если ПозицияДефис > 0 Тогда
                Артикул = СОКРЛП(Лев(Артикул,ПозицияДефис-1));
            КонецЕсли;
            
            ПутьКФайлуКартинки = "\\pdm-sql\Pictures\Image\"+Артикул+".png";
            
            Файл = Новый Файл (ПутьКФайлуКартинки);
        КонецЕсли;
        
        Если Файл.Существует() Тогда
            
            ОбластьСтрокаОсновное.ТекущаяОбласть.ВысотаСтроки = 80;            
            Рис = ОбластьСтрокаОсновное.Рисунки[0];
            Рис.Высота = 27;
            Рис.РазмерКартинки = РазмерКартинки.АвтоРазмер;
            Рис.Картинка = Новый Картинка(ПутьКФайлуКартинки);
            
        Иначе
            
            ОбластьСтрокаОсновное.ТекущаяОбласть.АвтоВысотаСтроки = Истина;
            ОбластьСтрокаОсновное.ТекущаяОбласть.ВысотаСтроки = 0;
            
            Рис = ОбластьСтрокаОсновное.Рисунки[0];
            Рис.Высота = 2;
            Рис.Картинка = Новый Картинка;                
            
        КонецЕсли;
ОбластьСтрокаОсновное.Параметры.Номер = ВыборкаПодборКомплектующих.НомерСтроки; //ПолучитьНомерСтроки.КодСтроки;

        ОбластьСтрокаОсновное.Параметры.Наименование = ВыборкаПодборКомплектующих.Номенклатура;
        ОбластьСтрокаОсновное.Параметры.Артикул = ВыборкаПодборКомплектующих.Номенклатура.Артикул;
        
        ТабличныйДокумент.Вывести(ОбластьСтрокаОсновное);
                    
        ОбластьСтрокаКолонка.Параметры.Количество = ВыборкаПодборКомплектующих.Количество;
        ТабличныйДокумент.Присоединить(ОбластьСтрокаКолонка);
                    
        ТабличныйДокумент.Показать();
        
        ТабличныйДокумент.НачатьГруппуСтрок();
                        
        ОбходДереваСпецификаций(Макет, ТабличныйДокумент, Уровень + 1, , ВыборкаПодборКомплектующих.Номенклатура);
            
        ТабличныйДокумент.ЗакончитьГруппуСтрок();        
                
    КонецЦикла;
    
КонецПроцедуры
1 leonidk
 
10.08.18
10:37
В СКД, в настройках, в "выбранные поля", в "СистемныеПоля", есть НомерПоПорядкуВГруппировке.
2 Alex70
 
10.08.18
10:41
(1) Я не через СКД делаю
3 leonidk
 
10.08.18
10:48
4 Deon
 
10.08.18
10:51
Тут, похоже, рекурсия. И запрос строится по каждой группе иерархии
5 mistеr
 
10.08.18
11:49
(2) тогда не парь мозг и нумеруй при выводе.

Понадобится стек номеров уровней, можно реализовать массивом.
6 Alex70
 
10.08.18
12:15
(5) Можно пример?
7 mistеr
 
10.08.18
13:46
(6)

Номера = Новый Массив;

// При выборке следующего уровня группировки:
Номера.Добавить(0);

// При получении очередной строки из выборки;
Номера[Номера.ВГраница()] = Номера[Номера.ВГраница()] + 1;

// При завершении выборки и возврате на предыдущий уровень:
Номера.Удалить(Номера.ВГраница());
Программист всегда исправляет последнюю ошибку.