create or replace package PKG_P8PANELS_RRPCONFED as

  /* Получение разделов регламентированного отчёта */
  procedure RRPCONF_GET_SECTIONS
  (
    NRN_RRPCONF             in number,  -- Ид. нстройки форм регламентированного отчёта
    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 RRPCONFSCTNMRK_GET_CODES
  (
    NRN                     in number,    -- Ид. показателя раздела
    SRRPCONF                out varchar2, -- Код настройки формы регламентированного отчёта
    SRRPCONFSCTN            out varchar2, -- Код раздела
    SRRPCONFSCTNMRK         out varchar2  -- Код показателя раздела
  );
  
  /* Формирование кода и наименования показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_GET_CODE_NAME
  (
    NRRPCONFSCTN            in number,    -- Рег. номер раздела
    NRRPROW                 in number,    -- Рег. номер строки
    NRRPCOLUMN              in number,    -- Рег. номер графы
    SCODE                   out varchar2, -- Мнемокод показателя раздела
    SNAME                   out varchar2  -- Наименование показателя раздела    
  );
  
  /* Формирование кода и наименования показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_GET_NAME
  (
    NRRPCONFSCTNMRK         in number,   -- Рег. номер показателя
    SNAME                   out varchar2 -- Наименование показателя раздела    
  );
  
  /* Добавление показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_INSERT
  (
    NPRN                    in number,   -- Ид. раздела
    SCODE                   in varchar2, -- Мнемокод показателя раздела
    SNAME                   in varchar2, -- Наименование показателя раздела
    NRRPROW                 in number,   -- Рег. номер строки
    NRRPCOLUMN              in number,   -- Рег. номер графы
    NRN                     out number   -- Ид. созданной записи
  );
  
  /* Исправление показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_UPDATE
  (
    NRN                     in number,  -- Ид. показателя раздела            
    SNAME                   in varchar2 -- Новое наименование
  );
  
  /* Удаление показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_DELETE
  (        
    NRN                     in number   -- Ид. показателя раздела
  );
  
end PKG_P8PANELS_RRPCONFED;
/
create or replace package body PKG_P8PANELS_RRPCONFED as

  /* Маски для формирования представления параметров состава показателя */
  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
  (
    SUNIT                   in varchar2,     -- Мнемокод раздела (см. константы SUNIT_*)
    SACTION                 in varchar2,     -- Действие (см. константы SACTION_*)
    NRN                     in number        -- Рег. номер записи
  ) 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
              select 0
                into NRESULT
                from DUAL
               where exists (select null from RRPDOC_STORAGE_SCTN S where S.RRPCONFSCTN = NRN)
                  or exists (select null from RRPDOCPRM P where P.RRPCONFSCTN = NRN)
                  or exists (select null from RRPCONFSCTN C where C.RRPCONFSCTN = NRN);
            exception
              /* Если таких записей нет - удаление возможно */
              when NO_DATA_FOUND then
                NRESULT := 1;
              /* Если необработанная ошибка - удаление невозможно */
              when others then
                NRESULT := 0;
            end;
          /* Действие неопределено */
          else
            NRESULT := 1;
        end case;
      /* Показатель раздела настройки регламентированного отчета */
      when SUNIT_RRPCONFSCTNMRK then
        /* Исходим от действия */
        case SACTION
          /* Удаление */
          when SACTION_DELETE then
            /* Если показатель есть в сформированном отчете - удаление невозможно */
            begin
              select 0
                into NRESULT
                from DUAL
               where exists (select null from RRPDOC_STORAGE_MRK M where M.RRPCONFSCTNMRK = NRN);
            exception
              /* Если таких записей нет - удаление возможно */
              when NO_DATA_FOUND then
                NRESULT := 1;
              /* Если необработанная ошибка - удаление невозможно */
              when others then
                NRESULT := 0;
            end;
        else
          NRESULT := 1;
        end case;
      /* Раздел неопределен */
      else
        NRESULT := 1;
    end case;
    /* Возвращаем результат */
    return NRESULT;
  end UTL_UNIT_ACTION_GET_ALLOW;

  /* Формирование описателя состава показателя регламентированного отчета */
  function UTL_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 UTL_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 UTL_MARK_GET_CODE_BY_CN;
    
    /* Считывание мнемокода настройки по рег. номеру состава показателя */
    function UTL_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 UTL_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 := UTL_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 := UTL_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;
    
    /* Считывание типа источинка состава показателя в текстовом представлении */
    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;
  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 UTL_RRPCONFSCTNMRKCN_GET_DESC;

  /* Получение разделов регламентированного отчёта */
  procedure RRPCONF_GET_SECTIONS
  (
    NRN_RRPCONF             in number,                             -- Ид. нстройки форм регламентированного отчёта
    COUT                    out clob                               -- Список разделов
  )
  is
    NVERSION                PKG_STD.TREF;                          -- Рег. номер версии словаря контрагентов
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
    RDG                     PKG_P8PANELS_VISUAL.TDATA_GRID;        -- Описание таблицы
    RDG_ROW                 PKG_P8PANELS_VISUAL.TROW;              -- Строка таблицы
    CDG                     clob;                                  -- XML данных раздела
    CXML                    PKG_CONTVALLOC2NS.TCONTAINER;          -- Контейнер для данных XML
    RRRPCONFSCTNMRK         RRPCONFSCTNMRK%rowtype;                -- Рег. номер показателя
    NCURRENT_SECTION        PKG_STD.TNUMBER;                       -- Идентификатор раздела настройки в контейнере
    NSECTION_RN             PKG_STD.TREF;                          -- Рег. номер раздел настройки
    SSECTION_CODE           PKG_STD.TSTRING;                       -- Мнемокод раздела настройки
    SSECTION_NAME           PKG_STD.TSTRING;                       -- Наименование раздела настройки
    CSECTION_CLOB           clob;                                  -- Данные по разделу настройки
       
    /* Инициализация колонок граф показателей */
    procedure MARKS_COLUMNS_INIT
    (
      RDG                   in out nocopy PKG_P8PANELS_VISUAL.TDATA_GRID, -- Описание таблицы
      NRRPCONFSCTN          in number                                     -- Рег. номер раздела
    )
    is
    begin
      /* Цикл по графам показателей раздела */
      for REC in (select C.CODE,
                         C.NAME
                    from RRPCONFSCTNMRK T,
                         RRPCOLUMN      C
                   where T.PRN = NRRPCONFSCTN
                     and T.RRPCOLUMN = C.RN
                   group by C.RN,
                            C.CODE,
                            C.NAME
                   order by C.CODE)
      loop
        /* Наименование графы */
        PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
                                                   SNAME      => 'SCOL_' || REC.CODE,
                                                   SCAPTION   => REC.NAME,
                                                   SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
                                                   NWIDTH     => 200);
        /* Рег. номер графы */
        PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
                                                   SNAME      => 'NCOL_RN_' || REC.CODE,
                                                   SCAPTION   => REC.NAME || ' рег. номер',
                                                   SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
                                                   BVISIBLE   => false);
        /* Рег. номер показателя */
        PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
                                                   SNAME      => 'NMARK_RN_' || REC.CODE,
                                                   SCAPTION   => REC.NAME || ' рег. номер показателя',
                                                   SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
                                                   BVISIBLE   => false);
        /* Мнемокод показателя */
        PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
                                                   SNAME      => 'SMARK_CODE_' || REC.CODE,
                                                   SCAPTION   => REC.NAME || ' мнемокод показателя',
                                                   SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
                                                   BVISIBLE   => false);
        /* Для составов показтелей */
        PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
                                                   SNAME      => 'MARK_CNS_' || REC.CODE,
                                                   SCAPTION   => REC.NAME || ' состав показателя',
                                                   SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
                                                   BVISIBLE   => false);
      end loop;
    end MARKS_COLUMNS_INIT;
    
    /* Считывание показателя по строке/графе */
    function RRPCONFSCTNMRK_GET_ROWCOL
    (
      NRRPCONFSCTN          in number,              -- Рег. номер раздела
      NRRPROW               in number,              -- Рег. номер строки
      NRRPCOLUMN            in number               -- Рег. номер графы
    ) return                RRPCONFSCTNMRK%rowtype  -- Запись показателя
    is
      RRESULT               RRPCONFSCTNMRK%rowtype; -- Рег. номер показателя
    begin
      /* Считываем рег. номер показателя */
      begin
        select T.*
          into RRESULT
          from RRPCONFSCTNMRK T
         where T.PRN = NRRPCONFSCTN
           and T.RRPROW = NRRPROW
           and T.RRPCOLUMN = NRRPCOLUMN;
      exception
        when others then
          RRESULT := null;
      end;
      /* Возвращаем результат */
      return RRESULT;
    end RRPCONFSCTNMRK_GET_ROWCOL;
  begin
    /* Очистка контейнера */
    PKG_CONTVALLOC2NS.PURGE(RCONTAINER => CXML);
    /* Определение версии раздела */
    NVERSION := GET_SESSION_VERSION(SUNITCODE => 'RRPConfig');
    /* Цикл по разделам настройки форм регламентированного отчёта */
    for S in (select T.RN NRN,
                     T.VERSION NVERSION,
                     T.CRN NCRN,
                     T.PRN NPRN,
                     T.CODE SCODE,
                     T.NAME SNAME,
                     COALESCE((select 1
                                from RRPCONFSCTNMRK M
                               where M.PRN = T.RN
                                 and ROWNUM = 1),
                              0) NMARKS_EXISTS,
                     ROWNUM RNUM
                from RRPCONFSCTN T
               where T.PRN = NRN_RRPCONF
                 and T.VERSION = NVERSION
               order by T.CODE)
    loop
      /* Инициализируем таблицу данных */
      RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1);
      /* Формируем структуру заголовка */
      PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
                                                 SNAME      => 'SROW_NAME',
                                                 SCAPTION   => '',
                                                 SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
                                                 NWIDTH     => 150);
      /* Формируем структуру заголовка */
      PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
                                                 SNAME      => 'SROW_CODE',
                                                 SCAPTION   => 'Мнемокод строки',
                                                 SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
                                                 BVISIBLE   => false);
      /* Формируем структуру заголовка */
      PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
                                                 SNAME      => 'NROW_RN',
                                                 SCAPTION   => 'Рег. номер строки',
                                                 SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
                                                 BVISIBLE   => false);
      /* Если раздел содержит показатели */
      if (S.NMARKS_EXISTS = 1) then
        /* Инициализируем колонки граф */
        MARKS_COLUMNS_INIT(RDG => RDG, NRRPCONFSCTN => S.NRN);
        /* Обходим строки раздела */
        for R in (select R.RN,
                         R.CODE,
                         R.NAME
                    from RRPCONFSCTNMRK T,
                         RRPROW         R
                   where T.PRN = S.NRN
                     and R.RN = T.RRPROW
                   group by R.RN,
                            R.CODE,
                            R.NAME,
                            R.ROW_CODE,
                            R.SORT_NUMB
                   order by R.SORT_NUMB,
                            LPAD(R.ROW_CODE, 40, '0'),
                            LPAD(R.CODE, 20, '0'))
        loop
          /* Заполняем наименование строки */
          PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_NAME', SVALUE => R.NAME, BCLEAR => true);
          /* Заполняем мнемокод строки */
          PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_CODE', SVALUE => R.CODE);
          /* Заполняем рег. номер строки */
          PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NROW_RN', NVALUE => R.RN);
          /* Обходим графы раздела */
          for C in (select C.RN,
                           C.CODE,
                           C.NAME
                      from RRPCONFSCTNMRK T,
                           RRPCOLUMN      C
                     where T.PRN = S.NRN
                       and C.RN = T.RRPCOLUMN
                     group by C.RN,
                              C.CODE,
                              C.NAME,
                              C.COLUMN_CODE,
                              C.SORT_NUMB
                     order by C.SORT_NUMB,
                              LPAD(C.COLUMN_CODE, 40, '0'),
                              LPAD(C.CODE, 20, '0'))
          loop
            /* Считываем показатель по строке/графе */
            RRRPCONFSCTNMRK := RRPCONFSCTNMRK_GET_ROWCOL(NRRPCONFSCTN => S.NRN, NRRPROW => R.RN, NRRPCOLUMN => C.RN);
            /* Заполняем рег. номер графы */
            PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SCOL_' || C.CODE, SVALUE => C.NAME);
            /* Заполняем рег. номер графы */
            PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOL_RN_' || C.CODE, NVALUE => C.RN);
            /* Заполняем рег. номер показателя */
            PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW   => RDG_ROW,
                                             SNAME  => 'NMARK_RN_' || C.CODE,
                                             NVALUE => RRRPCONFSCTNMRK.RN);
            /* Если ошибка считывания показателя */
            if (RRRPCONFSCTNMRK.RN is not null) then
              /* Заполняем мнемокод показателя */
              PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW   => RDG_ROW,
                                               SNAME  => 'SMARK_CODE_' || C.CODE,
                                               SVALUE => RRRPCONFSCTNMRK.CODE);
              /* Добавляем атрибут состава показателей */
              PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'MARK_CNS_' || C.CODE, SVALUE => null);
            end if;
          end loop;
          /* Добавим строку для раздела */
          PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
        end loop;
      end if;
      /* Сериализуем описание */
      CDG := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1);
      /* Заполняем контейнер данными о разделе */
      PKG_CONTVALLOC2NS.PUTN(RCONTAINER => CXML, NTABID => S.RNUM, SROWID => 'RN', NVALUE => S.NRN);
      PKG_CONTVALLOC2NS.PUTS(RCONTAINER => CXML, NTABID => S.RNUM, SROWID => 'CODE', SVALUE => S.SCODE);
      PKG_CONTVALLOC2NS.PUTS(RCONTAINER => CXML, NTABID => S.RNUM, SROWID => 'NAME', SVALUE => S.SNAME);
      PKG_CONTVALLOC2NS.PUTLC(RCONTAINER => CXML, NTABID => S.RNUM, SROWID => 'CLOB', LCVALUE => CDG);
    end loop;
    /* Формируем XML с данными */
    PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
    PKG_XFAST.DOWN_NODE(SNAME => 'DATA');
    /* Цикл по контейнеру с данными о разделах */
    for X in 1 .. PKG_CONTVALLOC2NS.COUNT_(RCONTAINER => CXML)
    loop
      /* Ид. раздела */
      if (X = 1) then
        NCURRENT_SECTION := PKG_CONTVALLOC2NS.FIRST_(RCONTAINER => CXML);
      else
        NCURRENT_SECTION := PKG_CONTVALLOC2NS.NEXT_(RCONTAINER => CXML, NTABID => NCURRENT_SECTION);
      end if;
      /* Рег. номер раздела */
      NSECTION_RN := PKG_CONTVALLOC2NS.GETN(RCONTAINER => CXML, NTABID => NCURRENT_SECTION, SROWID => 'RN');
      /* Мнемокод раздела */
      SSECTION_CODE := PKG_CONTVALLOC2NS.GETS(RCONTAINER => CXML, NTABID => NCURRENT_SECTION, SROWID => 'CODE');
      /* Наименование раздела */
      SSECTION_NAME := PKG_CONTVALLOC2NS.GETS(RCONTAINER => CXML, NTABID => NCURRENT_SECTION, SROWID => 'NAME');
      /* Clob с показателями раздела */
      CSECTION_CLOB := PKG_CONTVALLOC2NS.GETLC(RCONTAINER => CXML, NTABID => NCURRENT_SECTION, SROWID => 'CLOB');
      /* Формирование элемента XML с данными о разделе */
      PKG_XFAST.DOWN_NODE(SNAME => 'SECTIONS');
      PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => NSECTION_RN);
      PKG_XFAST.ATTR(SNAME => 'SCODE', SVALUE => SSECTION_CODE);
      PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => SSECTION_NAME);
      PKG_XFAST.ATTR(SNAME  => 'NDELETE_ALLOW',
                     NVALUE => UTL_UNIT_ACTION_GET_ALLOW(SUNIT   => SUNIT_RRPCONFSCTN,
                                                         SACTION => SACTION_DELETE,
                                                         NRN     => NSECTION_RN));
      PKG_XFAST.VALUE_XML(LCVALUE => CSECTION_CLOB);
      /* Добавляем информацию о составах показателей */
      PKG_XFAST.DOWN_NODE(SNAME => 'MARK_CNS');
      /* Цикл по составам показателей раздела */
      for REC in (select T.PRN,
                         T.RN,
                         T.NUMB
                    from RRPCONFSCTNMRK   M,
                         RRPCONFSCTNMRKCN T
                   where M.PRN = NSECTION_RN
                     and T.PRN = M.RN
                   order by M.RN,
                            T.NUMB asc)
      loop
        /* Добавляем состав */
        PKG_XFAST.DOWN_NODE(SNAME => 'MARK_CN');
        PKG_XFAST.ATTR(SNAME => 'NPRN', NVALUE => REC.PRN);
        PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.RN);
        PKG_XFAST.ATTR(SNAME => 'SNUMB', SVALUE => REC.NUMB);
        PKG_XFAST.ATTR(SNAME  => 'SDESC',
                       SVALUE => UTL_RRPCONFSCTNMRKCN_GET_DESC(NCOMPANY => NCOMPANY, NRRPCONFSCTNMRKCN => REC.RN));
        PKG_XFAST.UP();
      end loop;
      PKG_XFAST.UP();
      PKG_XFAST.UP();
    end loop;
    PKG_XFAST.UP();
    /* Сериализуем описание */
    COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
    PKG_XFAST.EPILOGUE();
    /* Очистка контейнера */
    PKG_CONTVALLOC2NS.PURGE(RCONTAINER => CXML);
  end RRPCONF_GET_SECTIONS;

  /* Добавление раздела регламентированного отчёта */
  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
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
  begin
    /* Если действие недоступно для удаления */
    if (UTL_UNIT_ACTION_GET_ALLOW(SUNIT => SUNIT_RRPCONFSCTN, SACTION => SACTION_DELETE, NRN => NRN) = 0) then
      P_EXCEPTION(0,
                  'Данный раздел используется в сформированных документах/параметрах документа/дочерний раздел. Удаление запрещено.');
    end if;
    /* Удалим раздел */
    P_RRPCONFSCTN_DELETE(NRN => NRN, NCOMPANY => NCOMPANY);
  end RRPCONFSCTN_DELETE;
  
  /* Получение кодов настройки, раздела и показателя раздела по ид. показателя раздела */
  procedure RRPCONFSCTNMRK_GET_CODES
  (
    NRN                     in number,    -- Ид. показателя раздела
    SRRPCONF                out varchar2, -- Код настройки формы регламентированного отчёта
    SRRPCONFSCTN            out varchar2, -- Код раздела
    SRRPCONFSCTNMRK         out varchar2  -- Код показателя раздела
  )
  is
  begin
    /* Считываем данные показателя/раздела/настройки */
    begin
      select C.CODE,
             S.CODE,
             M.CODE
        into SRRPCONF,
             SRRPCONFSCTN,
             SRRPCONFSCTNMRK
        from RRPCONF        C,
             RRPCONFSCTN    S,
             RRPCONFSCTNMRK M
       where M.RN = NRN
         and S.RN = M.PRN
         and C.RN = S.PRN;
    exception
      when others then
        P_EXCEPTION(0,
                    'Не определен показатель настройки регламентированного отчета.');
    end;
  end RRPCONFSCTNMRK_GET_CODES;
  
  /* Формирование кода и наименования показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_GET_CODE_NAME
  (
    NRRPCONFSCTN            in number,                             -- Рег. номер раздела
    NRRPROW                 in number,                             -- Рег. номер строки
    NRRPCOLUMN              in number,                             -- Рег. номер графы
    SCODE                   out varchar2,                          -- Мнемокод показателя раздела
    SNAME                   out varchar2                           -- Наименование показателя раздела    
  )
  is
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
    RRRPCONFSCTN            RRPCONFSCTN%rowtype;                   -- Запись раздела регламентированного отчета
    RRRPROW                 RRPROW%rowtype;                        -- Запись строки регламентированного отчета
    RRRPCOLUMN              RRPCOLUMN%rowtype;                     -- Запись графы регламентированного отчета
  begin
    /* Считываем запись раздела регламентированного отчета */
    RRRPCONFSCTN := GET_RRPCONFSCTN_ID(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, NRN => NRRPCONFSCTN);
    /* Считываем запись строки регламентированного отчета */
    RRRPROW := GET_RRPROW_ID(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, NRN => NRRPROW);
    /* Считываем запись графы регламентированного отчета */
    RRRPCOLUMN := GET_RRPCOLUMN_ID(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, NRN => NRRPCOLUMN);
    /* Если все записи считаны */
    if ((RRRPCONFSCTN.RN is not null) and (RRRPROW.RN is not null) and (RRRPCOLUMN.RN is not null)) then
      /* Сформируем код показателя */
      P_RRPCONFSCTNMRK_MAKE_CODE(SRRPCONFSCTN => RRRPCONFSCTN.CODE,
                                 SRRPROW      => RRRPROW.CODE,
                                 SRRPCOLUMN   => RRRPCOLUMN.CODE,
                                 SCODE        => SCODE);
      /* Сформируем наименование показателя */
      P_RRPCONFSCTNMRK_MAKE_NAME(NCOMPANY            => NCOMPANY,
                                 NRRPROW             => RRRPROW.RN,
                                 NRRPCOLUMN          => RRRPCOLUMN.RN,
                                 NCHANGE_NAME        => 1,
                                 NCHANGE_NAME_PARENT => 0,
                                 SNAME               => SNAME);
    end if;
  end RRPCONFSCTNMRK_GET_CODE_NAME;
  
  /* Формирование кода и наименования показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_GET_NAME
  (
    NRRPCONFSCTNMRK         in number,                             -- Рег. номер показателя
    SNAME                   out varchar2                           -- Наименование показателя раздела    
  )
  is
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
    RRRPCONFSCTNMRK         RRPCONFSCTNMRK%rowtype;                -- Запись показателя регламентированного отчета
  begin
    /* Считываем запись раздела регламентированного отчета */
    RRRPCONFSCTNMRK := GET_RRPCONFSCTNMRK_ID(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, NRN => NRRPCONFSCTNMRK);
    /* Указываем наименование показателя */
    SNAME := RRRPCONFSCTNMRK.NAME;
  end RRPCONFSCTNMRK_GET_NAME;
  
  /* Добавление показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_INSERT
  (
    NPRN                    in number,                             -- Ид. раздела
    SCODE                   in varchar2,                           -- Мнемокод показателя раздела
    SNAME                   in varchar2,                           -- Наименование показателя раздела
    NRRPROW                 in number,                             -- Рег. номер строки
    NRRPCOLUMN              in number,                             -- Рег. номер графы
    NRN                     out number                             -- Ид. созданной записи
  )
  is
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
    RRRPROW                 RRPROW%rowtype;                        -- Запись строки регламентированного отчета
    RRRPVERSION_ROW         RRPVERSION%rowtype;                    -- Запись редакции строки регламентированного отчета
    RRRPCOLUMN              RRPCOLUMN%rowtype;                     -- Запись графы регламентированного отчета
    RRRPVERSION_COL         RRPVERSION%rowtype;                    -- Запись редакции графы регламентированного отчета
  begin
    /* Если строка не указана */
    if (NRRPROW is null) then
      P_EXCEPTION(0,
                  'Ошибка считывания строки регламентированного отчета.');
    end if;
    /* Если графа не указана */
    if (NRRPCOLUMN is null) then
      P_EXCEPTION(0,
                  'Ошибка считывания графы регламентированного отчета.');
    end if;
    /* Считываем запись строки регламентированного отчета */
    RRRPROW := GET_RRPROW_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRRPROW);
    /* Считываем запись графы регламентированного отчета */
    RRRPCOLUMN := GET_RRPCOLUMN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRRPCOLUMN);
    /* Считываем запись редакции строки регламентированного отчета */
    RRRPVERSION_ROW := GET_RRPVERSION_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RRRPROW.RRPVERSION);
    /* Считываем запись редакции графы регламентированного отчета */
    RRRPVERSION_COL := GET_RRPVERSION_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RRRPCOLUMN.RRPVERSION);
    /* Добавим показатель */
    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_COL.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,                             -- Ид. показателя раздела            
    SNAME                   in varchar2                            -- Новое наименование
  )
  is
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
    RESSCTNMRK              RRPCONFSCTNMRK%rowtype;                -- Запись настройки показателя регламентированного отчета
    RESROW                  RRPROW%rowtype;                        -- Запись строки регламентированного отчета
    RESCOLUMN               RRPCOLUMN%rowtype;                     -- Запись графы регламентированного отчета
    RRRPPRM                 RRPPRM%rowtype;                        -- Запись типового параметра регламентированного отчета
    SROWVER                 PKG_STD.TSTRING;                       -- Мнемокод редакции строки
    SCOLVER                 PKG_STD.TSTRING;                       -- Мнемокод редакции графы
  begin
    /* Получение записи параметра раздела */
    RESSCTNMRK := GET_RRPCONFSCTNMRK_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRN);
    /* Получение записи строки */
    RESROW := GET_RRPROW_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RESSCTNMRK.RRPROW);
    /* Получение записи графы */
    RESCOLUMN := GET_RRPCOLUMN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RESSCTNMRK.RRPCOLUMN);
    /* Получение мнемокода редакции строки */
    if (RESROW.RRPVERSION is not null) then
      SROWVER := GET_RRPVERSION_CODE_ID(NFLAG_SMART => 0, NRN => RESROW.RRPVERSION);
    end if;
    /* Получение мнемокода редакции графы */
    if (RESCOLUMN.RRPVERSION is not null) then
      SCOLVER := GET_RRPVERSION_CODE_ID(NFLAG_SMART => 0, NRN => RESCOLUMN.RRPVERSION);
    end if;
    /* Получение записи типового параметра */
    if (RESSCTNMRK.RRPPRM is not null) then
      RRRPPRM := GET_RRPPRM_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RESSCTNMRK.RRPPRM);
    end if;
    /* Исправим показатель */
    P_RRPCONFSCTNMRK_UPDATE(NRN                => NRN,
                            NCOMPANY           => NCOMPANY,
                            NNUMB              => RESSCTNMRK.NUMB,
                            SCODE              => RESSCTNMRK.CODE,
                            SNAME              => SNAME,
                            SRRPROW            => RESROW.CODE,
                            SRRPVERSION_ROW    => SROWVER,
                            SRRPCOLUMN         => RESCOLUMN.CODE,
                            SRRPVERSION_COLUMN => SCOLVER,
                            SPKG_ROW           => RESSCTNMRK.PKG_ROW,
                            SPRC_ROW           => RESSCTNMRK.PRC_ROW,
                            SPKG_COL           => RESSCTNMRK.PKG_COL,
                            SPRC_COL           => RESSCTNMRK.PRC_COL,
                            SRRPPRM            => RRRPPRM.CODE,
                            NIGNORE_ZOOM       => RESSCTNMRK.IGNORE_ZOOM,
                            NIGNORE_SHARP      => RESSCTNMRK.IGNORE_SHARP,
                            SCLSF_CODE         => RESSCTNMRK.CLSF_CODE,
                            NFORMULA_UPDATE    => 0,
                            SNOTE              => RESSCTNMRK.NOTE);
  end RRPCONFSCTNMRK_UPDATE;
  
  /* Удаление показателя раздела регламентированного отчёта */
  procedure RRPCONFSCTNMRK_DELETE
  (        
    NRN                     in number                              -- Ид. показателя раздела
  )
  is
    NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
  begin
    /* Если действие недоступно для удаления */
    if (UTL_UNIT_ACTION_GET_ALLOW(SUNIT => SUNIT_RRPCONFSCTNMRK, SACTION => SACTION_DELETE, NRN => NRN) = 0) then
      P_EXCEPTION(0,
                  'Данный показатель используется в сформированных документах. Удаление запрещено.');
    end if;
    /* Удалим показатель */
    P_RRPCONFSCTNMRK_DELETE(NCOMPANY => NCOMPANY, NRN => NRN);
  end RRPCONFSCTNMRK_DELETE;
  
end PKG_P8PANELS_RRPCONFED;
/
