Протяженные во времени расчеты

Курс

Фактический период действия

Фактический период действия отличается от периода действия тем, что период действия отражает тот факт, что запись пытается получить такой период действия. А фактический период — это тот период, который сложился за счет взаимной конкуренции записей.

Рассмотрим более подробно как формируется фактический период действия в регистре расчета.

Для этого разработаем документ Начисление зарплаты со следующим составом реквизитов:

Начисление зарплаты
РеквизитТип
СотрудникСправочникСсылка.Сотрудники
ВидРасчетаПланВидовРасчетаСсылка.ПланВидовРасчета1
РазмерЧисло (15,2)
НачалоДата
КонецДата
СтатьяЗатратСправочникСсылка.СтатьиЗатрат
Начисление зарплаты

При проведении документ будет формировать записи в регистр расчета:

Структура регистра расчета следующая:

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

У регистра расчета есть ресурс Результат и реквизит ИсходныеДанные. Пока в них будет храниться одно и то же значение.

При этом для регистра в настройках включен период действия и выключен базовый период:

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

Проведем начисление зарплаты за август 2021:

начисление зарплаты

После проведения документа будет автоматически рассчитан фактический период действия для обоих сотрудников и он будет равен 01.08.2021 — 31.08.2021.

Напрямую доступа к таблице с фактическим периодом действия нет. Чтобы узнать фактический период можно воспользоваться виртуальной таблицей ФактическийПериодДействия:

ФактическийПериодДействия

Данная таблица имеет все те же самые поля, что и основная таблица. Отличие в том, что в полях ПериодДействияНачало и ПериодДействияКонец будет фактический период действия.

Посмотрим запросом содержимое данной таблицы:

Фактический Период Действия

На данный момент фактический период действия совпадает с периодом действия.

Отправим Иванова в командировку с 5 по 10 августа:

начисление зарплаты

И снова выполним запрос к виртуальной таблице ФактическийПериодДействия:

ФактическийПериодДействия

Фактический период действия оклада Иванова был разбит на два периода:

  • с 01.08.2021 по 04.08.2021
  • с 11.08.2021 по 31.08.2021

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

Вытесняющие виды расчетов

Без этого вытеснение бы не сработало.

Виртуальная таблица ФактическийПериодДействия имеет один параметр Условие, в котором можно наложить условие на любые поля таблицы:

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

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

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

У набора записей есть метод ПолучитьФактическийПериодДействия, который позволяет получить таблицу, аналогичную данным виртуальной таблицы ФактическийПериодДействия еще до записи набора в базу:

Сторнирование

Вытеснение по периоду действия выполняется только в том случае, если период регистрации равен или меньше периоду действия. Если в документе начисления командировки указать период регистрации сентябрь 2021, а период действия август 2021, то вытеснение не сработает:

Начисление зарплаты

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

Для решения данной проблемы используется сторнирование. Сторно-записи вводятся по конкурирующему виду расчета. В данном примере это оклад. Сторно-запись отличается от обычной записи тем, что у нее поле Сторно равно Истина.

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

Данная таблица содержит все те же поля, что и основная таблица, а также три дополнительных поля:

  • Период регистрации сторно
  • Период действия начало сторно
  • Период действия конец сторно

Для примера с командировкой таблица сторно-записей будет содержать одну строку:

Имя колонкиЗначение
РегистраторНачисление ЗП №1
Номер строки1
АктивностьИстина
Период регистрации01.08.2021
Период регистрации сторно01.09.2021
Вид расчетаОклад
СотрудникИванов
Результат20000
Исходные данные20000
Период действия01.08.2021
Период действия начало01.08.2021
Период действия начало сторно05.08.2021
Период действия конец31.08.2021
Период действия конец сторно10.08.2021
Статья затратЗП
СторноЛожь

Код для формирования сторно-записей будет выглядеть следующим образом:

В результате при проведении командировка добавит две записи в регистр расчета вместо одной:

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

А также будет изменен фактический период действия оклада за счет сторно и появится фактический период действия командировки:

ФактическийПериодДействия

Графики

Как правило оклад сотруднику выплачивается пропорционально отработанному времени. Если оклад составляет 20 000 и сотрудник отработал только полмесяца, то и получить он должен 10 000.

В регистрах расчета для этого используются графики. В графике для каждого дня нужно указать рабочий это день или выходной (для рабочего дня указать 1, для выходного 0). Мы уже создавали регистр сведений для хранения графика, но там мы не учли, что графиков может быть несколько. Поэтому добавим в регистр сведений еще одно измерение график с типом СправочникСсылка.ГрафикиРаботы:

График

Также добавим в регистр расчета реквизит ГрафикРаботы с таким же типом:

График

В свойствах реквизита заполним Связь с графиком, выбрав соответствующее измерение регистра сведений:

Связь с графиком

А также добавим у сотрудника реквизит График:

График

И заполним данные графика:

Данные графика

После этого изменим обработку проведения документа Начисление зарплаты. Алгоритм будет следующий:

  1. Формируем записи регистра, но не заполняем ресурс Результат.
  2. Записываем набор записей регистра расчета, передав вторым параметром Ложь. Это значит, что при записи будет выполнен расчет фактического периода действия (по умолчанию данный параметр равен Ложь, поэтому его можно не указывать).
  3. Перебираем записанный набор и для каждой записи получаем данные графика из виртуальной таблицы регистра расчета.
  4. Выполняем расчет ресурса Результат по формуле Результат = ИсходныеДанные * фактически отработанные дни / количество дней по графику.
  5. Записываем набор записей еще раз, но уже без пересчета фактического периода действия.

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

  • ЗначениеПериодДействия
  • ЗначениеФактическийПериодДействия
  • ЗначениеБазовыйПериод (только если для регистра включено использование базового периода)
  • ЗначениеПериодРегистрации

Данные поля содержат суммарное значение графика за определенный период:

  • ЗначениеПериодДействия — за период действия
  • ЗначениеФактическийПериодДействия — за фактический период действия
  • ЗначениеБазовыйПериод — за базовый период
  • ЗначениеПериодРегистрации — за период регистрации
ДанныеГрафика

ДанныеГрафика

У данной таблицы есть один параметр Условие, где можно установить отбор по любым полям таблицы.

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

Начисление зарплаты

И посмотрим записи в регистре расчета:

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

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

Результат = 20 000 * 23 / 23 = 20 000

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

Если сейчас провести командировку по Иванову:

Начисление зарплаты

То изменится фактический период действия оклада Иванова, так как командировка вытеснила его за период с 05.08.2021 по 10.08.2021. Чтобы изменилась сумма оклада нужно перепровести первый документ начисления зарплаты. После этого изменится результат в регистре расчета:

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

Результат = 20 000 * 19 / 23 = 16 521,74

В данном случае 19 — это сумма ресурса регистра сведений за периоды с 01.08.2021 по 04.08.2021 и с 11.08.2021 по 31.08.2021 (фактический период действия).

А 23 — это сумма ресурса регистра сведений за период с 01.08.2021 по 31.08.2021 (период действия).

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


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Комментарии: 1
  1. Яшка

    Отлично

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

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