СКД. Работа с программным отбором, группировкой, набором данных, пользовательскими полями.

СКД. Работа с программным отбором, группировкой, набором данных, пользовательскими полями.

 

 

 

////////////////////////////////////////////////////////////////////////////////
// ОТБОР

//Процедура устанавливает значения параметров в запросе.
//   Имя — Имя параметра
//   Значение — Значение для отбора
Процедура УстановитьПараметрКомпоновки (Имя,Значение)
         КомпоновкаДанныхПараметр =
         КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(Имя);

         Если НЕ(КомпоновкаДанныхПараметр = Неопределено) Тогда
                       КомпоновкаДанныхПараметр.Значение = Значение;
                       КомпоновкаДанныхПараметр.Использование = Истина;
         Иначе   Сообщить(«Параметр «+Имя+« не найден«);
         КонецЕсли;
КонецПроцедуры

//Процедура устанавливает отбор по полям запроса.
//   Имя — Имя поля
//   Значение — Значение для отбора
//   ВидСравнения — ВидСравненияКомпоновкиДанных
Процедура
УстановтьОтборПоПолюКомпоновки(Имя,Значение,ВидСравнения)

         Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
              Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Имя) И ЭлементОтбора.ВидСравнения = ВидСравнения Тогда
                    КомпоновщикНастроек.Настройки.Отбор.Элементы.Удалить(ЭлементОтбора);
              КонецЕсли;
         КонецЦикла;
         ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
         ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Имя);

         ЭлементОтбора.ВидСравнения = ВидСравнения;
         ЭлементОтбора.ПравоеЗначение = Значение;
         ЭлементОтбора.Использование = Истина;
КонецПроцедуры


ниже приведенный материал взят отсюда //infostart.ru/public/19793/

////////////////////////////////////////////////////////////////////////////////
// НАБОРЫ ДАННЫХ

// Процедура добавляет или удаляет набор данных из схемы компоновки данных
//
//    Схема — СхемаКомпоновкиДанных, схема, в которой нужно добавить(удалить) набор данных
//    СхемаИсточник — СхемаКомпоновкиДанных, схема из которой копируется набор данных
//    ИмяНабора     — Строка
//    Добавить      — Булево
//    НаборДанныхРодитель — НаборДанныхОбъединениеСхемыКомпоновкиДанных
Процедура ДобавитьУдалитьНаборДанных(Схема, СхемаИсточник, ИмяНабора, Добавить, НаборДанныхРодитель)

       НаборДанных = НайтиНаборДанных(Схема.НаборыДанных, ИмяНабора);
       Если Добавить Тогда
               Если НаборДанных = Неопределено Тогда
                           НаборДанныхИсточник = НайтиНаборДанных(СхемаИсточник.НаборыДанных, ИмяНабора);
                           НаборДанных = НаборДанныхРодитель.Элементы.Добавить(Тип(«НаборДанныхЗапросСхемыКомпоновкиДанных»));
                           НаборДанных.Имя = НаборДанныхИсточник.Имя;
                           НаборДанных.ИсточникДанных = НаборДанныхИсточник.ИсточникДанных;
                           НаборДанных.Запрос = НаборДанныхИсточник.Запрос;
               КонецЕсли;
        Иначе
               Если НаборДанных <> Неопределено Тогда
                       НаборДанныхРодитель.Элементы.Удалить(НаборДанных);
               КонецЕсли;
        КонецЕсли;
КонецПроцедуры

Функция НайтиНаборДанных(НаборыДанных, Имя)
       Если НаборыДанных = Неопределено Тогда
               Возврат Неопределено;
       КонецЕсли;

       Для каждого НаборДанных Из НаборыДанных Цикл
               Если НаборДанных.Имя = Имя Тогда
                       Возврат НаборДанных;
               КонецЕсли;

               Если ТипЗнч(НаборДанных) = Тип(«НаборДанныхОбъединениеСхемыКомпоновкиДанных») Тогда
                      Результат = НайтиНаборДанных(НаборДанных.Элементы, Имя);
                       Если Результат <> Неопределено Тогда
                               Возврат Результат;
                       КонецЕсли;
               КонецЕсли;
       КонецЦикла;
       Возврат Неопределено;
КонецФункции

 

////////////////////////////////////////////////////////////////////////////////
// ГРУППИРОВКИ

// Функция находит группировку в компоновке
//    Структура — КомпоновщикНастроек.Настройки.Структура
//    Имя       — Имя поля в группировке
//    Возвращаемое значение:  ПолеКомпоновкиДанных
Функция НайтиГруппировку(Структура, Имя, ВидГруппировки = «Поле»)

       Для Каждого Элемент Из Структура Цикл
              Если ТипЗнч(Элемент) = Тип(«ТаблицаКомпоновкиДанных») Тогда
                       Результат = НайтиГруппировку(Элемент.Строки,  Имя);
                       Если Результат <> Неопределено Тогда
                               Возврат Результат;
                       КонецЕсли;  
             
                       Результат = НайтиГруппировку(Элемент.Колонки, Имя);
                       Если Результат <> Неопределено Тогда
                               Возврат Результат;
                       КонецЕсли;
               ИначеЕсли ТипЗнч(Элемент) = Тип(«ГруппировкаТаблицыКомпоновкиДанных») Тогда
                       Для Каждого Поле Из Элемент.ПоляГруппировки.Элементы Цикл
                              Если Поле.Поле = Новый ПолеКомпоновкиДанных(Имя) Тогда
                                     Если ВидГруппировки = «Поле» Тогда
                                            Результат = Поле;
                                     Иначе
                                            Результат = Элемент;
                                     КонецЕсли;                                   
                                     Возврат Результат;
                               КонецЕсли;
                       КонецЦикла;
                       Результат = НайтиГруппировку(Элемент.Структура, Имя);
               КонецЕсли;
        КонецЦикла;

        Возврат Результат;
КонецФункции

 

// Процедура добавляет в каждую группировку отчета отбор по непустому значению
//     Структура — КомпоновщикНастроек.Настройки.Структура
//     ДоступныеПоляГруппировок — КомпоновщикНастроек.ДоступныеПоляГруппировок
Процедура ОтборПоНепустым(Структура)
          Для Каждого Элемент Из Структура Цикл
               Если ТипЗнч(Элемент) = Тип(«ТаблицаКомпоновкиДанных») Тогда
                       ОтборПоНепустым(Элемент.Строки);
                       ОтборПоНепустым(Элемент.Колонки);
               ИначеЕсли ТипЗнч(Элемент) = Тип(«ГруппировкаТаблицыКомпоновкиДанных») Тогда
                       Для Каждого Поле Из Элемент.ПоляГруппировки.Элементы Цикл
                              ЭлементОтбора = Неопределено;
                              Для Каждого ЭлементОтбора1 Из Элемент.Отбор.Элементы Цикл
                                      Если ЭлементОтбора1.Представление = «Отбор по непустому» Тогда
                                              ЭлементОтбора = ЭлементОтбора1;
                                      КонецЕсли;
                               КонецЦикла;                             

                               Если ЭлементОтбора = Неопределено Тогда
                                      ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
                                      ЭлементОтбора.Представление = «Отбор по непустому»;
                               КонецЕсли;
                               ЭлементОтбора.ЛевоеЗначение  = Поле.Поле;
                               ЭлементОтбора.ВидСравнения  = ВидСравненияКомпоновкиДанных.Заполнено;
                               ЭлементОтбора.Использование = Истина;
                               Параметр = Элемент.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«FilterOutput»));
                               Параметр.Использование = Истина;
                               Параметр.Значение  = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;
                       КонецЦикла;
                       ОтборПоНепустым(Элемент.Структура);
               КонецЕсли;
        КонецЦикла;
КонецПроцедуры

 

////////////////////////////////////////////////////////////////////////////////
// ПОЛЬЗОВАТЕЛЬСКИЕ ПОЛЯ

// Процедура добавляет значения интервалов в пользовательское поле
//     ПолеИнтервалы — ПользовательскоеПолеВыборКомпоновкиДанных
//     Интервал — Строка содержащия границы интервалов: 30,60,90
Процедура УстановитьПользовательскоеПолеИнтервал(ПолеИнтервалы, Интервал)
        Если ПустаяСтрока(Интервал) Тогда
               Возврат;
        КонецЕсли;

        Стр = Интервал;
        Стр = СтрЗаменить(Стр, «,», Символы.ПС);
        ПредИнтервал = «0»   

        Для Счетчик = 1 По СтрЧислоСтрок(Стр) Цикл
               ТекИнтервал = СокрЛП(СтрПолучитьСтроку(Стр, Счетчик));
               Вариант = ПолеИнтервалы.Варианты.Элементы.Добавить();
               Вариант.Использование = Истина;
               Если Счетчик = 1 Тогда
                       Вариант.Значение = «До « + ТекИнтервал;
                       Вариант.Представление = «До « + ТекИнтервал;
               Иначе
                       Вариант.Значение = «От « + ПредИнтервал + » до « + ТекИнтервал;
                       Вариант.Представление = «От « + ПредИнтервал + » до « + ТекИнтервал;
               КонецЕсли;

               Группа = Вариант.Отбор.Элементы.Добавить(Тип(«ГруппаЭлементовОтбораКомпоновкиДанных»));
               Группа.Использование = Истина;
               Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ            

               Если Счетчик > 1 Тогда
                       ЭлементОтбора = Группа.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
                       ЭлементОтбора.Использование  = Истина;
                       ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(«ДнейПросрочки»);
                       ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
                       ЭлементОтбора.ПравоеЗначение = Число(ПредИнтервал);
               КонецЕсли;            

               ЭлементОтбора = Группа.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
               ЭлементОтбора.Использование  = Истина;
               ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(«ДнейПросрочки»);
               ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Меньше;
               ЭлементОтбора.ПравоеЗначение = Число(ТекИнтервал);
               ПредИнтервал = ТекИнтервал;

        КонецЦикла;

        Вариант = ПолеИнтервалы.Варианты.Элементы.Добавить();
        Вариант.Значение = «Более « + ПредИнтервал;
        Вариант.Представление = «Более « + ПредИнтервал;

        Группа = Вариант.Отбор.Элементы.Добавить(Тип(«ГруппаЭлементовОтбораКомпоновкиДанных»));
        Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ     

        ЭлементОтбора = Группа.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
        ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ДнейПросрочки»);
        ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
        ЭлементОтбора.ПравоеЗначение = Число(ПредИнтервал);    
КонецПроцедуры

 

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *