Имя: Пароль:
1C
 
помощь по запросу
0 NordMad
 
10.08.18
13:17
Есть запрос который выдает такой вот результат деревом:
http://prntscr.com/kgznkw
мне нужно это дерево выгрузить на форму для интерактивной работы, но нужно убрать дублиривание в поле номенклатура. т.е. либо сделать так чтобы поле Item открывалось в нижнем уровне номенклатуры (ещё один уровень иерархии добавить) либо пронумеровать повторяющиеся item в группе и скрыть УсловнымОформлением.. второй вариант вроде бы кажется проще.. но ни тот ни тот не знаю как реализовать. Вариант обхода дерева после выгрузки на поле формы - крайний, если не получится запросом сделать.
1 NordMad
 
10.08.18
13:20
(0) добавлю скрин формы после загрузки дерева: http://prntscr.com/kgzqbu
2 NordMad
 
10.08.18
13:21
(1) может тут понятнее будет что нужно получить в результате. то есть либо в таком виде как есть, но скрыть дублирующую номенклатуру и оставить item как он на скрине, либо убрать дубли, но item чтобы был под "+" скрыт как ещё один более нижний уровень от номенклатуры
3 NordMad
 
10.08.18
13:32
(2) никто не знает, или непонятно че хочу?:)
4 Ненавижу 1С
 
гуру
10.08.18
13:42
В СКД состав выводимых полей настраивается
5 1Сергей
 
10.08.18
13:44
(2) добавь айтомы в итоги
6 AnisaL
 
10.08.18
13:48
(3) нужно убрать группировки, добавить итоги
7 AnisaL
 
10.08.18
14:01
(3) вы поняли как нужно сделать? нужно из запроса убрать секцию "Сгруппировать ПО", а добавить "Итоги ПО Номенклатура.Ссылка, ВложенныйЗапрос.item"
8 spiller26
 
10.08.18
14:16
(0) Это УФ или обычные формы? Куда ты хочешь выгрузить на форму? В Дерево Значений?
9 NordMad
 
10.08.18
14:20
(8) уф
10 NordMad
 
10.08.18
14:21
(7) сейчас попробую
11 NordMad
 
10.08.18
14:23
(7) http://prntscr.com/kh0jfx вот что получилось в итоге, то есть дублирование не пропало, но появилась ненужная вложенность элементов
12 NordMad
 
10.08.18
14:24
(4) СКД подошло бы если бы нужно было бы только для отображения, там вопросов нету. всё просто, но нужно чтобы можно было бы менять данные, по этому использую форму, на ней ДеревоЗначений
13 NordMad
 
10.08.18
14:25
(8) в (1)  привел скриншот формы в которую выгружаю результат запроса
14 ColonelAp4u
 
10.08.18
14:27
(12) если хочешь дерево на форме, то итем помещай под номенклатурой а не в отдельной колонке
15 spiller26
 
