create or replace package PKG_P8PANELS_RRPCONFED as

  /* Добавление показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_INSERT
  (
    NPRN                    in number,   -- Рег. номер раздела
    SCODE                   in varchar2, -- Мнемокод показателя раздела
    SNAME                   in varchar2, -- Наименование показателя раздела
    NRRPROW                 in number,   -- Рег. номер строки
    SRRPROW                 in varchar2, -- Код строки (игнорируется, если указан рег. номер строки)
    SRRPVERSION_ROW         in varchar2, -- Код редакции строки (игнорируется, если указан рег. номер строки)
    NRRPCOLUMN              in number,   -- Рег. номер графы
    SRRPCOLUMN              in varchar2, -- Код графы
    SRRPVERSION_COLUMN      in varchar2, -- Код редакции графы
    NRN                     out number   -- Рег. номер созданной записи
  );
  
  /* Исправление показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_UPDATE
  (
    NRN                     in number,   -- Рег. номер показателя раздела            
    SCODE                   in varchar2, -- Мнемокод показателя раздела
    SNAME                   in varchar2, -- Наименование показателя раздела
    SRRPROW                 in varchar2, -- Код строки
    SRRPVERSION_ROW         in varchar2, -- Код редакции строки
    SRRPCOLUMN              in varchar2, -- Код графы
    SRRPVERSION_COLUMN      in varchar2  -- Код редакции графы
  );
  
  /* Удаление показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_DELETE
  (        
    NRN                     in number   -- Рег. номер показателя раздела
  );
  
  /* Получение раздела регламентированного отчёта */
  procedure RRPCONFSCTN_GET
  (
    NRRPCONFSCTN            in number,      -- Рег. номер раздела настройки форм регламентированного отчёта
    NROW_ORDER              in number := 0, -- Порядок сортировки строк (0 - по номеру, 1 - по коду, 2 - по мнемокоду)
    NCOL_ORDER              in number := 0, -- Порядок сортировки граф (0 - по номеру, 1 - по коду, 2 - по мнемокоду)
    COUT                    out clob        -- Данные раздела
  );

  /* Добавление раздела регламентированного отчёта */
  procedure RRPCONFSCTN_INSERT
  (
    NPRN                    in number,   -- Рег. номер настройки форм регламентированного отчёта
    SCODE                   in varchar2, -- Мнемокод
    SNAME                   in varchar2, -- Наименование
    NRN                     out number   -- Рег. номер созданной записи
  );
  
  /* Исправление раздела регламентированного отчёта */
  procedure RRPCONFSCTN_UPDATE
  (
    NRN                     in number,   -- Рег. номер раздела
    SCODE                   in varchar2, -- Мнемокод раздела
    SNAME                   in varchar2  -- Наименование раздела
  );
  
  /* Удаление раздела регламентированного отчёта */
  procedure RRPCONFSCTN_DELETE
  (
    NRN                     in number   -- Рег. номер раздела
  );
  
  /* Получение описания настройки регламентированного отчета */
  procedure RRPCONF_GET
  (
    NRRPCONF                in number,  -- Рег. номер настройки форм регламентированного отчёта
    COUT                    out clob    -- Описание настройки
  );
  
end PKG_P8PANELS_RRPCONFED;
/
create or replace package body PKG_P8PANELS_RRPCONFED as

  /* Константы - общие параметры формирования данных */
  NSECTION_NAME_MAX_LEN     constant PKG_STD.TNUMBER := 100; -- Максимальный отображаемый размер наименования раздела настройки (символов)
  
  /* Константы - параметры таблицы показателей раздела настройки РО */
  NMRKS_DG_COL_WIDTH        constant PKG_STD.TNUMBER := 250; -- Ширина колонки (пикселей)
  
  /* Константы - маски для формирования представления параметров состава показателя */
  SPRM_MASK_ACC_DC          constant PKG_STD.TSTRING := 'ДЕБЕТ_КРЕДИТ'; -- Маска для параметров "Счет дебет" и "Счет кредит"
  SPRM_MASK_ACC             constant PKG_STD.TSTRING := 'СЧЕТ';         -- Маска для параметров "Счет"
  SPRM_MASK_ACC_WO_ANL      constant PKG_STD.TSTRING := 'СЧЕТ_БЕЗ_АНЛ'; -- Маска для параметров "Счет" без учета аналитик
  SPRM_MASK_DATE_FROM       constant PKG_STD.TSTRING := 'ДАТА_С';       -- Маска для параметров "Дата с"
  SPRM_MASK_DATE_TO         constant PKG_STD.TSTRING := 'ДАТА_ПО';      -- Маска для параметров "Дата по"
  SPRM_MASK_RRPCONF         constant PKG_STD.TSTRING := 'НАСТРОЙКА';    -- Маска для параметров настройки РО
  
  /* Константы - мнемокоды разделов */
  SUNIT_RRPCONFSCTN         constant PKG_STD.TSTRING := 'RRPConfigSection';     -- Раздел настройки регламентированного отчета
  SUNIT_RRPCONFSCTNMRK      constant PKG_STD.TSTRING := 'RRPConfigSectionMark'; -- Показатель раздела настройки регламентированного отчета
  
  /* Константы - действия разделов */
  SACTION_DELETE            constant PKG_STD.TSTRING := 'DELETE'; -- Удаление
  
  /* Получение доступности действия раздела */
  function UTL_UNIT_ACTION_GET_ALLOW
  (
    NCOMPANY                in number,       -- Рег. номер организации
    NRN                     in number,       -- Рег. номер записи
    SUNIT                   in varchar2,     -- Мнемокод раздела (см. константы SUNIT_*)
    SACTION                 in varchar2      -- Действие (см. константы SACTION_*)   
  ) return                  number           -- Доступность действия (0 - недоступно, 1 - доступно)
  is
    NRESULT                 PKG_STD.TNUMBER; -- Доступность действия (0 - недоступно, 1 - доступно)
  begin
    /* Исходим отраздела */
    case SUNIT
      /* Раздел настройки регламентированного отчета */
      when SUNIT_RRPCONFSCTN then
        /* Исходим от действия */
        case SACTION
          /* Удаление */
          when SACTION_DELETE then
            begin
              /* Выполним типовую проверку */
              P_RRPCONFSCTN_BASE_CHECK(SMODE => 'D',
                                       RREC  => GET_RRPCONFSCTN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRN));
              /* Проверка пройдена - можно удалять */
              NRESULT := 1;
            exception
              /* Если проверка выдала ошибку - удаление невозможно */
              when others then
                NRESULT := 0;
            end;
          /* Действие неопределено - нельзя выполнять */
          else
            NRESULT := 0;
        end case;
      /* Показатель раздела настройки регламентированного отчета */
      when SUNIT_RRPCONFSCTNMRK then
        /* Исходим от действия */
        case SACTION
          /* Удаление */
          when SACTION_DELETE then
            begin
              /* Выполним типовую проверку */
              P_RRPCONFSCTNMRK_BASE_CHECK(SMODE => 'D',
                                          RREC  => GET_RRPCONFSCTNMRK_ID(NFLAG_SMART => 0,
                                                                         NCOMPANY    => NCOMPANY,
                                                                         NRN         => NRN));
              /* Проверка пройдена - можно удалять */
              NRESULT := 1;
            exception
              /* Если проверка выдала ошибку - удаление невозможно */
              when others then
                NRESULT := 0;
            end;
          /* Действие неопределено - нельзя выполнять */
          else
            NRESULT := 0;
        end case;
      /* Раздел неопределен - нельзя делать */
      else
        NRESULT := 0;
    end case;
    /* Возвращаем результат */
    return NRESULT;
  end UTL_UNIT_ACTION_GET_ALLOW;
  
  /* Считывание типа источинка состава показателя в текстовом представлении */
  function RRPCONFSCTNMRKCN_GET_ST
  (
    NSOURCE_TYPE            in number,       -- Тип источника
    SSOURCE_UNIT            in varchar2      -- Раздел источника
  ) return                  varchar2         -- Тип источника в текстовом представлении
  is
    SRESULT                 PKG_STD.TSTRING; -- Тип источника в текстовом представлении
  begin
    /* Строковое представление источника значения */
    case NSOURCE_TYPE
      when 0 then
        /* Исходим от раздела */
        case SSOURCE_UNIT
          when 'EconomicOperations' then
            SRESULT := 'ХО';
          when 'DebitorsCreditorsAccounts' then
            SRESULT := 'РСДК';
          when 'AccountsRemnants' then
            SRESULT := 'ОС';
          when 'ValuesRemnants' then
            SRESULT := 'ТМЦ';
          when 'DebitorsCreditorsRemnants' then
            SRESULT := 'ДКЗ';
          when 'Inventory' then
            SRESULT := 'ИК';
          when 'ItemsCards' then
            SRESULT := 'МБП';
          when 'OperCards' then
            SRESULT := 'КОБП';
          when 'DeclarationIncome' then
            SRESULT := 'ДПНП';
          when 'RRPDocuments' then
            SRESULT := 'РО';
          else
            SRESULT := null;
        end case;
      when 1 then
        SRESULT := 'РП';
      when 2 then
        SRESULT := 'ХП';
      when 3 then
        SRESULT := 'СЗ';
      when 4 then
        SRESULT := 'fx';
      else
        SRESULT := null;
    end case;
    /* Возвращаем результат */
    return SRESULT;
  end RRPCONFSCTNMRKCN_GET_ST;
    
  /* Считывание знака состава показателя в текстовом представлении */
  function RRPCONFSCTNMRKCN_GET_SIGN
  (
    NSIGN                   in number        -- Знак состава показателя
  ) return                  varchar2         -- Знак состава показателя в текстовом представлении
  is
    SRESULT                 PKG_STD.TSTRING; -- Знак состава показателя в текстовом представлении
  begin
    /* Опеределяем знак */
    case NSIGN
      when 0 then
        SRESULT := '+';
      when 1 then
        SRESULT := '-';
      else
        SRESULT := '+/-';
    end case;
    /* Возвращаем результат */
    return SRESULT;
  end RRPCONFSCTNMRKCN_GET_SIGN;

  /* Формирование описателя состава показателя регламентированного отчета */
  function RRPCONFSCTNMRKCN_GET_DESC
  (
    NCOMPANY                in number,                -- Рег. номер организации
    NRRPCONFSCTNMRKCN       in number                 -- Рег. номер состава показателя регламентированного отчета
  ) return                  varchar2                  -- Описатель показателя
  is
    SRESULT                 PKG_STD.TSTRING;          -- Описатель показателя
    SCN_DESC                PKG_STD.TSTRING;          -- Основные параметры состава показателя
    RREC                    RRPCONFSCTNMRKCN%rowtype; -- Запись состава показателя регламентированного отчета
    RRRPCONFSCTNMRK         RRPCONFSCTNMRK%rowtype;   -- Запись показателя регламентированного отчета
  
    /* Считывание мнемокода показателя по рег. номеру состава показателя */
    function MARK_GET_CODE_BY_CN
    (
      NRRPCONFSCTNMRKCN     in number        -- Рег. номер состава показателя
    ) return                varchar2         -- Мнемокод показателя
    is
      SRESULT               PKG_STD.TSTRING; -- Мнемокод показателя
    begin
      /* Считываем мнемокод показателя */
      begin
        select M.CODE
          into SRESULT
          from RRPCONFSCTNMRKCN T,
               RRPCONFSCTNMRK   M
         where T.RN = NRRPCONFSCTNMRKCN
           and M.RN = T.PRN;
      exception
        when others then
          SRESULT := null;
      end;
      /* Возвращаем результат */
      return SRESULT;
    end MARK_GET_CODE_BY_CN;
    
    /* Считывание мнемокода настройки по рег. номеру состава показателя */
    function CONF_GET_CODE_BY_CN
    (
      NRRPCONFSCTNMRKCN     in number        -- Рег. номер состава показателя
    ) return                varchar2         -- Мнемокод настройки регламентированного отчета
    is
      SRESULT               PKG_STD.TSTRING; -- Мнемокод настройки регламентированного отчета
    begin
      /* Считываем мнемокод настройки регламентированного отчета */
      begin
        select C.CODE
          into SRESULT
          from RRPCONFSCTNMRKCN T,
               RRPCONFSCTNMRK   M,
               RRPCONF          C
         where T.RN = NRRPCONFSCTNMRKCN
           and M.RN = T.PRN
           and C.RN = M.RRPCONF;
      exception
        when others then
          SRESULT := null;
      end;
      /* Возвращаем результат */
      return SRESULT;
    end CONF_GET_CODE_BY_CN;
    
    /* Формирование представления параметров состава показателя */
    procedure MAKE_PRMS_BY_MASK
    (
      SPRMS_DESC            in out varchar2, -- Строковое представление параметров
      NCOMPANY              in number,       -- Рег. номер организации
      NRRPCONFSCTNMRKCN     in number,       -- Рег. номер состава показателя
      SMASK                 in varchar2      -- Маска (см. константы SPRM_MASK_*)
    )
    is
      SDATE_FROM            PKG_STD.TSTRING; -- Строковое представление "Дата с"
      SDATE_TO              PKG_STD.TSTRING; -- Строковое представление "Дата по"
      DDATE_FROM            PKG_STD.TLDATE;  -- ДАТА_С
      SDATE_FROM_PATTERN    PKG_STD.TSTRING; -- ДАТА_С_ШАБЛОН
      DDATE_TO              PKG_STD.TLDATE;  -- ДАТА_ПО
      SDATE_TO_PATTERN      PKG_STD.TSTRING; -- ДАТА_ПО_ШАБЛОН
      SACCOUNT_DEBIT        PKG_STD.TSTRING; -- СЧЕТ_ДЕБЕТ
      SANALYTIC_DEBIT1      PKG_STD.TSTRING; -- АНАЛИТИКА1_ДЕБЕТ
      SANALYTIC_DEBIT2      PKG_STD.TSTRING; -- АНАЛИТИКА2_ДЕБЕТ
      SANALYTIC_DEBIT3      PKG_STD.TSTRING; -- АНАЛИТИКА3_ДЕБЕТ
      SANALYTIC_DEBIT4      PKG_STD.TSTRING; -- АНАЛИТИКА4_ДЕБЕТ
      SANALYTIC_DEBIT5      PKG_STD.TSTRING; -- АНАЛИТИКА5_ДЕБЕТ
      SACCOUNT_CREDIT       PKG_STD.TSTRING; -- СЧЕТ_КРЕДИТ
      SANALYTIC_CREDIT1     PKG_STD.TSTRING; -- АНАЛИТИКА1_КРЕДИТ
      SANALYTIC_CREDIT2     PKG_STD.TSTRING; -- АНАЛИТИКА2_КРЕДИТ
      SANALYTIC_CREDIT3     PKG_STD.TSTRING; -- АНАЛИТИКА3_КРЕДИТ
      SANALYTIC_CREDIT4     PKG_STD.TSTRING; -- АНАЛИТИКА4_КРЕДИТ
      SANALYTIC_CREDIT5     PKG_STD.TSTRING; -- АНАЛИТИКА5_КРЕДИТ
      SACCOUNT              PKG_STD.TSTRING; -- СЧЕТ
      SANALYTIC1            PKG_STD.TSTRING; -- АНАЛИТИКА1
      SANALYTIC2            PKG_STD.TSTRING; -- АНАЛИТИКА2
      SANALYTIC3            PKG_STD.TSTRING; -- АНАЛИТИКА3
      SANALYTIC4            PKG_STD.TSTRING; -- АНАЛИТИКА4
      SANALYTIC5            PKG_STD.TSTRING; -- АНАЛИТИКА5
      SRRPCONF              PKG_STD.TSTRING; -- НАСТРОЙКА
      NRRPCONF_RD           PKG_STD.TNUMBER; -- НАСТРОЙКА_ТЕК
      SMARK_CODE            PKG_STD.TSTRING; -- ПОКАЗАТЕЛЬ
      NMARK_CODE_RD         PKG_STD.TNUMBER; -- ПОКАЗАТЕЛЬ_ТЕК
      SMARK_ROW_CODE        PKG_STD.TSTRING; -- СТРОКА_ПОКАЗАТЕЛЯ
      SMARK_COL_CODE        PKG_STD.TSTRING; -- ГРАФА_ПОКАЗАТЕЛЯ
    begin
      /* Получаем представление параметров исходя из маски */
      case SMASK
        /* "Счет дебет" и "Счет кредит" */
        when SPRM_MASK_ACC_DC then
          /* Считывание значения - Счет дебет */
          SACCOUNT_DEBIT := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                     NPRN     => NRRPCONFSCTNMRKCN,
                                                                     SPARAM   => PKG_RRPCONFSCTNMRKCN.SACCOUNT_DEBIT_P);
          /* Считывание значения - Аналитический счет 1 дебет */
          SANALYTIC_DEBIT1 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                       NPRN     => NRRPCONFSCTNMRKCN,
                                                                       SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC_DEBIT1_P);
          /* Считывание значения - Аналитический счет 2 дебет */
          SANALYTIC_DEBIT2 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                       NPRN     => NRRPCONFSCTNMRKCN,
                                                                       SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC_DEBIT2_P);
          /* Считывание значения - Аналитический счет 3 дебет */
          SANALYTIC_DEBIT3 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                       NPRN     => NRRPCONFSCTNMRKCN,
                                                                       SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC_DEBIT3_P);
          /* Считывание значения - Аналитический счет 4 дебет */
          SANALYTIC_DEBIT4 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                       NPRN     => NRRPCONFSCTNMRKCN,
                                                                       SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC_DEBIT4_P);
          /* Считывание значения - Аналитический счет 5 дебет */
          SANALYTIC_DEBIT5 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                       NPRN     => NRRPCONFSCTNMRKCN,
                                                                       SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC_DEBIT5_P);
          /* Считывание значения - Счет кредит */
          SACCOUNT_CREDIT := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                      NPRN     => NRRPCONFSCTNMRKCN,
                                                                      SPARAM   => PKG_RRPCONFSCTNMRKCN.SACCOUNT_CREDIT_P);
          /* Считывание значения - Аналитический счет 1 кредит */
          SANALYTIC_CREDIT1 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                        NPRN     => NRRPCONFSCTNMRKCN,
                                                                        SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC_CREDIT1_P);
          /* Считывание значения - Аналитический счет 2 кредит */
          SANALYTIC_CREDIT2 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                        NPRN     => NRRPCONFSCTNMRKCN,
                                                                        SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC_CREDIT2_P);
          /* Считывание значения - Аналитический счет 3 кредит */
          SANALYTIC_CREDIT3 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                        NPRN     => NRRPCONFSCTNMRKCN,
                                                                        SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC_CREDIT3_P);
          /* Считывание значения - Аналитический счет 4 кредит */
          SANALYTIC_CREDIT4 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                        NPRN     => NRRPCONFSCTNMRKCN,
                                                                        SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC_CREDIT4_P);
          /* Считывание значения - Аналитический счет 5 кредит */
          SANALYTIC_CREDIT5 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                        NPRN     => NRRPCONFSCTNMRKCN,
                                                                        SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC_CREDIT5_P);
          /* Если указан счет дебет */
          if ((SACCOUNT_DEBIT is not null) or (SANALYTIC_DEBIT1 is not null) or (SANALYTIC_DEBIT2 is not null) or
             (SANALYTIC_DEBIT3 is not null) or (SANALYTIC_DEBIT4 is not null) or (SANALYTIC_DEBIT5 is not null)) then
            /* Добавляем */
            SPRMS_DESC := SPRMS_DESC || 'Д:' || SACCOUNT_DEBIT || '';
            /* Добавляем информацию об аналитиках */
            SPRMS_DESC := SPRMS_DESC || '(' || SANALYTIC_DEBIT1 || ',' || SANALYTIC_DEBIT2 || ',' || SANALYTIC_DEBIT3 || ',' ||
                          SANALYTIC_DEBIT4 || ',' || SANALYTIC_DEBIT5 || '),';
          end if;
          /* Если указан счет кредит */
          if ((SACCOUNT_CREDIT is not null) or (SANALYTIC_CREDIT1 is not null) or (SANALYTIC_CREDIT2 is not null) or
             (SANALYTIC_CREDIT3 is not null) or (SANALYTIC_CREDIT4 is not null) or (SANALYTIC_CREDIT5 is not null)) then
            /* Добавляем */
            SPRMS_DESC := SPRMS_DESC || 'К:' || SACCOUNT_CREDIT || ',';
            /* Добавляем информацию об аналитиках */
            SPRMS_DESC := SPRMS_DESC || '(' || SANALYTIC_CREDIT1 || ',' || SANALYTIC_CREDIT2 || ',' ||
                          SANALYTIC_CREDIT3 || ',' || SANALYTIC_CREDIT4 || ',' || SANALYTIC_CREDIT5 || '),';
          end if;
        /* "Счет" */
        when SPRM_MASK_ACC then
          /* Считывание значения - Счет */
          SACCOUNT := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                               NPRN     => NRRPCONFSCTNMRKCN,
                                                               SPARAM   => PKG_RRPCONFSCTNMRKCN.SACCOUNT_P);
          /* Считывание значения - Аналитический счет 1 */
          SANALYTIC1 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                 NPRN     => NRRPCONFSCTNMRKCN,
                                                                 SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC1_P);
          /* Считывание значения - Аналитический счет 2 */
          SANALYTIC2 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                 NPRN     => NRRPCONFSCTNMRKCN,
                                                                 SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC2_P);
          /* Считывание значения - Аналитический счет 3 */
          SANALYTIC3 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                 NPRN     => NRRPCONFSCTNMRKCN,
                                                                 SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC3_P);
          /* Считывание значения - Аналитический счет 4 */
          SANALYTIC4 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                 NPRN     => NRRPCONFSCTNMRKCN,
                                                                 SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC4_P);
          /* Считывание значения - Аналитический счет 5 */
          SANALYTIC5 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                 NPRN     => NRRPCONFSCTNMRKCN,
                                                                 SPARAM   => PKG_RRPCONFSCTNMRKCN.SANALYTIC5_P);
          /* Если указан счет */
          if ((SACCOUNT is not null) or (SANALYTIC1 is not null) or (SANALYTIC2 is not null) or
             (SANALYTIC3 is not null) or (SANALYTIC4 is not null) or (SANALYTIC5 is not null)) then
            /* Добавляем */
            SPRMS_DESC := SPRMS_DESC || 'С:' || SACCOUNT || '';
            /* Добавляем информацию об аналитиках */
            SPRMS_DESC := SPRMS_DESC || '(' || SANALYTIC1 || ',' || SANALYTIC2 || ',' || SANALYTIC3 || ',' ||
                          SANALYTIC4 || ',' || SANALYTIC5 || '),';
          end if;
        /* "Счет" без аналитик */
        when SPRM_MASK_ACC_WO_ANL then
          /* Считывание значения - Счет */
          SACCOUNT := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                               NPRN     => NRRPCONFSCTNMRKCN,
                                                               SPARAM   => PKG_RRPCONFSCTNMRKCN.SACCOUNT_P);
          /* Если счет не пустой */
          if (SACCOUNT is not null) then
            /* Добавляем информацию по счету */
            SPRMS_DESC := SPRMS_DESC || 'С:' || SACCOUNT || ',';
          end if;
        /* "Дата с" */
        when SPRM_MASK_DATE_FROM then
          /* Считывание значения - Дата с */
          DDATE_FROM := PKG_RRPCONFSCTNMRKCN.PARAM_GET_DATE_VALUE(NCOMPANY => NCOMPANY,
                                                                  NPRN     => NRRPCONFSCTNMRKCN,
                                                                  SPARAM   => PKG_RRPCONFSCTNMRKCN.SDATE_FROM_P);
          /* Считывание значения - Дата с (шаблон) */
          SDATE_FROM_PATTERN := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                         NPRN     => NRRPCONFSCTNMRKCN,
                                                                         SPARAM   => PKG_RRPCONFSCTNMRKCN.SDATE_FROM_PATTERN_P);
          /* Определяем "Дата с" */
          SDATE_FROM := COALESCE(TO_CHAR(DDATE_FROM, 'dd.mm.yyyy'), SDATE_FROM_PATTERN);
          /* Если указана дата с */
          if (SDATE_FROM is not null) then
            /* Добавляем дату с */
            SPRMS_DESC := SPRMS_DESC || 'ДС:' || SDATE_FROM || ',';
          end if;
        /* "Дата по" */
        when SPRM_MASK_DATE_TO then
          /* Считывание значения - Дата по */
          DDATE_TO := PKG_RRPCONFSCTNMRKCN.PARAM_GET_DATE_VALUE(NCOMPANY => NCOMPANY,
                                                                NPRN     => NRRPCONFSCTNMRKCN,
                                                                SPARAM   => PKG_RRPCONFSCTNMRKCN.SDATE_TO_P);
          /* Считывание значения - Дата по (шаблон) */
          SDATE_TO_PATTERN := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                       NPRN     => NRRPCONFSCTNMRKCN,
                                                                       SPARAM   => PKG_RRPCONFSCTNMRKCN.SDATE_TO_PATTERN_P);
          /* пределяем "Дата по" */
          SDATE_TO := COALESCE(TO_CHAR(DDATE_TO, 'dd.mm.yyyy'), SDATE_TO_PATTERN);
          /* Если указана дата по */
          if (SDATE_TO is not null) then
            /* Добавляем дату по */
            SPRMS_DESC := SPRMS_DESC || 'ДП:' || SDATE_TO || ',';
          end if;
        /* Параметры настройки РО */
        when SPRM_MASK_RRPCONF then
          /* Считывание значения - Настройка регламентированного отчета */
          SRRPCONF := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                               NPRN     => NRRPCONFSCTNMRKCN,
                                                               SPARAM   => PKG_RRPCONFSCTNMRKCN.SRRPCONF_P);
          /* Считывание значения - Настройка регламентированного отчета (текущее) */
          NRRPCONF_RD := PKG_RRPCONFSCTNMRKCN.PARAM_GET_NUM_VALUE(NCOMPANY => NCOMPANY,
                                                                  NPRN     => NRRPCONFSCTNMRKCN,
                                                                  SPARAM   => PKG_RRPCONFSCTNMRKCN.SRRPCONF_RD_P);
          /* Если указана текущая настройка */
          if (NRRPCONF_RD = 1) then
            /* Считываем мнемокод текущей настройки */
            SRRPCONF := CONF_GET_CODE_BY_CN(NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN);
          end if;
          /* Считывание значения - Мнемокод показателя */
          SMARK_CODE := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                 NPRN     => NRRPCONFSCTNMRKCN,
                                                                 SPARAM   => PKG_RRPCONFSCTNMRKCN.SMARK_CODE_P);
          /* Считывание значения - Мнемокод показателя (текущее) */
          NMARK_CODE_RD := PKG_RRPCONFSCTNMRKCN.PARAM_GET_NUM_VALUE(NCOMPANY => NCOMPANY,
                                                                    NPRN     => NRRPCONFSCTNMRKCN,
                                                                    SPARAM   => PKG_RRPCONFSCTNMRKCN.SMARK_CODE_RD_P);
          /* Если указан текущий показатель */
          if (NMARK_CODE_RD = 1) then
            /* Считываем мнемокод текущей настройки */
            SMARK_CODE := MARK_GET_CODE_BY_CN(NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN);
          end if;
          /* Считывание значения - Мнемокод строки показателя */
          SMARK_ROW_CODE := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                     NPRN     => NRRPCONFSCTNMRKCN,
                                                                     SPARAM   => PKG_RRPCONFSCTNMRKCN.SMARK_ROW_CODE_P);
          /* Считывание значения - Мнемокод графы показателя */
          SMARK_COL_CODE := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
                                                                     NPRN     => NRRPCONFSCTNMRKCN,
                                                                     SPARAM   => PKG_RRPCONFSCTNMRKCN.SMARK_COL_CODE_P);
          /* Если настройка указана */
          if (SRRPCONF is not null) then
            /* Добавляем */
            SPRMS_DESC := SPRMS_DESC || 'Н:' || SRRPCONF || ',';
          end if;
          /* Если мнемокод показателя указан */
          if (SMARK_CODE is not null) then
            /* Добавляем */
            SPRMS_DESC := SPRMS_DESC || 'П:' || SRRPCONF || ',';
          end if;
          /* Если строка показателя указана */
          if (SMARK_ROW_CODE is not null) then
            /* Добавляем */
            SPRMS_DESC := SPRMS_DESC || 'СТР:' || SMARK_ROW_CODE || ',';
          end if;
          /* Если графа показателя указана */
          if (SMARK_COL_CODE is not null) then
            /* Добавляем */
            SPRMS_DESC := SPRMS_DESC || 'ГРФ:' || SMARK_COL_CODE || ',';
          end if;
        else
          /* Незвестная маска */
          null;
      end case;
    end MAKE_PRMS_BY_MASK;
    
    /* Формирование строки основных параметров для учетного раздела состава показателя */
    function SOURCE_UNIT_GET_PRMS
    (
      NCOMPANY              in number,       -- Рег. номер организации
      NRRPCONFSCTNMRKCN     in number,       -- Рег. номер состава показателя регламентированного отчета
      SSOURCE_UNIT          in varchar2      -- Учетный раздел
    ) return                varchar2         -- Строковое представление основных параметров учетного раздела
    is
      SRESULT               PKG_STD.TSTRING; -- Строковое представление основных параметров учетного раздела
    begin
      /* Открываем параметры */
      SRESULT := '(';
      /* Собираем параметры исходя из раздела */
      case SSOURCE_UNIT
        /* Хозяйственные операции */
        when 'EconomicOperations' then
          /* Получаем информацию по "Счет дебет" и "Счет кредит" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_ACC_DC);
          /* Добавляем информацию по "Дата с" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_FROM);
          /* Добавляем информацию по "Дата по" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_TO);
        /* Расчёты с дебиторами/кредиторами */
        when 'DebitorsCreditorsAccounts' then
          /* Получаем информацию по "Счет" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_ACC);
          /* Добавляем информацию по "Дата с" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_FROM);
          /* Добавляем информацию по "Дата по" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_TO);
        /* Остатки средств по счетам */
        when 'AccountsRemnants' then
          /* Получаем информацию по "Счет" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_ACC);
          /* Добавляем информацию по "Дата с" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_FROM);
        /* Остатки товарно-материальных ценностей */
        when 'ValuesRemnants' then
          /* Получаем информацию по "Счет" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_ACC);
          /* Добавляем информацию по "Дата с" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_FROM);
        /* Дебиторская/кредиторская задолженность */
        when 'DebitorsCreditorsRemnants' then
          /* Получаем информацию по "Счет" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_ACC);
          /* Добавляем информацию по "Дата с" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_FROM);
          /* Добавляем информацию по "Дата по" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_TO);
        /* Инвентарная картотека */
        when 'Inventory' then
          /* Получаем информацию по "Счет" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_ACC);
          /* Добавляем информацию по "Дата с" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_FROM);
          /* Добавляем информацию по "Дата по" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_TO);
        /* Картотека МБП */
        when 'ItemsCards' then
          /* Получаем информацию по "Счет" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_ACC_WO_ANL);
          /* Добавляем информацию по "Дата с" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_FROM);
        /* Картотека операций будущих периодов */
        when 'OperCards' then
          /* Получаем информацию по "Счет" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_ACC);
          /* Добавляем информацию по "Дата с" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_FROM);
          /* Добавляем информацию по "Дата по" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_TO);
        /* Регламентированный отчет */
        when 'RRPDocuments' then
          /* Добавляем информацию по настройке */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_RRPCONF);
          /* Добавляем информацию по "Дата с" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_FROM);
          /* Добавляем информацию по "Дата по" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_TO);
        /* Декларация по налогу на прибыль */
        when 'DeclarationIncome' then
          /* Добавляем информацию по настройке */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_RRPCONF);
          /* Добавляем информацию по "Дата с" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_FROM);
          /* Добавляем информацию по "Дата по" */
          MAKE_PRMS_BY_MASK(SPRMS_DESC        => SRESULT,
                            NCOMPANY          => NCOMPANY,
                            NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
                            SMASK             => SPRM_MASK_DATE_TO);
        /* Неизвестный раздел */
        else
          SRESULT := null;
      end case;
      /* Убираем лишний знак */
      SRESULT := RTRIM(SRESULT, ',');
      /* Закрываем параметры */
      SRESULT := SRESULT || ')';
      /* Возвращаем результат */
      return SRESULT;
    end SOURCE_UNIT_GET_PRMS;   
  begin
    /* Считывание записи состава показателя регламентированного отчета */
    RREC := GET_RRPCONFSCTNMRKCN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRRPCONFSCTNMRKCN);
    /* Формируем представление состава показателя в виде формулы */
    case RREC.SOURCE_TYPE
      /* Учетный раздел */
      when 0 then
        /* Собираем представление из параметров составов */
        SCN_DESC := SOURCE_UNIT_GET_PRMS(NCOMPANY          => NCOMPANY,
                                         NRRPCONFSCTNMRKCN => RREC.RN,
                                         SSOURCE_UNIT      => RREC.SOURCE_UNIT);
      /* Расчетный показатель */
      when 1 then
        /* Считываем запись расчетного показателя */
        RRRPCONFSCTNMRK := GET_RRPCONFSCTNMRK_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RREC.RRPCONFSCTNMRK);
        /* Указываем мнемокод показателя */
        SCN_DESC := '(' || RRRPCONFSCTNMRK.CODE || ')';
      /* Хранимая процедура */
      when 2 then
        /* Формируем из пакета и процедуры */
        SCN_DESC := '(' || PKG_OBJECT_DESC.STORED_NAME(SPACKAGE_NAME => RREC.PKG, SSTORED_NAME => RREC.PRC) || ')';
      /* Статическое значение */
      when 3 then
        /* Указываем статическое значение */
        SCN_DESC := '(' || COALESCE(RREC.STATIC_STR,
                                    COALESCE(TO_CHAR(RREC.STATIC_NUM), TO_CHAR(RREC.STATIC_DATE, 'dd.mm.yyyy'))) || ')';
      /* Формула */
      when 4 then
        /* Указываем формулу */
        SCN_DESC := '(' || RREC.FORMULA || ')';
      else
        SCN_DESC := null;
    end case;
    /* Формируем описатель */
    SRESULT := RRPCONFSCTNMRKCN_GET_SIGN(NSIGN => RREC.SIGN) || ' ' ||
               RRPCONFSCTNMRKCN_GET_ST(NSOURCE_TYPE => RREC.SOURCE_TYPE, SSOURCE_UNIT => RREC.SOURCE_UNIT) || SCN_DESC;
    /* Возвращаем результат */
    return SRESULT;
  end RRPCONFSCTNMRKCN_GET_DESC;
  
  /* Поиск рег. номера показателя по разделу РО/строке/графе */
  function RRPCONFSCTNMRK_GET_ROWCOL
  (
    NRRPCONFSCTN            in number,    -- Рег. номер раздела
    NRRPROW                 in number,    -- Рег. номер строки
    NRRPCOLUMN              in number     -- Рег. номер графы
  ) return                  number        -- Рег. номер показателя
  is
    NRESULT                 PKG_STD.TREF; -- Рег. номер показателя
  begin
    /* Считываем запись показателя */
    begin
      select T.RN
        into NRESULT
        from RRPCONFSCTNMRK T
       where T.PRN = NRRPCONFSCTN
         and T.RRPROW = NRRPROW
         and T.RRPCOLUMN = NRRPCOLUMN;
    exception
      when others then
        NRESULT := null;
    end;
    /* Возвращаем результат */
    return NRESULT;
  end RRPCONFSCTNMRK_GET_ROWCOL;
  
  /* Формирование описания показателя */
  function RRPCONFSCTNMRK_GET_DESC
  (
    NCOMPANY                in number,        -- Рег. номер организации
    NRRPCONFSCTN            in number,        -- Рег. номер раздела
    NRRPROW                 in number,        -- Рег. номер строки
    NRRPCOLUMN              in number         -- Рег. номер графы    
  ) return                  varchar2          -- Сериализованное описание показателя
  is
    SRES                    PKG_STD.TLSTRING; -- Буфер для результата
    NRRPCONFSCTNMRK         PKG_STD.TREF;     -- Рег. номер показателя настройки
  begin
    /* Найдём показатель */
    NRRPCONFSCTNMRK := RRPCONFSCTNMRK_GET_ROWCOL(NRRPCONFSCTN => NRRPCONFSCTN,
                                                 NRRPROW      => NRRPROW,
                                                 NRRPCOLUMN   => NRRPCOLUMN);
    /* Начинаем формирование */
    PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
    /* Показатель */
    PKG_XFAST.DOWN_NODE(SNAME => 'XMARK');
    /* Атрибуты со сведениями о строке и графе */
    PKG_XFAST.ATTR(SNAME => 'NRRPROW', NVALUE => NRRPROW);
    PKG_XFAST.ATTR(SNAME => 'NRRPCOLUMN', NVALUE => NRRPCOLUMN);
    /* Обратимся к показателю */
    for MARK in (select T.RN    NRN,
                        T.CODE  SCODE,
                        T.NAME  SNAME,
                        R.CODE  SRRPROW,
                        RV.CODE SRRPVERSION_ROW,
                        C.CODE  SRRPCOLUMN,
                        CV.CODE SRRPVERSION_COLUMN
                   from RRPCONFSCTNMRK T,
                        RRPROW         R,
                        RRPCOLUMN      C,
                        RRPVERSION     RV,
                        RRPVERSION     CV
                  where T.RN = NRRPCONFSCTNMRK
                    and T.RRPROW = R.RN
                    and T.RRPCOLUMN = C.RN
                    and R.RRPVERSION = RV.RN(+)
                    and C.RRPVERSION = CV.RN(+))
    loop
      /* Атрибуты со сведениями о показателе */
      PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => MARK.NRN);
      PKG_XFAST.ATTR(SNAME => 'SCODE', SVALUE => MARK.SCODE);
      PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => MARK.SNAME);
      PKG_XFAST.ATTR(SNAME => 'SRRPROW', SVALUE => MARK.SRRPROW);
      PKG_XFAST.ATTR(SNAME => 'SRRPVERSION_ROW', SVALUE => MARK.SRRPVERSION_ROW);
      PKG_XFAST.ATTR(SNAME => 'SRRPCOLUMN', SVALUE => MARK.SRRPCOLUMN);
      PKG_XFAST.ATTR(SNAME => 'SRRPVERSION_COLUMN', SVALUE => MARK.SRRPVERSION_COLUMN);
      /* Цикл по составам показателей раздела */
      for CN in (select T.PRN,
                        T.RN,
                        T.NUMB
                   from RRPCONFSCTNMRKCN T
                  where T.PRN = NRRPCONFSCTNMRK
                  order by T.NUMB asc)
      loop
        /* Добавляем состав */
        PKG_XFAST.DOWN_NODE(SNAME => 'CONSTITUTION');
        PKG_XFAST.ATTR(SNAME => 'NPRN', NVALUE => CN.PRN);
        PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => CN.RN);
        PKG_XFAST.ATTR(SNAME => 'SNUMB', SVALUE => CN.NUMB);
        PKG_XFAST.ATTR(SNAME  => 'SDESC',
                       SVALUE => RRPCONFSCTNMRKCN_GET_DESC(NCOMPANY => NCOMPANY, NRRPCONFSCTNMRKCN => CN.RN));
        PKG_XFAST.UP();
      end loop;
    end loop;
    PKG_XFAST.UP();
    /* Сериализуем описание */
    SRES := PKG_XFAST.SERIALIZE_TO_VARCHAR();
    /* Завершаем формирование */
    PKG_XFAST.EPILOGUE();
    /* Возвращаем сформированное */
    return SRES;
  end RRPCONFSCTNMRK_GET_DESC;
  
  /* Автоматическое формирование мнемокода и наименования показателя, если не указаны */
  procedure RRPCONFSCTNMRK_BUILD_CODE_NAME
  (
    NCOMPANY                in number,           -- Рег. номер организации
    NRRPCONFSCTN            in number,           -- Рег. номер раздела отчета
    NRRPROW                 in number,           -- Рег. номер строки показателя
    NRRPCOLUMN              in number,           -- Рег. номер графы показателя
    SCODE                   in out varchar2,     -- Мнемокод показателя раздела (null - будет сформировано автоматически, иначе - вернётся без изменений)
    SNAME                   in out varchar2      -- Наименование показателя раздела (null - будет сформировано автоматически, иначе - вернётся без изменений)
  )
  is
    RRRPCONFSCTN            RRPCONFSCTN%rowtype; -- Запись раздела настройки
    RRRPROW                 RRPROW%rowtype;      -- Запись строки показателя
    RRRPCOLUMN              RRPCOLUMN%rowtype;   -- Запись графы показателя
  begin
    /* Сформируем автоматический мнемокод, если пользователь не указал его */
    if (SCODE is null) then
      /* Считаем указанные раздел, строку и графу */
      RRRPCONFSCTN := GET_RRPCONFSCTN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRRPCONFSCTN);
      RRRPROW      := GET_RRPROW_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRRPROW);
      RRRPCOLUMN   := GET_RRPCOLUMN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRRPCOLUMN);
      /* Формируем мнемокод */
      P_RRPCONFSCTNMRK_MAKE_CODE(SRRPCONFSCTN => RRRPCONFSCTN.CODE,
                                 SRRPROW      => RRRPROW.CODE,
                                 SRRPCOLUMN   => RRRPCOLUMN.CODE,
                                 SCODE        => SCODE);
    end if;
    /* Сформируем автоматическое наименование, если пользователь не указал его */
    if (SNAME is null) then
      P_RRPCONFSCTNMRK_MAKE_NAME(NCOMPANY            => NCOMPANY,
                                 NRRPROW             => NRRPROW,
                                 NRRPCOLUMN          => NRRPCOLUMN,
                                 NCHANGE_NAME        => 1,
                                 NCHANGE_NAME_PARENT => 0,
                                 SNAME               => SNAME);
    end if;
  end RRPCONFSCTNMRK_BUILD_CODE_NAME;
  
  /* Разыменовывание ссылок показателя, переданных пользователем */
  procedure RRPCONFSCTNMRK_JOINS
  (
    NCOMPANY                in number,              -- Рег. номер организации
    NRRPROW                 in number,              -- Рег. номер строки
    SRRPROW                 in varchar2,            -- Код строки (игнорируется, если указан рег. номер строки)
    SRRPVERSION_ROW         in varchar2,            -- Код редакции строки (игнорируется, если указан рег. номер строки)
    NRRPCOLUMN              in number,              -- Рег. номер графы
    SRRPCOLUMN              in varchar2,            -- Код графы (игнорируется, если указан рег. номер графы)
    SRRPVERSION_COLUMN      in varchar2,            -- Код редакции графы (игнорируется, если указан рег. номер графы)
    RRRPROW                 out RRPROW%rowtype,     -- Запись строки регламентированного отчета
    RRRPVERSION_ROW         out RRPVERSION%rowtype, -- Запись редакции строки регламентированного отчета
    RRRPCOLUMN              out RRPCOLUMN%rowtype,  -- Запись графы регламентированного отчета
    RRRPVERSION_COLUMN      out RRPVERSION%rowtype  -- Запись редакции графы регламентированного отчета
  )
  is
    NRRPVERSION             PKG_STD.TREF;           -- Рег. номер редакции строки/графы
    NRRPROW_                PKG_STD.TREF;           -- Буфер для рег. номера строки
    NRRPCOLUMN_             PKG_STD.TREF;           -- Буфер для рег. номера графы
  begin
    /* Считываем запись строки и редакции строки регламентированного отчета */
    if (NRRPROW is null) then
      FIND_RRPVERSION_CODE(NFLAG_SMART  => 0,
                           NFLAG_OPTION => 1,
                           NCOMPANY     => NCOMPANY,
                           SCODE        => SRRPVERSION_ROW,
                           NRN          => NRRPVERSION);
      FIND_RRPROW_CODE(NFLAG_SMART  => 0,
                       NFLAG_OPTION => 0,
                       NCOMPANY     => NCOMPANY,
                       NRRPVERSION  => NRRPVERSION,
                       SCODE        => SRRPROW,
                       NRN          => NRRPROW_);
    else
      NRRPROW_ := NRRPROW;
    end if;
    RRRPROW         := GET_RRPROW_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRRPROW_);
    RRRPVERSION_ROW := GET_RRPVERSION_ID(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, NRN => RRRPROW.RRPVERSION);
    /* Считываем запись графы и редакции графы регламентированного отчета */
    if (NRRPCOLUMN is null) then
      FIND_RRPVERSION_CODE(NFLAG_SMART  => 0,
                           NFLAG_OPTION => 1,
                           NCOMPANY     => NCOMPANY,
                           SCODE        => SRRPVERSION_COLUMN,
                           NRN          => NRRPVERSION);
      FIND_RRPCOLUMN_CODE(NFLAG_SMART  => 0,
                          NFLAG_OPTION => 0,
                          NCOMPANY     => NCOMPANY,
                          NRRPVERSION  => NRRPVERSION,
                          SCODE        => SRRPCOLUMN,
                          NRN          => NRRPCOLUMN_);
    else
      NRRPCOLUMN_ := NRRPCOLUMN;
    end if;
    RRRPCOLUMN         := GET_RRPCOLUMN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRRPCOLUMN_);
    RRRPVERSION_COLUMN := GET_RRPVERSION_ID(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, NRN => RRRPCOLUMN.RRPVERSION);
  end RRPCONFSCTNMRK_JOINS;
    
  /* Добавление показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_INSERT
  (
    NPRN                    in number,                             -- Рег. номер раздела
    SCODE                   in varchar2,                           -- Мнемокод показателя раздела
    SNAME                   in varchar2,                           -- Наименование показателя раздела
    NRRPROW                 in number,                             -- Рег. номер строки
    SRRPROW                 in varchar2,                           -- Код строки (игнорируется, если указан рег. номер строки)
    SRRPVERSION_ROW         in varchar2,                           -- Код редакции строки (игнорируется, если указан рег. номер строки)
    NRRPCOLUMN              in number,                             -- Рег. номер графы
    SRRPCOLUMN              in varchar2,                           -- Код графы (игнорируется, если указан рег. номер графы)
    SRRPVERSION_COLUMN      in varchar2,                           -- Код редакции графы (игнорируется, если указан рег. номер графы)
    NRN                     out number                             -- Рег. номер созданной записи
  )
  is
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
    RRRPROW                 RRPROW%rowtype;                        -- Запись строки регламентированного отчета
    RRRPVERSION_ROW         RRPVERSION%rowtype;                    -- Запись редакции строки регламентированного отчета
    RRRPCOLUMN              RRPCOLUMN%rowtype;                     -- Запись графы регламентированного отчета
    RRRPVERSION_COLUMN      RRPVERSION%rowtype;                    -- Запись редакции графы регламентированного отчета
    SCODE_                  PKG_STD.TSTRING;                       -- Буфер для фактического мнемокода
    SNAME_                  PKG_STD.TSTRING;                       -- Буфер для фактического наименования
  begin
    /* Получим НСИ (строки, графы, редакции и т.п.) по данным, полученным от пользователя */
    RRPCONFSCTNMRK_JOINS(NCOMPANY           => NCOMPANY,
                         NRRPROW            => NRRPROW,
                         SRRPROW            => SRRPROW,
                         SRRPVERSION_ROW    => SRRPVERSION_ROW,
                         NRRPCOLUMN         => NRRPCOLUMN,
                         SRRPCOLUMN         => SRRPCOLUMN,
                         SRRPVERSION_COLUMN => SRRPVERSION_COLUMN,
                         RRRPROW            => RRRPROW,
                         RRRPVERSION_ROW    => RRRPVERSION_ROW,
                         RRRPCOLUMN         => RRRPCOLUMN,
                         RRRPVERSION_COLUMN => RRRPVERSION_COLUMN);
    /* Сформируем автоматические мнемокод и наименование, если пользователь не указал их */
    SCODE_ := SCODE;
    SNAME_ := SNAME;
    RRPCONFSCTNMRK_BUILD_CODE_NAME(NCOMPANY     => NCOMPANY,
                                   NRRPCONFSCTN => NPRN,
                                   NRRPROW      => RRRPROW.RN,
                                   NRRPCOLUMN   => RRRPCOLUMN.RN,
                                   SCODE        => SCODE_,
                                   SNAME        => SNAME_);
    /* Добавим показатель */
    P_RRPCONFSCTNMRK_INSERT(NCOMPANY           => NCOMPANY,
                            NPRN               => NPRN,
                            NNUMB              => F_RRPCONFSCTNMRK_NEXT_NUMB(NCOMPANY => NCOMPANY, NPRN => NPRN),
                            SCODE              => SCODE_,
                            SNAME              => SNAME_,
                            SRRPROW            => RRRPROW.CODE,
                            SRRPVERSION_ROW    => RRRPVERSION_ROW.CODE,
                            SRRPCOLUMN         => RRRPCOLUMN.CODE,
                            SRRPVERSION_COLUMN => RRRPVERSION_COLUMN.CODE,
                            SPKG_ROW           => null,
                            SPRC_ROW           => null,
                            SPKG_COL           => null,
                            SPRC_COL           => null,
                            SRRPPRM            => null,
                            NIGNORE_ZOOM       => 0,
                            NIGNORE_SHARP      => 0,
                            SCLSF_CODE         => null,
                            SNOTE              => null,
                            NDUP_RN            => null,
                            NRN                => NRN);
  end RRPCONFSCTNMRK_INSERT;
  
  /* Исправление показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_UPDATE
  (
    NRN                     in number,                             -- Рег. номер показателя раздела            
    SCODE                   in varchar2,                           -- Мнемокод показателя раздела
    SNAME                   in varchar2,                           -- Наименование показателя раздела
    SRRPROW                 in varchar2,                           -- Код строки
    SRRPVERSION_ROW         in varchar2,                           -- Код редакции строки
    SRRPCOLUMN              in varchar2,                           -- Код графы
    SRRPVERSION_COLUMN      in varchar2                            -- Код редакции графы
  )
  is
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
    RMRK                    RRPCONFSCTNMRK%rowtype;                -- Запись настройки показателя регламентированного отчета
    RRRPPRM                 RRPPRM%rowtype;                        -- Запись типового параметра регламентированного отчета
    RRRPROW                 RRPROW%rowtype;                        -- Запись строки регламентированного отчета
    RRRPVERSION_ROW         RRPVERSION%rowtype;                    -- Запись редакции строки регламентированного отчета
    RRRPCOLUMN              RRPCOLUMN%rowtype;                     -- Запись графы регламентированного отчета
    RRRPVERSION_COLUMN      RRPVERSION%rowtype;                    -- Запись редакции графы регламентированного отчета
    SCODE_                  PKG_STD.TSTRING;                       -- Буфер для фактического мнемокода
    SNAME_                  PKG_STD.TSTRING;                       -- Буфер для фактического наименования
  begin
    /* Получение записи параметра раздела */
    RMRK := GET_RRPCONFSCTNMRK_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRN);
    /* Получим НСИ (строки, графы, редакции и т.п.) по данным, полученным от пользователя */
    RRPCONFSCTNMRK_JOINS(NCOMPANY           => NCOMPANY,
                         NRRPROW            => null,
                         SRRPROW            => SRRPROW,
                         SRRPVERSION_ROW    => SRRPVERSION_ROW,
                         NRRPCOLUMN         => null,
                         SRRPCOLUMN         => SRRPCOLUMN,
                         SRRPVERSION_COLUMN => SRRPVERSION_COLUMN,
                         RRRPROW            => RRRPROW,
                         RRRPVERSION_ROW    => RRRPVERSION_ROW,
                         RRRPCOLUMN         => RRRPCOLUMN,
                         RRRPVERSION_COLUMN => RRRPVERSION_COLUMN);
    /* Сформируем автоматические мнемокод и наименование, если пользователь не указал их */
    SCODE_ := SCODE;
    SNAME_ := SNAME;
    RRPCONFSCTNMRK_BUILD_CODE_NAME(NCOMPANY     => NCOMPANY,
                                   NRRPCONFSCTN => RMRK.PRN,
                                   NRRPROW      => RRRPROW.RN,
                                   NRRPCOLUMN   => RRRPCOLUMN.RN,
                                   SCODE        => SCODE_,
                                   SNAME        => SNAME_);
    /* Считаем код типового параметра, если задан в показателе (чтобы не затереть существующий, т.к. пользователь нам его не передает сейчас) */
    if (RMRK.RRPPRM is not null) then
      RRRPPRM := GET_RRPPRM_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RMRK.RRPPRM);
    else
      RRRPPRM.CODE := null;
    end if;
    /* Исправим показатель */
    P_RRPCONFSCTNMRK_UPDATE(NRN                => RMRK.RN,
                            NCOMPANY           => NCOMPANY,
                            NNUMB              => RMRK.NUMB,
                            SCODE              => SCODE_,
                            SNAME              => SNAME_,
                            SRRPROW            => SRRPROW,
                            SRRPVERSION_ROW    => SRRPVERSION_ROW,
                            SRRPCOLUMN         => SRRPCOLUMN,
                            SRRPVERSION_COLUMN => SRRPVERSION_COLUMN,
                            SPKG_ROW           => RMRK.PKG_ROW,
                            SPRC_ROW           => RMRK.PRC_ROW,
                            SPKG_COL           => RMRK.PKG_COL,
                            SPRC_COL           => RMRK.PRC_COL,
                            SRRPPRM            => RRRPPRM.CODE,
                            NIGNORE_ZOOM       => RMRK.IGNORE_ZOOM,
                            NIGNORE_SHARP      => RMRK.IGNORE_SHARP,
                            SCLSF_CODE         => RMRK.CLSF_CODE,
                            NFORMULA_UPDATE    => 1,
                            SNOTE              => RMRK.NOTE);
  end RRPCONFSCTNMRK_UPDATE;
  
  /* Удаление показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_DELETE
  (        
    NRN                     in number   -- Рег. номер показателя раздела
  )
  is
  begin
    /* Удалим показатель */
    P_RRPCONFSCTNMRK_DELETE(NCOMPANY => GET_SESSION_COMPANY(), NRN => NRN);
  end RRPCONFSCTNMRK_DELETE;

  /* Получение раздела регламентированного отчёта */
  procedure RRPCONFSCTN_GET
  (
    NRRPCONFSCTN            in number,                             -- Рег. номер раздела настройки форм регламентированного отчёта
    NROW_ORDER              in number := 0,                        -- Порядок сортировки строк (0 - по номеру, 1 - по коду, 2 - по мнемокоду)
    NCOL_ORDER              in number := 0,                        -- Порядок сортировки граф (0 - по номеру, 1 - по коду, 2 - по мнемокоду)
    COUT                    out clob                               -- Данные раздела
  )
  is
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
    RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
    RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы    
    ICURSOR                 integer;                               -- Курсор для исполнения запроса
    NROW_RN                 PKG_STD.TREF;                          -- Рег. номер строки
    SROW_NAME               PKG_STD.TSTRING;                       -- Наименование строки
    NCOL_RN                 PKG_STD.TREF;                          -- Рег. номер графы
    
    /* Получение наименования колонки таблицы "Код" для строк/граф */
    function TABCOL_ROWCOL_CODE_GET
    (
      STABLE                in varchar2 -- Таблица (RRPROW - по строкам, RRPCOLUMN - по графам)
    ) return                varchar2    -- Наименование колонки таблицы для хранения "Кода"
    is
    begin
      /* Смотрим от имени таблицы */
      if (STABLE = 'RRPCOLUMN') then
        /* Код графы */
        return 'COLUMN_CODE';
      elsif (STABLE = 'RRPROW') then
        /* Код строки */
        return 'ROW_CODE';
      else
        /* Неизвестная таблица */
        P_EXCEPTION(0,
                    'Таблица "%s" не поддерживается.',
                    COALESCE(STABLE, '<НЕ УКАЗАНА>'));
      end if;
    end TABCOL_ROWCOL_CODE_GET;
    
    /* Формирование условия сортировки для SQL-запроса по строкам/графам */
    function ORDER_CLAUSE_GET
    (
      STABLE                in varchar2,     -- Таблица (RRPROW - по строкам, RRPCOLUMN - по графам)
      NORDER                in number,       -- Порядок сортировки (0 - по номеру, 1 - по коду, 2 - по мнемокоду)      
      SALIAS                in varchar2      -- Алиас таблицы в формируемом запросе
    ) return                varchar2         -- Текстовое представление сортировки
    is
      SRESULT               PKG_STD.TSTRING; -- Текстовое представление сортировки
      STABLE_COLUMN_CODE    PKG_STD.TSTRING; -- Наименование колонки таблицы, содержащую код
    begin
      /* Определяем наименование колонки, содержающую код */
      STABLE_COLUMN_CODE := TABCOL_ROWCOL_CODE_GET(STABLE => STABLE);
      /* Формируем представление сортировки */
      case NORDER
        /* Код - номер сортировки - мнемокод */
        when 1 then
          SRESULT := PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.' || STABLE_COLUMN_CODE || ', 40, ''0''),' || SALIAS ||
                     '.SORT_NUMB,' || PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.CODE, 20, ''0'')';
        /* Мнемокод - номер сортировки - код */
        when 2 then
          SRESULT := PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.CODE, 20, ''0''),' || SALIAS || '.SORT_NUMB,' ||
                     PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.' || STABLE_COLUMN_CODE || ', 40, ''0'')';
        /* Номер сортировки - код - мнемокод */
        else
          SRESULT := SALIAS || '.SORT_NUMB,' || PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.' || STABLE_COLUMN_CODE ||
                     ', 40, ''0''),' || PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.CODE, 20, ''0'')';
      end case;
      /* Возвращаем результат */
      return SRESULT;
    end ORDER_CLAUSE_GET;
    
    /* Открытие курсора по строкам/графам раздела */
    procedure OPEN_ROWS_COLS_CUR
    (
      NRRPCONFSCTN          in number,       -- Рег. номер раздела настройки форм регламентированного отчёта
      STABLE                in varchar2,     -- Таблица (RRPROW - по строкам, RRPCOLUMN - по графам)
      NORDER                in number,       -- Порядок сортировки (0 - по номеру, 1 - по коду, 2 - по мнемокоду)
      ICURSOR               in out integer   -- Открытый курсор
    ) 
    is
      CSQL                  clob;            -- Запрос
      SORDERS               PKG_STD.TSTRING; -- Условия сортировки
    begin
      /* Закроем курсор если открыт */
      if (PKG_SQL_DML.IS_OPEN(ICURSOR => ICURSOR)) then
        PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
      end if;
      /* Определим условия сортировки */
      SORDERS := ORDER_CLAUSE_GET(STABLE => STABLE, NORDER => NORDER, SALIAS => 'T');
      /* Соберем запрос */
      CSQL := PKG_SQL_BUILD.COMPATIBLE();
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select T.RN,');
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '       T.NAME');
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '  from RRPCONFSCTNMRK M,');
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '       ' || STABLE || ' T');
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where M.PRN = ' || TO_CHAR(NRRPCONFSCTN));
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '   and T.RN = M.' || STABLE);
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' group by T.RN,');
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '          T.CODE,');
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '          T.NAME,');
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '          T.' || TABCOL_ROWCOL_CODE_GET(STABLE => STABLE) || ',');
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '          T.SORT_NUMB');
      PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' order by ' || SORDERS);
      /* Разбираем его */
      ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
      PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
      /* Описываем структуру записи курсора */
      PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
      PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
      /* Делаем выборку по курсору */
      if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
        null;
      end if;
    end OPEN_ROWS_COLS_CUR;
       
    /* Формирование наименования колонки таблицы данных по рег. номеру графы показателя */
    function DG_COL_NAME_BY_RRPCOLUMN
    (
      NRRPCOLUMN            in number   -- Рег. номер графы
    ) return                varchar2    -- Имя колонки для таблицы данных
    is
    begin
      return 'SCOL_' || TO_CHAR(NRRPCOLUMN);
    end DG_COL_NAME_BY_RRPCOLUMN;
    
    /* Получение рег. номера графы показателя по наименованию колонки таблицы данных */
    function RRPCOLUMN_BY_DG_COL_NAME
    (
      SDG_COL_NAME          in varchar2 -- Имя колонки таблицы данных
    ) return                number      -- Рег. номер графы
    is
    begin
      return TO_NUMBER(replace(SDG_COL_NAME, 'SCOL_', ''));
    end RRPCOLUMN_BY_DG_COL_NAME;
    
    /* Инициализация колонок выходной таблицы */
    procedure COLUMNS_INIT
    (
      RDG                   in out nocopy PKG_P8PANELS_VISUAL.TDG, -- Описание таблицы
      NRRPCONFSCTN          in number,                             -- Рег. номер раздела
      NCOL_ORDER            in number,                             -- Порядок сортировки граф (0 - по номеру, 1 - по коду, 2 - по мнемокоду)
      NCOL_WIDTH            in number                              -- Ширина колонки (пикселей)
    )
    is
      ICURSOR               integer;                               -- Курсор для исполнения запроса по графам показателей раздела
      NCOL_RN               PKG_STD.TREF;                          -- Рег. номер графы
      SCOL_NAME             PKG_STD.TSTRING;                       -- Наименование графы
    begin
      /* Наименование строки будет отображаться в первой колонке */
      PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
                                          SNAME      => 'SROW_NAME',
                                          SCAPTION   => 'Наименование строки',
                                          SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
                                          NWIDTH     => NCOL_WIDTH);
      /* Остальные колонки это графы настройки РО - строим запрос по графам показателей */
      OPEN_ROWS_COLS_CUR(NRRPCONFSCTN => NRRPCONFSCTN, STABLE => 'RRPCOLUMN', NORDER => NCOL_ORDER, ICURSOR => ICURSOR);
      /* Обходим графы показателей раздела */
      while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
      loop
        /* Считываем рег. номер строки */
        PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NCOL_RN);
        /* Считываем наименование строки */
        PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 2, SVALUE => SCOL_NAME);
        /* Наименование графы */
        PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
                                            SNAME      => DG_COL_NAME_BY_RRPCOLUMN(NRRPCOLUMN => NCOL_RN),
                                            SCAPTION   => SCOL_NAME,
                                            SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
                                            NWIDTH     => NCOL_WIDTH);
      end loop;
      /* Освобождаем курсор */
      PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
    exception
      when others then
        if (PKG_SQL_DML.IS_OPEN(ICURSOR => ICURSOR)) then
          PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
        end if;
        raise;
    end COLUMNS_INIT;
  begin
    /* Обращаемся к настройке */
    for S in (select T.RN NRN
                from RRPCONFSCTN T
               where T.RN = NRRPCONFSCTN
                 and exists (select null from RRPCONFSCTNMRK M where M.PRN = T.RN)
                 and exists (select null from V_USERPRIV UP where UP.CATALOG = T.CRN))
    loop
      /* Инициализируем таблицу данных */
      RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1);
      /* Инициализируем колонки таблицы данных */
      COLUMNS_INIT(RDG => RDG, NRRPCONFSCTN => S.NRN, NCOL_ORDER => NCOL_ORDER, NCOL_WIDTH => NMRKS_DG_COL_WIDTH);
      /* Открываем запрос по составу уникальных строк раздела */
      OPEN_ROWS_COLS_CUR(NRRPCONFSCTN => NRRPCONFSCTN, STABLE => 'RRPROW', NORDER => NROW_ORDER, ICURSOR => ICURSOR);
      /* Обходим выбранные записи строк */
      while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
      loop
        /* Считываем рег. номер строки */
        PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NROW_RN);
        /* Считываем наименование строки */
        PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 2, SVALUE => SROW_NAME);
        /* Заполняем наименование строки */
        PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_NAME', SVALUE => SROW_NAME, BCLEAR => true);
        /* Обходим сформированные колонки таблицы данных */
        for I in RDG.RCOL_DEFS.FIRST .. RDG.RCOL_DEFS.LAST
        loop
          /* Первую пропускаем - она зарезервирована под наименование строки */
          if (I > RDG.RCOL_DEFS.FIRST) then
            /* Определим рег. номер графы по её наименованию */
            NCOL_RN := RRPCOLUMN_BY_DG_COL_NAME(SDG_COL_NAME => RDG.RCOL_DEFS(I).SNAME);
            /* Заполняем графу описанием показателя */
            PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW   => RDG_ROW,
                                                SNAME  => RDG.RCOL_DEFS(I).SNAME,
                                                SVALUE => RRPCONFSCTNMRK_GET_DESC(NCOMPANY     => NCOMPANY,
                                                                                  NRRPCONFSCTN => S.NRN,
                                                                                  NRRPROW      => NROW_RN,
                                                                                  NRRPCOLUMN   => NCOL_RN));
          end if;
        end loop;
        /* Добавим строку для раздела */
        PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
      end loop;
      /* Освобождаем курсор */
      PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
      /* Сериализуем описание */
      COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1);
    end loop;
  exception
    when others then
      if (PKG_SQL_DML.IS_OPEN(ICURSOR => ICURSOR)) then
        PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
      end if;
      raise;
  end RRPCONFSCTN_GET;

  /* Добавление раздела регламентированного отчёта */
  procedure RRPCONFSCTN_INSERT
  (
    NPRN                    in number,                             -- Рег. номер настройки форм регламентированного отчёта
    SCODE                   in varchar2,                           -- Мнемокод
    SNAME                   in varchar2,                           -- Наименование
    NRN                     out number                             -- Рег. номер созданной записи
  )
  is
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
  begin
    /* Добавим раздел */
    P_RRPCONFSCTN_INSERT(NCOMPANY            => NCOMPANY,
                         NPRN                => NPRN,
                         SCODE               => SCODE,
                         SNAME               => SNAME,
                         SRRPCONFSCTN        => null,
                         SRRPPRMGRP          => null,
                         SNOTE               => null,
                         NHTML_HIDE          => 0,
                         NHTML_HIDE_NAME_COL => 0,
                         NHTML_MAKE_HIER_GRP => 0,
                         SCLSF_CODE          => null,
                         NLINKS_UPDATE       => 0,
                         NDUP_RN             => null,
                         NRN                 => NRN);
  end RRPCONFSCTN_INSERT;
  
  /* Исправление раздела регламентированного отчёта */
  procedure RRPCONFSCTN_UPDATE
  (
    NRN                     in number,                             -- Рег. номер раздела
    SCODE                   in varchar2,                           -- Мнемокод раздела
    SNAME                   in varchar2                            -- Наименование раздела
  )
  is
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
    RRES                    RRPCONFSCTN%rowtype;                   -- Запись раздела настройки формы регламентированного отчета
    RRRPCONFSCTN            RRPCONFSCTN%rowtype;                   -- Запись родительского раздела настройки регламентированного отчета
    RRRPPRMGRP              RRPPRMGRP%rowtype;                     -- Запись группы параметров регламентированного отчета
  begin
    /* Считаем исправляемую запись */
    RRES := GET_RRPCONFSCTN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRN);
    /* Считаем запись родительского этапа */
    if (RRES.RRPCONFSCTN is not null) then
      RRRPCONFSCTN := GET_RRPCONFSCTN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RRES.RRPCONFSCTN);
    end if;
    /* Считаем запись группы параметров */
    if (RRES.RRPPRMGRP is not null) then
      RRRPPRMGRP := GET_RRPPRMGRP_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RRES.RRPPRMGRP);
    end if;
    /* Исправим раздел */
    P_RRPCONFSCTN_UPDATE(NRN                 => RRES.RN,
                         NCOMPANY            => NCOMPANY,
                         SCODE               => SCODE,
                         SNAME               => SNAME,
                         SRRPCONFSCTN        => RRRPCONFSCTN.CODE,
                         SRRPPRMGRP          => RRRPPRMGRP.CODE,
                         SNOTE               => RRES.NOTE,
                         NHTML_HIDE          => RRES.HTML_HIDE,
                         NHTML_HIDE_NAME_COL => RRES.HTML_HIDE_NAME_COL,
                         NHTML_MAKE_HIER_GRP => RRES.HTML_MAKE_HIER_GRP,
                         SCLSF_CODE          => RRES.CLSF_CODE,
                         NFORMULA_UPDATE     => 1,
                         NMARK_UPDATE        => 1);
  end RRPCONFSCTN_UPDATE;
  
  /* Удаление раздела регламентированного отчёта */
  procedure RRPCONFSCTN_DELETE
  (
    NRN                     in number   -- Рег. номер раздела
  )
  is
  begin
    /* Удалим раздел */
    P_RRPCONFSCTN_DELETE(NCOMPANY => GET_SESSION_COMPANY(), NRN => NRN);
  end RRPCONFSCTN_DELETE;

  /* Получение описания настройки регламентированного отчета */
  procedure RRPCONF_GET
  (
    NRRPCONF                in number,                             -- Рег. номер настройки форм регламентированного отчёта
    COUT                    out clob                               -- Описание настройки
  )
  is
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
    SNAME_SHORT             PKG_STD.TSTRING;                       -- Краткое наименование раздела
  begin
    /* Формируем XML с данными */
    PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
    PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
    /* Обратимся к настройке */
    for CONF in (select C.RN   NRN,
                        C.NAME SNAME
                   from RRPCONF C
                  where C.RN = NRRPCONF
                    and exists (select null from V_USERPRIV UP where UP.CATALOG = C.CRN))
    loop
      /* Добавим в выдачу сведения о настройке */
      PKG_XFAST.DOWN_NODE(SNAME => 'XCONF');
      PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => CONF.SNAME);
      PKG_XFAST.UP();
      /* Обходим разделы настройки */
      for C in (select T.RN   NRN,
                       T.CODE SCODE,
                       T.NAME SNAME
                  from RRPCONFSCTN T
                 where T.PRN = CONF.NRN
                   and exists (select null from V_USERPRIV UP where UP.CATALOG = T.CRN)
                 order by T.CODE,
                          T.NAME)
      loop
        /* Составим краткое наименование */
        SNAME_SHORT := SUBSTR(C.SNAME, 1, NSECTION_NAME_MAX_LEN);
        if (LENGTH(C.SNAME) > NSECTION_NAME_MAX_LEN) then
          SNAME_SHORT := SNAME_SHORT || '...';
        end if;
        /* Формирование элемента XML с данными о разделе */
        PKG_XFAST.DOWN_NODE(SNAME => 'XSECTIONS');
        PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => C.NRN);
        PKG_XFAST.ATTR(SNAME => 'SCODE', SVALUE => C.SCODE);
        PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => C.SNAME);
        PKG_XFAST.ATTR(SNAME => 'SNAME_SHORT', SVALUE => SNAME_SHORT);
        PKG_XFAST.ATTR(SNAME  => 'NDELETE_ALLOW',
                       NVALUE => UTL_UNIT_ACTION_GET_ALLOW(NCOMPANY => NCOMPANY,
                                                           NRN      => C.NRN,
                                                           SUNIT    => SUNIT_RRPCONFSCTN,
                                                           SACTION  => SACTION_DELETE));
        PKG_XFAST.UP();
      end loop;
    end loop;
    /* Закрываем описание */
    PKG_XFAST.UP();
    /* Сериализуем описание */
    COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
    /* Завершаем формирование XML */
    PKG_XFAST.EPILOGUE();
  end RRPCONF_GET;
  
end PKG_P8PANELS_RRPCONFED;
/
