gifts2017

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

Опубликовал sckif (sckif) в раздел Программирование - Практика программирования

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

 

 

 

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

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

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

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

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

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


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

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

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

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

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

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

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

 

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

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

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

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

 

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

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

 

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

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

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

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

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

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

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

        КонецЦикла;

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

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

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

 

См. также

Автор запретил комментарии