Имя: Пароль:
1C
1C 7.7
v7: Запрос, отчет, Группировка Без Упорядочивания
0 YDen
 
23.06.19
10:34
Здравствуйте.
Подскажите плиз. Самопальная конфигурация. Есть документ с ТЧ. В ТЧ данные внесены в особом порядке (текст), не по алфавиту. В отчете запрос к этому документу:
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы Проведенные;  
    |Предмет = Документ.Аттестат.Предмет;  
    |ПредметДоп = Документ.Аттестат.ПредметДоп;
    |Класс = Документ.Аттестат.Класс;
    |УченикФамилия = Документ.Аттестат.Фамилия;
    |УченикИмя = Документ.Аттестат.Имя;
    |УченикОтчество = Документ.Аттестат.Отчество;
    |ДатаРождения = Документ.Аттестат.ДатаРождения;    
    |ДатаВыдачи = Документ.Аттестат.ДатаВыдачи;
    |Оценка = Документ.Аттестат.Оценка;
    |НомерАттестат = Документ.Аттестат.НомерАттестат;
    |ДатаАттестат = Документ.Аттестат.ДатаВыдачи;
    |ДатаДок = Документ.КлЖурнал1.ДатаДок;
    |НомерДок=Документ.КлЖурнал1.НомерДок;
    |Группировка НомерАттестат;
    |Группировка Предмет Без Упорядочивания;
    |Условие (ПустаяСтрока(НомерАттестат)=0);  
    |"//}}ЗАПРОС
    ;      
Далее этими группировками заполняются две ТЗ - для вывода в печатную форму. Речь о группировке Предмет. В печатной форме вывод предметов идет по алфавиту. Мне же нужно, чтобы вывод был в таком же порядке, как и в ТЧ исходного документа. Плиз, посоветуйте, как это можно сделать?

Весь код:
Перем Фирма,АвторДокумента, ФИО, ФИОД, Классный;  
//**********************************************      
//******************************************************************************
// РасшифровкаОбновить(Обновить)
//
// Параметры:
//  Обновить =     1 - нажата кнопка "Обновить"
//                2 - нажата кнопка "Настройка"    
//
// Возвращаемое значение:
//    Расшифровка (список значений)
//
// Вызывается из формул элементов диалога:
//  из таблицы, кнопки "Обновить" и "Настройка"
//
// Описание:  
//    функция для стандартного механизма кнопок ""Обновить" и "Настройка""
//  помещает значение параметра в список Расшифровка  и возвращает этот список
//

//Функция РасшифровкаОбновить(Обновить)
//    
//    Расшифровка.Установить("Обновить", Обновить);
//    Возврат Расшифровка;
//    
//КонецФункции //РасшифровкаОбновить()                                            

//******************************************************************************

Процедура ПриОткрытии()
    Тип=Перечисление.ВидРаботы.аттестат;
    ВыбНачПериода='20.06.2019';
    ВыбКонПериода=ТекущаяДата();
    АвторДокумента=СокрЛП(ИмяПользователя());
    Фирма=СокрЛП(Константа.НаименованиеУч);
КонецПроцедуры  
                                              
