Приветствую Вас ГостьВторник, 14.05.2024, 18:23

Каталог статей


Регистр расчета

Объект конфигурации Регистр расчета предназначен для описания структуры накопления данных, являющихся результатами расчетов. На основе объекта конфигурации Регистр расчета платформа создает в базе данных таблицы, в которых будут накапливаться данные, формируемые различными объектами базы данных.

Отличительными же особенностями регистра расчета является его периодичность, возможность использования механизмов вытеснения по периоду действия и зависимости по базовому периоду, а также связь с планом видов расчета.

Периодичность
Периодичность регистра расчета может быть определена одним из следующих значений:

  • День,
  • Месяц,
  • Квартал,
  • Год.

Периодичность регистра расчета определяет промежуток времени, к которому будет относиться каждая запись регистра.

Если указана периодичность День, то каждая запись регистра будет относиться к какому-либо дню; если периодичность – Месяц, то к какому-либо месяцу и т. д.

Для указания факта принадлежности записи к какому-либо периоду регистр имеет служебный реквизит ПериодРегистрации типа Дата. При записи данных в регистр платформа всегда приводит значение этого реквизита к началу того периода, в который он попадает.

Свойство "Период действия" определяет, можно ли будет в данном регистре учитывать записи, протяженные во времени.

  • Если это свойство установлено, то у плана расчета, который указан в свойствах данного регистра, должно быть установлено свойство "Использует период действия". Установка этого свойства означает, что в данном регистре будет задействован механизм вытеснения и будет формироваться фактический период действия записей. При установленном свойстве так же должны быть установлены свойства "График" (непериодический регистр сведений), "Значение графика" (ресурс регистра) и "Дата графика" (измерение регистра).  
  • Если это свойство не установлено, то допускается использовать планы расчетов с установленным свойством  "Использует период действия".

Типы периодов

  • Период регистрации - В каком периоде зарегистрировано событие, т.е. обычно когда введен документ.
  • Период действия - В каком периоде действует событие, т.е. к какому периоду относится событие. Период действия одной записи регистра расчета может лежать только в рамках одного периода расчетов. Если необходимо ввести расчет, который длится в рамках нескольких расчетных периодов, его нужно разбить на несколько записей
  • Базовый период - Имеет смысл только для расчетов, зависящих от других видов расчета (базовых) и представляет собой интервал действия базовых видов расчета. Базовый период – это произвольный непрерывный интервал дат, который может покрывать несколько расчетных периодов.
  • Фактический период действия - Если период действия вытесняется другими видами расчетов, то фактический период действия определяется как совокупность интервалов времени в рамках периода действия, на протяжении которых расчет действует с учетом всех вытеснений.

Важно помнить, что в полях ПериодРегистрации и ПериодДействия хранятся даты начала соответствующего расчетного периода. Это нужно учитывать при построении отчетов. 

Свойство «Базовое» измерения регистра расчета

При установке этого свойства у измерений система создаст дополнительные индексы таблицы регистра расчета, при этом базовые измерения в индексе будут следовать в том порядке, в котором они заданы в конфигураторе. Такая структура индекса позволяет оптимизировать выполнение запросов на получение базы с соединением таблиц по набору измерений, которые отмечены как базовые. Поэтому для оптимизации работы решения следует отмечать как базовые те измерения регистров расчета, которые наиболее часто будут использованы при получении базы.

Ресурсы и реквизиты регистра расчетов

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

Если показатель должен храниться в базе, но в расчете по базе он не участвует, то такой показатель должен быть введен в структуру регистра как реквизит

Например, поле Размер начисления, отражающее тариф, по которому был рассчитан оклад или размер процента для начисления премии, не должно вводиться в регистр как ресурс, так как получать базу по этому полю бессмысленно.

Использование нескольких графиков в регистре расчета.

График должен представлять собой регистр сведений (непериодический, с обязательным измерением типа Дата и ресурсом типа Число), в котором содержится временная схема исходных данных, участвующих в расчетах.

Для того, чтобы была возможность использовать в одном регистре расчета несколько разных графиков (по дням, по часам, по сменам и т.д.), вводят справочник графиков работ. В регистр сведений графика и в регистр расчета добавляют измерение или реквизит (зависит от спецификации задачи), содержащее ссылку на этот график. 

Например, создали регистр сведений "ГрафикиРаботы". В регистре расчета установили свойство "График" = "ГрафикиРаботы", чтобы связать регистр сведений с графиком и регистр расчета.

В регистр расчета добавили реквизит "График работы". Чтобы связать этот реквизит с измерением регистра сведений, в котором учитывается график, заполняют свойство реквизита "Связь с графиком" (в поле доступен перечень измерений регистра сведений).

Для разделения начислений по часам и по дням, обычно вводят реквизит "Вид учета времени" типа перечисление. 

В регистре сведений "ГрафикиРаботы" добавляют аналогичное измерение.

Вытеснение и фактический период расчета

При вводе вытесняющего вида расчета таблица регистра расчета не меняется (поля Период действия, ПериодДействияНачало и ПериодДействияКонец имеют те же значения, что и без вытеснения). Меняется только таблица фактического периода расчета. В ней будет столько строк, сколько нужно описать для каждого непрерывного временного интервала для каждого вида расчета, т.е. если было оклад с 01.21.2020 по 28.02.2020 и добавили вытесняющий вид расчета Больничный (с 14.02.2020 по 17.02.2020), то для оклада, вместо одной строки будет 2:

  • с 01.21.2020 по 13.02.2020
  • с 18.21.2020 по 28.02.2020

При формировании фактических периодов учитывается период действия вида расчета. Если у вытесняющего вида расчета период больше чем у вытесняемого, то механизм вытеснения работать не будет. Т.е. если у больничного период действия 01.03.2020, то он не сможет вытеснить оклад с периодом действия 01.02.2020 и фактический период действия у него будет пустым.

Чтобы больничный был учтен, надо создать сторно-записи за нужный интервал, тогда фактический период для больничного будет заполнен.

Получить фактический период по виду расчет можно с помощью запроса:

    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    ФактическийПериод.НомерСтроки,
    |    СУММА(РАЗНОСТЬДАТ(ФактическийПериод.ПериодДействияНачало, 
    |                КОНЕЦПЕРИОДА(ФактическийПериод.ПериодДействияКонец, ДЕНЬ),
    |                ДЕНЬ)) + 1  КАК КоличествоДней
    |ИЗ
    |    РегистрРасчета.ОсновныеНачисленияРегл.ФактическийПериодДействия(Регистратор = &Регистратор) КАК ФактическийПериод
    |
    |СГРУППИРОВАТЬ ПО
    |    ФактическийПериод.НомерСтроки";

    Запрос.УстановитьПараметр("Регистратор", Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();

    Пока Выборка.Следующий() Цикл
              ...
    КонецЦикла;

 

Сторно

Сторно записи нужны, когда период регистрации записей с видом расчета больше периода действия, т.е. документ вводят задним числом (например больничный вводят в следующем месяце). В этом случае период действия уже занят записями у которых период регистрации совпадает с периодом действия, и новый вид расчета не может занять нужный ему период, чтобы сформировались полноценные начисления. 

Для того, чтобы освободить нужный период действия от ранее введенных расчетов, надо ввести на соответствующий период по этим видам расчета сторно записи.

Чтобы не вычислять самостоятельно по каким именно видам расчета вводить сторно записи, можно использовать метод ПолучитьДополнение(). Он применяется к набору записей регистра расчета, поддерживающего период действия, и не требует указания параметров.

Пример использования:

На вход процедуры подается ссылка на документ, в котором есть начисление за предыдущий период. Процедура получает таблицу значений, содержащую данные по требуемым сторно записям. На основании этих данных добавляем в табличную часть документа строки с сторно записями.

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

    // Получить таблицу сторно-записей для набора записей текущего документа
    ТаблицаСторно = НаборЗаписей.ПолучитьДополнение();

    Документ = Ссылка.ПолучитьОбъект();
    
    // Сформировать сторно-записи в регистре расчета
    Для Каждого СтрокаСторно из ТаблицаСторно Цикл
        Запись = Документ.Движения.ОсновныеНачисленияРегл.Добавить();
        Запись.ВидРасчета = СтрокаСторно.ВидРасчета;
        Запись.ПериодРегистрации = СтрокаСторно.ПериодРегистрацииСторно;
        Запись.ПериодДействияНачало = СтрокаСторно.ПериодДействияНачалоСторно;
        Запись.ПериодДействияКонец = СтрокаСторно.ПериодДействияКонецСторно;
        
        // Заполнить измерения и реквизиты записи
        //...
        
        Запись.Сторно = Истина;

    КонецЦикла;
    
КонецПроцедуры

 

Перерасчет

Перерасчет в системе представляет собой отдельную физическую таблицу, в которой хранится информация о записях конкретного регистра расчета, которые необходимо перерассчитать. Автоматическое формирование записей таблицы перерасчета происходит:

1) Выполнение 3-х условий

  • при записи в регистр расчета данных по видам расчета, которые являются ведущими по отношению к другим видам расчета,
  • ведущая запись пересекает базовый период зависимой
  • измененные/добавленные записи регистра должны содержать измерения или реквизиты, которые связаны с измерениями перерасчета.

2) на основании записей регистра расчета, для которых изменился фактический период действия. 

3) в момент записи набора записей регистра расчета, содержащего виды расчета, которые являются вытесняющими по отношению к другим видам расчета.

Записи перерасчета имеют рекомендательный характер, то есть платформа лишь сигнализирует, что определенные записи потеряли актуальность. Алгоритм перерасчета разработчик должен предусмотреть самостоятельно.

У регистра расчета может быть несколько подчиненных объектов Перерасчет.

Объект конфигурации Перерасчет может иметь несколько измерений, каждое из которых устанавливает связь между измерениями данного регистра расчета и влияющих регистров расчета (поле "Данные ведущих регистров"). 

В свойстве "Данные ведущих регистров" перечисляются измерения или реквизиты ведущих регистров, в которых хранится значение, по которому должен быть установлен этот отбор. Если измерение или реквизит какого-либо регистра не будут указаны в этом свойстве, то при вводе записей в этот регистр не будет происходить формирование записей перерасчета для текущего регистра.

Объект Перерасчет создается внутри регистра расчета, но в запросе к нему надо обращаться как к отдельному виду объектов.

Когда по регистру расчетов делается движение, то система смотрит виды расчетов, по которым делаются эти движения, и определяет, являются ли они базовыми для других видов расчета в этом периоде. Если таковые находятся, то в Перерасчет добавляются записи, независимо от того, были ли изменены данные по сумме начислений.

Платформа не отслеживает конкретные изменения, которые пользователь внес в записи, она отслеживает лишь факт изменения набора записей регистра расчета в результате проведения (перепроведения) документа.

В набор записей перерасчета она включает информацию обо ВСЕХ записях регистра, значение ресурсов которых МОЖЕТ измениться в результате перепроведения документа, создавшего базовые записи регистра.

После перепроведения зависимых видов начисления, записи из Перерасчета удаляются.

Удаление записей так же происходит при удалении соответствующих записей в регистре расчета или вручную в процедуре перерасчета.

Ручное формирование записей

В некоторых случаях требуется создать записи в таблице Перерасчета вручную. Это может потребоваться тогда, когда в регистре не используется базовый периода или необходимо отслеживать изменения данных, хранящихся не в регистре расчета, а, например, в регистре накопления.

Запись в таблицу перерасчета происходит с использованием метода СоздатьНаборЗаписей() объекта ПерерасчетМенеджер

Пример:

Перерасчет = РегистрыРасчета.ОсновныеНачисленияРегл.Перерасчеты.ПерерасчетОсновныхНачислений;

...        

        НаборЗаписей = Перерасчет.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.ОбъектПерерасчета.Значение = ВыборкаДокументов.Регистратор;
        
        Выборка = ВыборкаДокументов.Выбрать();
        //Создание записей перерасчета
        Пока Выборка.Следующий() Цикл
            Запись = НаборЗаписей.Добавить();
            Запись.ВидРасчета = Выборка.ВидРасчета;
            Запись.Организация = Выборка.Организация;
            Запись.ФизЛицо = Выборка.ФизЛицо;
        КонецЦикла;    
          //Запись в таблицу без замещения
        НаборЗаписей.Записать(Ложь);

Общий алгоритм выполнения перерасчета:

  1. Анализ необходимости выполнения перерасчета. Выполняется наличием хотя бы одной записи в таблице Перерасчет
  2. Перерасчет записей регистра расчета. Основное отличие перерасчета от первоначального расчета состоит в том, что в процедурах перерасчета происходит расчет только тех записей, которые удовлетворяют заданным условиям. Процедуру перерасчета записей документа рекомендуется помещать в модуле документа начисления как экспортную процедуру.
  3. Удаление записей из таблицы Перерасчета.

 

Виртуальные таблицы

ДанныеГрафика - становиться доступной после заполнения значений поля «График», «Значение графика», «Дата графика». 

Поля:

  • КоличествоЧасовФактическийПериодДействия — содержит рассчитанное на основании данных графика количество фактически отработанных часов
  • КоличествоЧасовПериодДействия — содержит рассчитанное на основании данных графика количество рабочих часов в периоде расчёта

ФактическийПериодДействия - возвращает данные интервалов времени, на которых действовали виды начислений

Поля:

  • ПериодДействияНачало - начало действия интервала
  • ПериодДействияКонец - конец действия интервала

БазаНачисления - возвращает базу для зависимых видов расчета

Поля:

  • База - база для вида расчета

Получение базы при помощи запроса

Для получения базы расчетов при помощи запроса используются виртуальные таблицы регистров расчета, поддерживающих базовый период. У каждого регистра таких таблиц может быть несколько. Их число определяется количеством регистров расчета, использующих планы видов расчета, которые являются базовыми по отношению к плану видов расчета данного регистра. Например, план видов расчета ДополнительныеНачисления зависит по базе от планов видов расчета ОсновныеНачисления и ДополнительныеНачисления. Эти планы видов расчета, в свою очередь, используются в регистрах регламентированного и управленческого учета. Это означает, что любые записи регистра Дополнительные начисления могут зависеть по базовому периоду от записей любого из четырех регистров. В этом случае у регистра Дополнительные начисления будет 4 виртуальные таблицы базовых данных

Имя виртуальной таблицы формируется по следующей схеме:

<ИмяОсновногоРегистра>.База<ИмяБазовогоРегистра>

Таким образом, например, таблица ДополнительныеНачисленияРегл.БазаОсновныеНачисленияРегл позволяет получить записи регистра Основные начисления (регл), входящие в базу расчета записей регистра Дополнительные начисления (регл).

Если необходимо получить базу по нескольким регистрам, нужно будет использовать в запросе несколько виртуальных таблиц базовых данных.

Параметры виртуальных таблиц базовых данных

ИзмеренияОсновногоРегистра – в этот параметр нужно передать массив названий измерений основного регистра, по которым нужно будет отбирать записи в базовых регистрах

ИзмеренияБазовогоРегистра – в этот параметр передается массив названий измерений базового регистра, соответствующие измерениям, переданным в параметр ИзмеренияОсновногоРегистра (названия измерений в разных регистрах могут отличаться). Число элементов этого массива должно совпадать с числом элементов массива измерений основного регистра. Важен также порядок следования измерений: он должен быть таким же, как и в массиве измерений основного регистра.

Если названия измерений одинаковы, в параметры ИзмеренияОсновногоРегистра и ИзмеренияБазовогоРегистра можно передать один и тот же массив. Если названия различаются, нужно будет создать два массива.

По измерениям, указанным в параметре ИзмеренияБазовогоРегистра будет произведен отбор записей в базовом регистре. При этом в качестве значений отбора будут использованы значения соответствующих измерений основного регистра.

Разрезы – в этот параметр передается массив, содержащий названия полей базового регистра, по которым необходимо получить разрез базы. 

Параметр Разрезы можно не указывать, в этом случае база будет получена общей суммой по каждому ресурсу базового регистра. В массиве недопустимо указание измерений, которые переданы в параметр ИзмеренияБазовогоРегистра. 

Если разрезы заданы, то в виртуальной таблице будут присутствовать дополнительные поля по числу элементов массива разрезов по схеме <ИмяПоля>Разрез, например ВидРасчетаРазрез, ПериодРегистрацииРазрез и т.д.

Условие – в этот параметр можно передать произвольное условие на записи основного регистра.

пример запроса:

    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    База.ПериодРегистрацииРазрез КАК ПериодРегистрацииРазрез,
    |    База.ВидРасчетаРазрез,
    |    СУММА(База.РезультатБаза) КАК РезультатБаза
    |ИЗ
    |    РегистрРасчета.ДополнительныеНачисленияРегл.БазаОсновныеНачисленияРегл(
    |        &Измерения,
    |        &Измерения,
    |        &Разрезы,
    |        Регистратор = &Регистратор И НомерСтроки = &НомерСтроки) КАК База
    |
    |СГРУППИРОВАТЬ ПО
    |    База.ПериодРегистрацииРазрез,
    |    База.ВидРасчетаРазрез
    |УПОРЯДОЧИТЬ ПО
    |    База.ПериодРегистрацииРазрез
    |ИТОГИ
    |    СУММА(РезультатБаза)
    |    ПО
    |        ОБЩИЕ,
    |        ПериодРегистрацииРазрез";

    // Сформировать массив измерений основного и базового регистров
    // (названия измерений совпадают, поэтому используется один массив)
    Измерения = Новый Массив(2);
    Измерения[0] = "ФизЛицо";
    Измерения[1] = "Организация";

    // Сформировать массив разрезов
    Разрезы = Новый Массив(2);
    Разрезы[0] = "ПериодРегистрации";
    Разрезы[1] = "ВидРасчета";

    // Передать параметры в запрос
    Запрос.УстановитьПараметр("Измерения", Измерения);
    Запрос.УстановитьПараметр("Разрезы", Разрезы);

    // Запрос строится по конкретной записи документа с номером ВыбранныйНомерСтроки
    Запрос.УстановитьПараметр("Регистратор", СсылкаНаДокумент);
    Запрос.УстановитьПараметр("НомерСтроки", ВыбранныйНомерСтроки);

Не путать поля Результат (ресурс) и РезультатБаза:

  • Результат - ресурс, в который помещается результат начисления по виду расчета
  • РезультатБаза  размер базы, который использовался при вычислении суммы расчета

Проводки в регистре расчетов

Так как расчет не может быть выполнен без временной записи данных в регистр расчета, то предварительная запись в регистр расчета обязательна. Если на форме используется специальная кнопка "Рассчитать", которая не предполагает проведение документа, то после выполнения расчета и вывода результата на форму, записи регистра расчета надо удалить.

Необходимо обратить внимание на порядок расчета видов начисления. Сначала должны быть рассчитаны результаты по базовым видам начислениям, потом уже по зависимым. Это нужно для того, чтобы получить базу для зависимых видов расчета.

Перед тем как рассчитывать записи каждого регистра расчета, в котором документ создает движения, необходимо сформировать и записать в регистр набор всех записей документа по этому регистру. Первоначальная запись движений в регистр расчета необходима для формирования правильного фактического периода действия этих записей. В момент записи сработает механизм вытеснения, и будет сформирован фактический период действия каждой записи.

Принцип формирования проводок (из книги):

  1. формируем записи в регистре расчетов без вычисления ресурсов.
  2. добавляем сторно записи при необходимости.
  3. записываем набор записей в регистре расчетов. параметром "ТолькоЗапись" = Ложь (второй параметр). Это позволит сформировать правильные фактические периоды.
  4. после записи набора мы можем запросом получить данные: ЗначениеПериодДействия (Норма по времени), ЗначениеФактическийПериодДействия (факт по времени) из виртуальной таблицы ДанныеГрафика. 
  5. используя полученные данные вычисляем ресурсы и записываем значения ресурсов в наборы. Необходимо предварительно записать значения ресурсов базовых видов расчета, от которых зависят другие виды расчета. Для получения Базы (база для зависимых видов расчета) используется виртуальная таблица базовых начислений .
  6. записываем набор с параметром "ТолькоЗапись" = Истина. В этом случае происходит только запись набора записей без перерасчета.

Если нужно сделать автоматический перерасчет после проведения документа, то можно поступить следующим образом:

  1. производим полноценное проведение докмуента
  2. получаем запросом записи из объекта Перерасчет с группировкой по виду расчета
  3. для каждого объекта расчета (регистратора) формируем список сотрудников и рассчитываем ресурсы (алгоритм выше)
  4. записываем наборы записейдля каждого регистратора без выполнения перерасчета.
  5. Очищаем наборы записей перерасчета для регистратора

Запрос для получения данных перерасчета

ВЫБРАТЬ
    НачисленияПерерасчет.ОбъектПерерасчета КАК ОбъектПерерасчета, //регистратор
    НачисленияПерерасчет.Сотрудник
ИЗ
    РегистрРасчета.Начисления.Перерасчет КАК НачисленияПерерасчет
ГДЕ
    НачисленияПерерасчет.ВидРасчета = &ТребуемыйВидРасчета
ИТОГИ ПО
    ОбъектПерерасчета

Очистить перерасчет для регистратора:

        НаборЗаписейПерерасчета = РегистрыРасчета.Начисления.Перерасчеты.Перерасчет.СоздатьНаборЗаписей();
        НаборЗаписейПерерасчета.Отбор.ОбъектПерерасчета.Значение = Регистратор;
        НаборЗаписейПерерасчета.Записать();

Объекты встроенного языка для работы с регистрами расчетов

РегистрРасчетаЗапись.<имя>. Используется для доступа к записи регистра расчета. Объект не создается непосредственно, а предоставляется другими объектами, отвечающими за регистр расчета. Например, данный объект представляет записи регистра в наборе записей.

РегистрРасчетаКлючЗаписи.<имя>. Представляет собой набор значений, однозначно идентифицирующих запись регистра. Объект используется в тех случаях, когда необходимо сослаться на определенную запись. Например, он выступает в качестве значения свойства ТекущаяСтрока табличного поля, отображающего список записей регистра.

ПерерасчетыМенеджер.<имя регистра расчета>. Менеджер всех менеджеров перерасчетов регистра расчетов.

ПерерасчетМенеджер.<имя перерасчета>. Менеджер перерасчета служит для получения набора записей перерасчета.

ПерерасчетНаборЗаписей.<имя перерасчета>. Набор записей перерасчета.

ПерерасчетЗапись.<имя перерасчета>. Объект используется для доступа к записи перерасчета.

ФактическийПериодДействия. Массив значений типа ЭлементФактическогоПериодаДействия.

ЭлементФактическогоПериодаДействия. Элемент фактического периода действия.

 

Категория: Регистры | Добавил: leshic (14.02.2022)
Просмотров: 903 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [41]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0