10.08.18
14:28
(9) Вот мой код.

    Если ТаблицаОборот.Количество() > 0 Тогда
        
        ТаблицаОборотСвертка = ТаблицаОборот.Скопировать();
        ТаблицаОборотСвертка.Свернуть("Номенклатура, КоличествоОстаток, СуммаОстаток", "");
        
        ОписаниеТиповДоков = Новый ОписаниеТипов;
        ОписаниеТиповДоков.Типы().Добавить("ДокументСсылка.ВводНачальныхОстатков");
        ОписаниеТиповДоков.Типы().Добавить("ДокументСсылка.ПоступлениеТоваровУслуг");

        ДеревоОстатковНоменклатуры = Новый ДеревоЗначений;
        ДеревоОстатковНоменклатуры.Колонки.Добавить("Номенклатура",      Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
        ДеревоОстатковНоменклатуры.Колонки.Добавить("КоличествоОстаток", Новый ОписаниеТипов("Число"));
        ДеревоОстатковНоменклатуры.Колонки.Добавить("СуммаОстаток",      Новый ОписаниеТипов("Число"));
        //
        ДеревоОстатковНоменклатуры.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
        ДеревоОстатковНоменклатуры.Колонки.Добавить("Уровень",       Новый ОписаниеТипов("Число")); //для отображения картинок и гуппировка
        //
        ДеревоОстатковНоменклатуры.Колонки.Добавить("СуммаРеализации",      Новый ОписаниеТипов("Число"));
        
        Для Каждого СтрОборотСвертка Из ТаблицаОборотСвертка Цикл
            СтрокаВерхнегоУровня = ДеревоОстатковНоменклатуры.Строки.Добавить();
            //
            СтрокаВерхнегоУровня.Уровень = 2;
            СтрокаВерхнегоУровня.Представление = Строка(СтрОборотСвертка.Номенклатура);
            СтрокаВерхнегоУровня.Номенклатура = СтрОборотСвертка.Номенклатура;
            СтрокаВерхнегоУровня.КоличествоОстаток = СтрОборотСвертка.КоличествоОстаток;
            СтрокаВерхнегоУровня.СуммаОстаток = СтрОборотСвертка.СуммаОстаток;
            
            ПараметрыОтбора = Новый Структура();
            ПараметрыОтбора.Вставить("Номенклатура", СтрОборотСвертка.Номенклатура);
            //
            ТаблицаОборотДетали = ТаблицаОборот.Скопировать(ПараметрыОтбора);
            ТаблицаОборотДетали.Сортировать("Период Возр");
            Для Каждого СтрОборотДетали Из ТаблицаОборотДетали Цикл
                СтрокаДереваДетали = СтрокаВерхнегоУровня.Строки.Добавить();
                //
                СтрокаДереваДетали.Уровень = 4;
                СтрокаДереваДетали.Представление = "";
                СтрокаДереваДетали.Номенклатура = СтрОборотДетали.Номенклатура;
                СтрокаДереваДетали.СуммаПриход = СтрОборотДетали.СуммаПриход;
            КонецЦикла;
        КонецЦикла;    
        ЗначениеВРеквизитФормы(ДеревоОстатковНоменклатуры, "ДеревоОстатков");
    КонецЕсли;
16 NordMad
 
10.08.18
14:29
(14) верно, но так как дублирование не исключено в итоге получим вместо одной номенклатуры + 3 айтема - 3 номенклатуры с 1м айтемом в каждой:) могу скрин показать что будет если не менять запрос, а поменять очередность колонок в элементе на форме
17 NordMad
 
10.08.18
14:32
(15) с обходом дерева понятно всё:) я как раз про это и говорил в (0). просто в вашем же коде видно что много буков, а если был бы вариант сделать это всё запросом, было бы и быстрее и не громоздко. вот по этому и спросил, или я не понимаю как это сделать, или такую аферу не провернуть в данной ситуации (кстати вместо вложенных циклов можно использовать рекурсию, меньше текста.. но не оч рекомендуемо)
18 spiller26
 
10.08.18
14:35
(17) Вот такое выходит примерно
https://prnt.sc/kh0nuz

Вообще можно и в запросе, по группировкам просто выводи.
У меня усложнено тем, что мне нужно было выводить обороты по убыванию.
19 NordMad
 
10.08.18
14:36
(18) верю. примерно такой метод и использую если не получится скомпоновать запросом.
20 spiller26
 
10.08.18
14:40
(18) вот скрин моей реализации на форме
https://prnt.sc/kh0r9l
21 NordMad
 
10.08.18
14:41
http://prntscr.com/kh0rqx подскажите а так вот можно сделать? тогда можно было бы легко убрать лишнее УсловнымОформлением
22 spiller26
 
10.08.18
14:46
(21) При выводе счетчик ставь.

(19) Вот тебе из запроса, только

    ОписаниеТиповИдентификатора = Новый ОписаниеТипов;
    ОписаниеТиповИдентификатора.Типы().Добавить("Строка");
    ОписаниеТиповИдентификатора.Типы().Добавить("СправочникСсылка.Номенклатура");

    ДеревоРС = Новый ДеревоЗначений;
    ДеревоРС.Колонки.Добавить("НомерСтроки",         Новый ОписаниеТипов("Число"));
    ДеревоРС.Колонки.Добавить("НоменклатураЗапрос",  ОписаниеТиповИдентификатора);
    ДеревоРС.Колонки.Добавить("Номенклатура",        Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
    ДеревоРС.Колонки.Добавить("РегистраторДата",     Новый ОписаниеТипов("Дата"));
    ДеревоРС.Колонки.Добавить("РегистраторНомер",    Новый ОписаниеТипов("Строка"));
    ДеревоРС.Колонки.Добавить("СтрокаИД",            Новый ОписаниеТипов("УникальныйИдентификатор"));
    ДеревоРС.Колонки.Добавить("СтрокаИДКвоты",       Новый ОписаниеТипов("УникальныйИдентификатор"));
    //
    ДеревоРС.Колонки.Добавить("Представление",       Новый ОписаниеТипов("Строка"));
    ДеревоРС.Колонки.Добавить("Уровень",             Новый ОписаниеТипов("Число"));
    ДеревоРС.Колонки.Добавить("КоличествоЗапрос",    Новый ОписаниеТипов("Число"));
    ДеревоРС.Колонки.Добавить("КоличествоПредложено",Новый ОписаниеТипов("Число"));

//
//тут запрос
//
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаРегистратор = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаРегистратор.Следующий() Цикл
        СтрокаВерхнегоУровня = ДеревоРС.Строки.Добавить();
        СтрокаВерхнегоУровня.РегистраторДата  = ВыборкаРегистратор.РегистраторДата;
        СтрокаВерхнегоУровня.РегистраторНомер = ВыборкаРегистратор.РегистраторНомер;
        //
        СтрокаВерхнегоУровня.Уровень = 0;
        СтрокаВерхнегоУровня.Представление = "№ " + Строка(ВыборкаРегистратор.РегистраторНомер)  + " от "+ Строка(ВыборкаРегистратор.РегистраторДата);
        
        ВыборкаНоменклатураЗапрос = ВыборкаРегистратор.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Пока ВыборкаНоменклатураЗапрос.Следующий() Цикл
            СтрокаДереваЗапрос = СтрокаВерхнегоУровня.Строки.Добавить();
            СтрокаДереваЗапрос.НомерСтроки         = ВыборкаНоменклатураЗапрос.НомерСтроки;
            СтрокаДереваЗапрос.НоменклатураЗапрос  = ВыборкаНоменклатураЗапрос.НоменклатураЗапрос;
            СтрокаДереваЗапрос.СтрокаИД            = ВыборкаНоменклатураЗапрос.СтрокаИД;
            //
            СтрокаДереваЗапрос.Уровень = 1;
            СтрокаДереваЗапрос.Представление = Строка(ВыборкаНоменклатураЗапрос.НоменклатураЗапрос);
            СтрокаДереваЗапрос.КоличествоЗапрос = ВыборкаНоменклатураЗапрос.КоличествоЗапрос;
            СтрокаДереваЗапрос.КоличествоПредложено = ВыборкаНоменклатураЗапрос.КоличествоПредложено;
            
            ВыборкаДетальныеЗаписи = ВыборкаНоменклатураЗапрос.Выбрать();
            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                Если ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.Номенклатура) Тогда
                    СтрокаДерева = СтрокаДереваЗапрос.Строки.Добавить();
                    СтрокаДерева.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
                    //
                    СтрокаДерева.Уровень = 2;
                    СтрокаДерева.Представление = Строка(ВыборкаДетальныеЗаписи.Номенклатура);
                    СтрокаДерева.КоличествоПредложено = ВыборкаДетальныеЗаписи.КоличествоПредложено;
                    СтрокаДерева.СтрокаИД = ВыборкаДетальныеЗаписи.СтрокаИД;
                    СтрокаДерева.СтрокаИДКвоты = ВыборкаДетальныеЗаписи.СтрокаИДКвоты;
                КонецЕсли;    
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
    
    ЗначениеВРеквизитФормы(ДеревоРС, "СписокПредложений");
23 NordMad
 
10.08.18
14:48
(22) при выводе в смысле при обходе дерева?:) а в запросе нельзя такое поле вычисляемое прикрутить?
24 spiller26
 
10.08.18
14:55
(23) нет
25 spiller26
 
10.08.18
15:00
(23) Ну если хочешь заморочиться, то вот ссылка Книга знаний: Нумерация строк в запросе

Честно не целесообразно, т.к. долго будет запрос обрабатывать.
Ну ещё можно заморочиться через СКД попробовать всё провернуть, а затем выводить в дерево.
26 NordMad
 
10.08.18
16:07
(25) читал статейку. не то:) там сквозная нумерация, а интересно было бы нумерация сначала для каждого нижнего уровня (на уровне элементов) чтобы настроитть потом видимость.
а как через СКД? там совсем мрачно? визуально понятно как накидать, а программно нужную группировку настроить наверное не менее геморно чем обход дерева сделать и почикать лишнее