//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы Проведенные;  
    |Предмет = Документ.Аттестат.Предмет;  
    |ПредметДоп = Документ.Аттестат.ПредметДоп;
    |Класс = Документ.Аттестат.Класс;
    |УченикФамилия = Документ.Аттестат.Фамилия;
    |УченикИмя = Документ.Аттестат.Имя;
    |УченикОтчество = Документ.Аттестат.Отчество;
    |ДатаРождения = Документ.Аттестат.ДатаРождения;    
    |ДатаВыдачи = Документ.Аттестат.ДатаВыдачи;
    |Оценка = Документ.Аттестат.Оценка;
    |НомерАттестат = Документ.Аттестат.НомерАттестат;
    |ДатаАттестат = Документ.Аттестат.ДатаВыдачи;
    |ДатаДок = Документ.КлЖурнал1.ДатаДок;
    |НомерДок=Документ.КлЖурнал1.НомерДок;
    |Группировка НомерАттестат;
    |Группировка Предмет Без Упорядочивания;
    |Условие (ПустаяСтрока(НомерАттестат)=0);  
    |"//}}ЗАПРОС
    ;      
    
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Журнал");
    
    // Заполнение полей "Заголовок"

    Таб.ВывестиСекцию("Заголовок");
    
    ТЗШ=СоздатьОбъект("ТаблицаЗначений");
    ТЗУ=СоздатьОбъект("ТаблицаЗначений");

    стр=1;
    
    Пока Запрос.Группировка(1) = 1 Цикл
            Ном=1;
            оц1=4;
            шап=0;
            
            ТЗУ.НоваяКолонка("УченикФИО","Строка");  
            ТЗУ.НоваяКолонка("НомерАттестат","Строка");
            ТЗУ.НоваяКолонка("ДатаРождения","Дата");    
            ТЗУ.НоваяКолонка("ДатаВыдачи","Дата");
            ТЗУ.НоваяСтрока();
            ТЗШ.НоваяСтрока();
      
            ТЗУ.НомерАттестат=Запрос.НомерАттестат;
            ТЗУ.УченикФИО=СокрЛП(Запрос.УченикФамилия)+" "+СокрЛП(Запрос.УченикИмя)+" "+СокрЛП(Запрос.УченикОтчество);
            ТЗУ.ДатаРождения=Запрос.ДатаРождения;
            ТЗУ.ДатаВыдачи=Запрос.ДатаВыдачи;
            
            Пока Запрос.Группировка(2) = 1 Цикл
                шап=шап+1;
                ТЗШ.НоваяКолонка();
                ТЗУ.НоваяКолонка();
                ТЗШ.УстановитьЗначение(1,шап,Запрос.Предмет);
                  
                оц1=оц1+1;
                
                Если Запрос.Оценка=Перечисление.Оценка.хорошо Тогда
                    Оценка=4;
                КонецЕсли;
                Если Запрос.Оценка=Перечисление.Оценка.отлично Тогда
                    Оценка=5;
                КонецЕсли;          
                Если Запрос.Оценка=Перечисление.Оценка.удовл Тогда
                    Оценка=3;
                КонецЕсли;  
                Если Запрос.Оценка=Перечисление.Оценка.неудовл Тогда
                    Оценка=2;
                КонецЕсли;
                Если Запрос.Оценка=Перечисление.Оценка.отсут Тогда
                    Оценка="н";
                КонецЕсли;
                      
                ТЗУ.УстановитьЗначение(1,оц1,Оценка);  
                Оценка=0;
            КонецЦикла;    
                        
            //ТЗШ.ВыбратьСтроку();    
            
            ТЗШ.ВыбратьСтроки() ;
            Пока ТЗШ.ПолучитьСтроку()=1 Цикл
                Таб.ВывестиСекцию("Шапка|Основа");
                Для i=1 По ТЗШ.КоличествоКолонок() Цикл
                    ЗначениеШапка=ТЗШ.ПолучитьЗначение(1,i);
                    Таб.ПрисоединитьСекцию("Шапка|Верт");
                    
                КонецЦикла;
            КонецЦикла;
            
            ТЗУ.ВыбратьСтроки() ;
            Пока ТЗУ.ПолучитьСтроку()=1 Цикл
                Таб.ВывестиСекцию("Список|Основа");
                //Таб.ВывестиСекцию("Список|Среднее");
                Для i=5 По ТЗУ.КоличествоКолонок() Цикл
                    ЗначениеСписок=ТЗУ.ПолучитьЗначение(1,i);
                    Если ЗначениеСписок=0 Тогда
                        ЗначениеТекст="";
                    Иначе ЗначениеТекст=СокрЛП(ЗначениеСписок);
                    КонецЕсли;
                    Таб.ПрисоединитьСекцию("Список|Верт") ;
                КонецЦикла;
                //Таб.ПрисоединитьСекцию("Заголовок|Среднее");  
            КонецЦикла;
            
            ТЗУ.Очистить();
            ТЗШ.Очистить();
            стр=стр+1;
            
            
            Если стр=6 Тогда
                Таб.НоваяСтраница() ;
                стр=1;
            КонецЕсли;
            
            
        КонецЦикла;
    
  
    Таб.ВывестиСекцию("Подвал");
    
    Таб.ТолькоПросмотр(1);
    Таб.ПараметрыСтраницы(2,100,,10,10,10,10);
    Таб.Показать("Выданные аттестаты с "+ВыбНачПериода+" по "+ВыбКонПериода);
    
КонецПроцедуры


Благодарю
1 ДенисЧ
 
23.06.19
10:40
Попробуй добавить сортировку по НомерСтроки (под рукой клюшек нет, так что могу и наврать)
2 YDen
 
23.06.19
11:43
(1) Там после запроса уже по алфавиту упорядоченные предметы вылетают.
3 MWWRuza
 
гуру
23.06.19
12:01
А не проще вообще без запроса сделать?
ВыбратьДокументы(...)
...ВыбратьСтроки()
ИМХО не та задача, что-бы запрос городить...
4 YDen
 
23.06.19
12:23
Сделал:

Перем Фирма,АвторДокумента, ФИО, ФИОД, Классный;  
//**********************************************      
//******************************************************************************
// РасшифровкаОбновить(Обновить)
//
// Параметры:
//  Обновить =     1 - нажата кнопка "Обновить"
//                2 - нажата кнопка "Настройка"    
//
// Возвращаемое значение:
//    Расшифровка (список значений)
//
// Вызывается из формул элементов диалога:
//  из таблицы, кнопки "Обновить" и "Настройка"
//
// Описание:  
//    функция для стандартного механизма кнопок ""Обновить" и "Настройка""
//  помещает значение параметра в список Расшифровка  и возвращает этот список
//

//Функция РасшифровкаОбновить(Обновить)
//    
//    Расшифровка.Установить("Обновить", Обновить);
//    Возврат Расшифровка;
//    
//КонецФункции //РасшифровкаОбновить()                                            

//******************************************************************************

Процедура ПриОткрытии()
    Тип=Перечисление.ВидРаботы.аттестат;
    ВыбНачПериода='20.06.2019';
    ВыбКонПериода=ТекущаяДата();
    АвторДокумента=СокрЛП(ИмяПользователя());
    Фирма=СокрЛП(Константа.НаименованиеУч);
КонецПроцедуры  
                                              
//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы Проведенные;  
    |Предмет = Документ.Аттестат.Предмет;  
    |ПредметДоп = Документ.Аттестат.ПредметДоп;
    |Класс = Документ.Аттестат.Класс;
    |УченикФамилия = Документ.Аттестат.Фамилия;
    |УченикИмя = Документ.Аттестат.Имя;
    |УченикОтчество = Документ.Аттестат.Отчество;
    |ДатаРождения = Документ.Аттестат.ДатаРождения;    
    |ДатаВыдачи = Документ.Аттестат.ДатаВыдачи;
    |Оценка = Документ.Аттестат.Оценка;
    |НомерАттестат = Документ.Аттестат.НомерАттестат;
    |НомерПредмет = Документ.Аттестат.НомерСтроки;
    |ДатаАттестат = Документ.Аттестат.ДатаВыдачи;
    |ДатаДок = Документ.КлЖурнал1.ДатаДок;
    |НомерДок=Документ.КлЖурнал1.НомерДок;
    |Группировка НомерАттестат;
    |Группировка Предмет Без Упорядочивания;
    |Условие (ПустаяСтрока(НомерАттестат)=0);  
    |"//}}ЗАПРОС
    ;      
    
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Журнал");
    
    // Заполнение полей "Заголовок"

    Таб.ВывестиСекцию("Заголовок");
    
    ТЗШ=СоздатьОбъект("ТаблицаЗначений");  
    
    ТЗШТемп=СоздатьОбъект("ТаблицаЗначений");
    
    ТЗУ=СоздатьОбъект("ТаблицаЗначений");

    стр=1;
    
    Пока Запрос.Группировка(1) = 1 Цикл
            Ном=1;
            оц1=4;
            шап=0;    
            
            ТЗШТемп.НоваяКолонка("НомерСтрокаПредмет","Число");  
            ТЗШТемп.НоваяКолонка("Предмет","Строка");
            ТЗШТемп.НоваяКолонка("Оценка","Перечисление.Оценка");
            
            ТЗУ.НоваяКолонка("УченикФИО","Строка");  
            ТЗУ.НоваяКолонка("НомерАттестат","Строка");
            ТЗУ.НоваяКолонка("ДатаРождения","Дата");    
            ТЗУ.НоваяКолонка("ДатаВыдачи","Дата");
            ТЗУ.НоваяСтрока();
            ТЗШ.НоваяСтрока();
      
            ТЗУ.НомерАттестат=Запрос.НомерАттестат;
            ТЗУ.УченикФИО=СокрЛП(Запрос.УченикФамилия)+" "+СокрЛП(Запрос.УченикИмя)+" "+СокрЛП(Запрос.УченикОтчество);
            ТЗУ.ДатаРождения=Запрос.ДатаРождения;
            ТЗУ.ДатаВыдачи=Запрос.ДатаВыдачи;
            
            Пока Запрос.Группировка(2) = 1 Цикл
                
                ТЗШТемп.НоваяСтрока();
                ТЗШТемп.НомерСтрокаПредмет=Запрос.НомерПредмет;
                ТЗШТемп.Предмет=Запрос.Предмет;
                ТЗШТемп.Оценка=Запрос.Оценка;
                
                ТЗУ.НоваяКолонка();
            КонецЦикла;
                
    
            //ТЗШТемп.ВыбратьСтроку();
            
            ТЗШТемп.Сортировать("НомерСтрокаПредмет+");  
            
            ТЗШТемп.ВыбратьСтроки() ;
            Пока ТЗШТемп.ПолучитьСтроку()=1 Цикл
                шап=шап+1;
                ТЗШ.НоваяКолонка();
                ТЗШ.УстановитьЗначение(1,шап,ТЗШТемп.Предмет);
        
                оц1=оц1+1;
                
                Если ТЗШТемп.Оценка=Перечисление.Оценка.хорошо Тогда
                    Оценка=4;
                КонецЕсли;
                Если ТЗШТемп.Оценка=Перечисление.Оценка.отлично Тогда
                    Оценка=5;
                КонецЕсли;          
                Если ТЗШТемп.Оценка=Перечисление.Оценка.удовл Тогда
                    Оценка=3;
                КонецЕсли;  
                Если ТЗШТемп.Оценка=Перечисление.Оценка.неудовл Тогда
                    Оценка=2;
                КонецЕсли;
                Если ТЗШТемп.Оценка=Перечисление.Оценка.отсут Тогда
                    Оценка="н";
                КонецЕсли;
                      
                ТЗУ.УстановитьЗначение(1,оц1,Оценка);  
                Оценка=0;    
            КонецЦикла;
            
            
            ТЗШ.ВыбратьСтроки() ;
            Пока ТЗШ.ПолучитьСтроку()=1 Цикл
                Таб.ВывестиСекцию("Шапка|Основа");
                Для i=1 По ТЗШ.КоличествоКолонок() Цикл
                    ЗначениеШапка=ТЗШ.ПолучитьЗначение(1,i);
                    Таб.ПрисоединитьСекцию("Шапка|Верт");
                    
                КонецЦикла;
            КонецЦикла;
            
            ТЗУ.ВыбратьСтроки() ;
            Пока ТЗУ.ПолучитьСтроку()=1 Цикл
                Таб.ВывестиСекцию("Список|Основа");
                //Таб.ВывестиСекцию("Список|Среднее");
                Для i=5 По ТЗУ.КоличествоКолонок() Цикл
                    ЗначениеСписок=ТЗУ.ПолучитьЗначение(1,i);
                    Если ЗначениеСписок=0 Тогда
                        ЗначениеТекст="";
                    Иначе ЗначениеТекст=СокрЛП(ЗначениеСписок);
                    КонецЕсли;
                    Таб.ПрисоединитьСекцию("Список|Верт") ;
                КонецЦикла;
                //Таб.ПрисоединитьСекцию("Заголовок|Среднее");  
            КонецЦикла;
            
            ТЗУ.Очистить();
            ТЗШ.Очистить();
            ТЗШТемп.Очистить();
            стр=стр+1;
            
            
            Если стр=6 Тогда
                Таб.НоваяСтраница() ;
                стр=1;
            КонецЕсли;
            
            
        КонецЦикла;
    
  
    Таб.ВывестиСекцию("Подвал");
    
    Таб.ТолькоПросмотр(1);
    Таб.ПараметрыСтраницы(2,100,,10,10,10,10);
    Таб.Показать("Выданные аттестаты с "+ВыбНачПериода+" по "+ВыбКонПериода);
    
КонецПроцедуры
5 YDen
 
23.06.19
12:24
(3) Да, вы правы. Но эту конфигурацию я писал много лет назад. Сейчас стояла задача минимальными средствами подкорректировать формирование печатной формы.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс