Имя: Пароль:
1C
1С v8
Простой вопрос про запрос
0 Wefast
 
08.04.19
10:34
Есть таблица

Док1     Орг1   подр1 Сотр1 100
Док1     Орг1   подр1 Сотр2 100
Док1     Орг1   подр1 Сотр3 100
Док2     Орг2   подр2 Сотр1 100
Док2     Орг2   подр2 Сотр2 100
Док2     Орг2   подр2 Сотр3 100


При первом обходе мне нужны данные: Док, Орг, Подр
На втором все данные строки.

Изначально у меня было сделано
Пока Выбрка.СледующийПоЗначениюПоля("ссылка") Цикл
//Заполняю шапку данными

    Пока Выборка.Следующий() Цикл
    //Заполняю строки

    КонецЦикла

КонецЦикла;

Но мне понадобилось узнать сколько строк в каждом документе, что бы при выводе строк контролировать текущую выводимую строку.


В общем если помещаю все поля в ИТОГИ

Делаю
выб = Запрос.ВыбратьПоГруппировкам()

Пока Выб.следующий() цикл
тут мне доступно значение только первой группировки
1 Ёпрст
 
08.04.19
10:36
запрос то где ?
2 Wefast
 
08.04.19
10:40
(1) а зачем он?
В нем все поля таблицы, ИТОГи по первым 3
3 Wefast
 
08.04.19
10:41
(2) *колонки
4 breezee
 
08.04.19
10:41
Я не очень понял вопрос, но на уровне телепатии, возможно, вам поможет МАКСИМУМ ПО (НОМЕРСТРОКИ) из табличной части в шего документа в ИТОГах, хотя это не точно
5 RomanYS
 
08.04.19
10:45
(2) Зачем итог по 3-м, если тебе только по документу надо?
6 Ёпрст
 
08.04.19
10:50
В итоги нужно поместить только ссылка и сумма(строк)
усё.
7 Wefast
 
08.04.19
10:51
(5) Не надо мне по документу.

В шапке я заполняю данные из этих 3 значений выборки. Потом идут различия.

Но да ладно.

Оставил запрос как есть.


    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");  // мы получаем именно объект
    Макет = ОбработкаОбъект.ПолучитьМакет("ПриказРаспоряжениеОПоощренииСотрудников");
    НастройкиПечатныхФорм = ЗарплатаКадрыПовтИсп.НастройкиПечатныхФорм();
    
    ДокументРезультат = Новый ТабличныйДокумент;
    
    ДокументРезультат.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Премия_Т11а";
    ДокументРезультат.ОриентацияСтраницы= ОриентацияСтраницы.Портрет;
    ДокументРезультат.АвтоМасштаб = Истина;
    
    ВалютаУчета = ЗарплатаКадры.ВалютаУчетаЗаработнойПлаты();
    
    ОбластьМакетаШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьМакетаШапкаПовторятьПриПечати = Макет.ПолучитьОбласть("ШапкаПовторятьПриПечати");
    ОбластьМакетаСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьМакетаПодвал = Макет.ПолучитьОбласть("Подвал");
    ОбластьМакетаИтого =  Макет.ПолучитьОбласть("ОбластьИтого");
    // получаем данные для печати
    
    ДанныеДляПечати = ДанныеДляПечатиОПоощренииСотрудника(МассивОбъектов).Выбрать();
    ПервыйДокумент = Истина;
    

    Пока ДанныеДляПечати.СледующийПоЗначениюПоля("Ссылка") Цикл
        Если ПервыйДокумент Тогда
            ПервыйДокумент = Ложь;
        Иначе
            // Все документы нужно выводить на разных страницах.
            ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
        
        // Запомним номер строки, с которой начали выводить текущий документ.
        НомерСтрокиНачало = ДокументРезультат.ВысотаТаблицы + 1;
        
        ОбластьМакетаШапка.Параметры.Заполнить(ДанныеДляПечати);
        ОбластьМакетаШапка.Параметры.НомерДокумента = КадровыйУчетРасширенный.НомерКадровогоПриказа(ДанныеДляПечати.НомерДокумента);
        ДокументРезультат.Вывести(ОбластьМакетаШапка);
        
        Итого = 0;
        Сч = 1;
        Общ = ДанныеДляПечати.Ссылка.Начисления.Количество();
        Пока ДанныеДляПечати.Следующий() Цикл
            Итого = Итого + ДанныеДляПечати.Результат;
            ОбластьМакетаСтрока.Параметры.Заполнить(ДанныеДляПечати);
            ОбластьМакетаСтрока.Параметры.Сотрудник = ДанныеДляПечати.ФИОПолные;
            Если Формат(ДанныеДляПечати.ДатаОкончания,"ДФ=dd.MM.yyyy") <>  "" тогда
                ОбластьМакетаСтрока.Параметры.Период = "С " + Формат(ДанныеДляПечати.ДатаНазначения,"ДФ=dd.MM.yyyy") + " по " + Формат(ДанныеДляПечати.ДатаОкончания,"ДФ=dd.MM.yyyy");
            Иначе
                ОбластьМакетаСтрока.Параметры.Период = "С " + Формат(ДанныеДляПечати.ДатаНазначения,"ДФ=dd.MM.yyyy");
            КонецЕсли;
                        
            Если НастройкиПечатныхФорм.ВыводитьПолнуюИерархиюПодразделений И ЗначениеЗаполнено(ОбластьМакетаСтрока.Параметры.Подразделение) Тогда
                ОбластьМакетаСтрока.Параметры.Подразделение = ОбластьМакетаСтрока.Параметры.Подразделение.ПолноеНаименование();
            КонецЕсли;
            
            МассивВыводимыхОбластей = Новый Массив;
            Если Сч = Общ Тогда
                МассивВыводимыхОбластей.Добавить(ОбластьМакетаСтрока);
                МассивВыводимыхОбластей.Добавить(ОбластьМакетаПодвал);
            Иначе
                МассивВыводимыхОбластей.Добавить(ОбластьМакетаСтрока);
            КонецЕсли;
                
            Если НЕ ОбщегоНазначения.ПроверитьВыводТабличногоДокумента(ДокументРезультат, МассивВыводимыхОбластей) Тогда
                ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
                ДокументРезультат.Вывести(ОбластьМакетаШапкаПовторятьПриПечати);
            КонецЕсли;
            
            ДокументРезультат.Вывести(ОбластьМакетаСтрока);
            Сч = Сч+1;
        КонецЦикла;
        ОбластьМакетаИтого.Параметры.Итого  = Итого;
        ДокументРезультат.Вывести(ОбластьМакетаИтого);
        
        ОбластьМакетаПодвал.Параметры.Заполнить(ДанныеДляПечати);
        ДокументРезультат.Вывести(ОбластьМакетаПодвал);
        
    КонецЦикла;
    
    Возврат ДокументРезультат;


Что то такое в общем вышло.
все для работы строк
            Если Сч = Общ Тогда
                МассивВыводимыхОбластей.Добавить(ОбластьМакетаСтрока);
                МассивВыводимыхОбластей.Добавить(ОбластьМакетаПодвал);
            Иначе
                МассивВыводимыхОбластей.Добавить(ОбластьМакетаСтрока);
            КонецЕсли;
8 Wefast
 
08.04.19
10:52
Чтобы проверка вывода подвала была только для последней строки документа
9 RomanYS
 
08.04.19
11:03
(7) Если мы говорим про производительность, то
Общ = ДанныеДляПечати.Ссылка.Начисления.Количество();
просто камень на могилу
10 Wefast
 
08.04.19
11:15
(9) Что поделать, запрос что то не очень понятно как вывести как мне нужно.
Как мне сгруппировать и вывести, чтобы
я получил первые 3 значения при первой выборке.
Я бы смог написать Выборка.Количество() и получить как я думаю количество строк текущей группировки
11 RomanYS
 
08.04.19
11:19
(10) Никакой проблемы получить признак последней строки в запросе (с итогами или без) нет.
12 Wefast
 
08.04.19
11:28
(11) как?
13 Wefast
 
08.04.19
11:30
Можно наверное соединить таблицу саму с собой, сгруппировать по первой таблице, а из другой таблицы количестворазличных. И во вложенный
14 RomanYS
 
08.04.19
11:36
(12) (13) много вариантов. Итоги, максимум(НомерСтроки) и т.д.
15 patria0muerte
 
08.04.19
13:59
Сделай 2мя пакетами. Один свернутый по группировкам как тебе надо, второй - детальный.

Обходишь первый и получаешь данные из второго через НайтиСледующий().

Количество строк в документе - можешь получить в первом пакете при группировке "КОЛИЧЕСТВО(Док)"
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn