Если регистр расчета поддерживает период действия то. Свойство базовое измерения регистра расчета. Отсутствие предопределенной табличной части "Базовые виды расчета" у видов расчета Плана видов расчета можно объяснить тем, что
Результаты некоторых начислений и удержаний зависят от результатов, полученных по другим видам расчета. Например, процентная надбавка к заработной плате зависит от суммы основного заработка, начисленного сотруднику. Сумма основной заработной платы в этом случае называется базой для начисления надбавки, а виды расчета, составляющие базу, — базовыми видами расчета.
Расчет базы производится за базовый период, указанный в записи регистра расчета. Базовый период — это период, за который выбираются начисления из регистра расчета для определения базы. Базовый период может составлять менее месяца (например, при расчете надбавки за совмещение профессий, если совмещение длилось менее месяца) или несколько расчетных периодов (например, базовый период квартальной премии составляет 3 месяца).
В базу для расчета начислений включаются все начисления за базовый период, не зависимо от того, в каком расчетном периоде они были начислены. Например, при расчете премии за июль в базу войдет и оплата по окладу за первую половину июля, начисленная в июле, и оплата по окладу за вторую половину июля, зарегистрированная в августе. Такая зависимость от базовых начислений называется зависимостью по периоду действия.
При зависимости по периоду действия база собирается из результатов записей регистра расчета, период действия который попадает в базовый период. Если запись регистра расчета не имеет периода действия, то анализируется период регистрации записи, и, если он попадает в базовый период, результат включается в базу. При такой зависимости может возникнуть ситуация, когда в базовый период попадает только часть периода действия начисления. Например, оплата по окладу рассчитана за целый месяц, а базу для надбавки за совмещение требуется определить только за половину месяца. В этом случае в базу для надбавки войдет только часть оплаты по окладу за то количество дней или часов по графику работника, которое приходится на базовый период.
База для расчета удержаний, например, по исполнительным листам, формируется по-другому. В базу включаются все начисления, зарегистрированные в текущем месяце, не зависимо оттого, за какой период они начислены. Такая зависимость называется зависимостью по периоду регистрации.
Рис. Зависимость от базы
Рис. Частичное пересечение базового периода и периода действия
При зависимости по периоду регистрации в базу включаются результаты только тех записей регистров расчета, период регистрации которых попадает в базовый период.
Зависимость между результатами начислений и удержаний может быть многоуровневой и достаточно сложной. Большинство надбавок, таких, как надбавка за выслугу лет, за классность, за расширение зон обслуживания устанавливаются в процентном отношении от основной оплаты, начисленной работнику за отработанное время. На сумму основной оплаты с учетом надбавок начисляются премии, предусмотренные системой оплаты труда. Премии, в свою очередь, входя, в базу для расчета северной надбавки, а база последней также включает основную оплату и другие надбавки работника. Если после выполнения всех расчетов в силу каких-либо причин результат одного из начислений изменяется, то должны быть персрассчитаны и все зависимые от него начисления.
Например, если после расчета обнаружено, что работнику присвоена неверная тарифная ставка и результат оплаты по окладу необходимо рассчитать заново, то последовательно должны быть перерассчитаны и все надбавки, зависимые от оплаты по окладу, а также премии и северная надбавка. Задача непростая, особенно, если учесть что в обшем случае все эти начисления могут быть зарегистрированы в информационной базе несколькими документами. Программа позволяет автоматически отслеживать такие ситуации и определять список документов, которые требуется перерассчитать. Для использования механизма у каждого зависимого вида расчета необходимо указать список ведущих видов расчета.
Ведущие — это такие виды расчета, при изменении результатов которых, требуется персрассчитать результат данного вида расчета.
Понятия базовых и ведущих видов расчета очень близки по смыслу, и чаще всего списки базовых и ведущих видов расчета совпадают, но не следует их пугать.
Базовые — это виды расчета, которые непосредственно влияют на результат данного вида расчета. Ведущие виды расчета могут и не входить в базу, но оказывать косвенное влияние на результат, т.е. список ведущих видов расчета может быть шире по сравнению со списком базовых видов расчета.
Несовпадение списков базовых и ведущих видов расчета мы увидим, когда будем рассматривать настройку расчета среднего заработка. База по премиям, учитываемым при расчете среднего заработка, собирается отдельно от основного заработка работника. Для автоматического получения базы по премиям в плане видов расчета Средний заработок имеются специальные виды расчета Премии, учитываемые в составе среднего заработка, базовыми для которых являются виды расчета премий. Сумма премии может рассчитываться процентом от других начислений (оплаты по тарифным ставкам, надбавок к заработной плате и др.), которые, хотя и не входят в базу для вида расчета Премии, учитываемые в составе среднего заработка, но оказывают влияние на его результат, поэтому включаются в список ведущих видов расчега.
Списки базовых и ведущих видов расчета настраиваются в форме зависимого вида расчета.
При настройке ведущих видов расчета необходимо так же, как и при настройке вытесняющих видов расчета, соблюдать правило: если вид расчета А является ведущим для вида расчета В, который в свою очередь является ведущим для вида расчета С, то в список ведущих для вида расчета С должны быть включены как вид расчета В, так и вид расчета А. В противном случае программа выдаст сообщение об ошибке: «Неполный список ведущих видов расчета!». Например, если в список ведущих начислений внесена Квартальная премия, то должны быть внесены и все ведущие начисления для квартальной премии, такие как Оклад по дням Оклад по часам и т.д.
Рис. Настройка базовых и ведущих видов расчета
регистр сведений , который будет содержать график , используемый при расчете. В нашем случае это регистр РабочиеДниПоГрафику . В поле Значение графика выберем РабочийДень - именно в этом ресурсе регистра сведений будет храниться 1, если день является рабочим. В поле Дата графика выберем измерение регистра Дата .Установим флаг Базовый период .
Зададим в группе параметров Периодичность параметр Месяц .
Перейдем на вкладку Данные . Зададим здесь следующие параметры, рис. 1.11 :
Рис.
1.11.
Измерение Сотрудник - тип СправочникСсылка.Сотрудники , флаг Базовое установлен. Будем хранить в этом измерении сотрудника, по которому ведется расчет.
Ресурс Результат - тип Число , длина 10, точность 2. Именно этот ресурс будет содержать вычисленное значение вида расчета , заданного для сотрудника. Результат будет содержать значение в рублях, именно это определило параметры типа данных, использованного для него.
Реквизит ИсходныеДанные - тип число, длина 10, точность 2. В этот реквизит мы будем записывать исходные данные для расчета. Например, для вида расчета Оклад мы запишем сюда исходный размер оклада, для вида расчета Премия - процент , который должен браться от расчетной базы, для вида расчета Удержание - размер удержания в рублях.
Реквизит График - тип СправочникСсылка.ГрафикиРаботы . В этом реквизите будем хранить график , который соответствует сотруднику, для которого мы начисляем заработную плату. В свойстве этого реквизита Связь с графиком установим измерение График регистра сведений Графики работы . Именно благодаря этой настройке мы сможем использовать различные графики работы для разных сотрудников (пятидневка, шестидневка) и при расчете получать правильное количество рабочих дней по каждому графику.
Прежде чем продолжать настройку параметров регистра расчета , нам понадобится создать документ, который будет создавать движения по регистру расчета .
1.6. Документ Начисление зарплаты
Создадим новый документ, дадим ему имя НачислениеЗарплаты . Этот документ должен иметь следующую функциональность:
- Возможность ручного ввода начислений;
- Формирование движений по регистру расчета ;
Перейдем на вкладку Данные окна настройки свойств документа НачислениеЗарплаты , рис. 1.12 . Создадим реквизит документа ПериодРегистрации - тип Дата , состав даты - Дата .
Рис. 1.12.
Создадим табличную часть НачисленияИУдержания . Создадим в ней следующие реквизиты:
Теперь перейдем на вкладку Движения . Запретим оперативное проведение документа , добавим в состав регистров, по которым документ формирует движения, регистр НачисленияИУдержания .
Нажмем на кнопку Конструктор движений . Откроется окно конструктора, рис. 1.13 .
Рис. 1.13.
При заполнении полей, задающих правила формирования движений мы заполним их следующим образом:
БазовыйПериодНачало и БазовыйПериодКонец в конструкторе мы заполнять не будем. Эти поля нужны нам для вида расчета Премия , поэтому мы заполним их в коде процедуры обработки проведения для данного вида расчета .
Нажмем на кнопку ОК в окне конструктора движений и посмотрим, какой код он сформировал:
Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Для Каждого ТекСтрокаНачисленияИУдержания Из НачисленияИУдержания Цикл // регистр НачисленияИУдержания Движение = Движения.НачисленияИУдержания.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаНачисленияИУдержания.ВидРасчета; Движение.ПериодДействияНачало = ТекСтрокаНачисленияИУдержания.ДатаНачала; Движение.ПериодДействияКонец = ТекСтрокаНачисленияИУдержания.ДатаОкончания; Движение.ПериодРегистрации = ПериодРегистрации; Движение.Сотрудник = ТекСтрокаНачисленияИУдержания.Сотрудник; Движение.ИсходныеДанные = ТекСтрокаНачисленияИУдержания.ИсходныеДанные; Движение.График = ТекСтрокаНачисленияИУдержания.График; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры
Очевидно, что для каждой строки табличной части создается новый элемент коллекции документа Движения.НачисленияИУдержания , после чего заполняются свойства нового элемента.
Модифицируем этот код таким образом, чтобы задать параметры базового периода для вида начисления Премия . Для этого будем проверять вид расчета , присутствующий в обрабатываемой строке, если это - Премия - задаем параметры базового периода . Поместим в цикл обработки строк табличной части такой код:
Если ТекСтрокаНачисленияИУдержания.ВидРасчета= ПланыВидовРасчета.Основной.Премия Тогда Движение.БазовыйПериодНачало=НачалоМесяца(ПериодРегистрации); Движение.БазовыйПериодКонец=КонецМесяца(ПериодРегистрации); КонецЕсли;
Теперь немного изменим ту часть кода, которая задает начало и конец периода действия начисления. В нашем случае лишь один вид начисления нужно "оснастить" периодом действия , который в явном виде будет задавать пользователь . Это - Прогул . У всех остальных период действия будет равняться одному месяцу - начало периода будет совпадать с началом месяца, за который производится начисление заработной платы, конец периода действия будет совпадать с концом месяца. Поэтому мы, для того, чтобы избавить пользователя документа НачислениеЗарплаты от ввода ненужных значений, добавим в наш модуль следующий код, поместив его в цикл обработки строк табличной части:
Если Движение.ВидРасчета=ПланыВидовРасчета.Основной.Прогул Тогда Движение.ПериодДействияНачало = ТекСтрокаНачисленияИУдержания.ДатаНачала; Движение.ПериодДействияКонец = ТекСтрокаНачисленияИУдержания.ДатаОкончания; Иначе Движение.ПериодДействияНачало = НачалоМесяца(ПериодРегистрации); Движение.ПериодДействияКонец = КонецМесяца(ПериодРегистрации); КонецЕсли;
Этот код заменит строки
Движение.ПериодДействияНачало = ТекСтрокаНачисленияИУдержания.ДатаНачала; Движение.ПериодДействияКонец = ТекСтрокаНачисленияИУдержания.ДатаОкончания;
После всех этих действий документ при проведении будет добавлять в регистр расчета данные для расчета. Проверим это. Запустим нашу конфигурацию в режиме 1С:Предприятие, создадим новый документ Начисление зарплаты , заполним его данными и проверим, как эти данные отразились в регистре расчета после проведения документа .
Прежде чем создавать реальный документ по начислению зарплаты, нужно ввести в справочник Графики работы хотя бы пару графиков и заполнить для них регистр Рабочие дни по графику . Заполним этот регистр вручную, например, для пары графиков за один месяц.
На рис. 1.14 вы можете видеть документ, который мы заполнили, и движения в регистре расчета , которые он произвел после проведения, после отработки кода, который мы написали выше.
Если все перенесено верно, а в нашем случае это именно так, мы можем приступать к реализации процедуры расчета. Сделаем это в том же модуле, в котором осуществляется формирование движений.
Сразу хотелось бы отметить, что в существующих конфигурациях обычно применяются несколько другие методы реализации расчетных процедур. В частности, для них характерна следующая последовательность действий. После того, как документ сформировал движения по регистру, происходит запись данных в регистр , после чего управление передается в расчетную процедуру общего модуля с установленным свойством Сервер , что актуально в том случае, если система работает в клиент-серверном режиме. В процедуре, с помощью запроса к таблицам регистра расчета , получают записанные данные и проводят манипуляции с ними. Все эти действия, в итоге, приводят к повышению быстродействия прикладных решений , которые могут использоваться в различных режимах, работать с большими объемами данных. Сущность действия такая же, как в нашем примере, но реализация отличается. Главная цель нашего учебного примера - показать принципы, по которым осуществляется решение расчетных задач, поэтому здесь мы концентрируемся именно на основных принципах, не обращая внимание на оптимальность кода или его быстродействие .
Добавим в процедуру проведения документа команду записи сформированных движений:
Движения.НачисленияИУдержания.Записать();
Эта команда должна следовать за командой закрытия цикла формирования движений.
Добавим в код блок расчета удержания. В соответствии с логикой заданных ранее видов расчета , здесь мы лишь копируем ИсходныеДанные для Удержания в Результат .
Для Каждого Движение из Движения.НачисленияИУдержания Цикл Если Движение.ВидРасчета=ПланыВидовРасчета.Основной.Удержание Тогда Движение.Результат=Движение.ИсходныеДанные; КонецЕсли; КонецЦикла; Движения.НачисленияИУдержания.Записать();
Теперь займемся расчетом оклада.
Для Каждого Движение из Движения.НачисленияИУдержания Цикл Если Движение.ВидРасчета=ПланыВидовРасчета.Основной.Оклад Тогда План = Движение.ПолучитьДанныеГрафика(ВидПериодаРегистраРасчета.ПериодДействия); Факт= Движение.ПолучитьДанныеГрафика(ВидПериодаРегистраРасчета.ФактическийПериодДействия); Движение.Результат= Движение.ИсходныеДанные*Факт.РабочийДень/План.РабочийДень; КонецЕсли; КонецЦикла; Движения.НачисленияИУдержания.Записать();
Метод ПолучитьДанныеГрафика записи регистра расчета возвращает данные графика в виде таблицы значений, причем, этот метод вызывается с параметром типа ВидПериодаРегистраРасчета . Если вызвать его с видом периода ПериодДействия - будут возвращены данные по графику, отражающие, в нашем случае, полное количество рабочих дней. Вызов метода с видом периода ФактическийПериодДействия возвращает данные с учетом вытесняющих видов расчета .
Запись вида Факт позволяет обратиться к строке таблицы значений. А записью Факт.РабочийДень (напомним, РабочийДень - это имя ресурса регистра сведений , который используется как график ) мы "вытаскиваем" нужные данные. В нашем случае - количество рабочих дней, отработанных по факту.
В итоге, получив нужные данные, мы проводим следующие манипуляции: делим фактическое количество отработанных дней на плановое и умножаем на размер оклада.
И, наконец, последним этапом нашей расчетной задачи является расчет премии. Его мы реализуем с помощью следующего кода:
Ресурсы=Новый Массив(1); Ресурсы="НачисленияИУдержания.Результат"; Измерения =Новый Структура ("Сотрудник", "НачисленияИУдержания.Сотрудник"); Для Каждого Движение из Движения.НачисленияИУдержания Цикл Если Движение.ВидРасчета=ПланыВидовРасчета.Основной.Премия Тогда ДанныеБазы=Движение.ПолучитьБазу(Ресурсы, Измерения); Движение.Результат=Движение.ИсходныеДанные*ДанныеБазы.Результат/100; КонецЕсли; КонецЦикла; Движения.НачисленияИУдержания.Записать();
Для начала мы подготовим параметры для передачи в метод ПолучитьБазу . Это будет массив Ресурсы , который в нашем случае содержит имя ресурса базового регистра расчета в формате "ИмяРегистра.ИмяРесурса" . Так же мы готовим структуру Измерения . В структуру мы добавляем новый элемент, имя которого совпадает с именем измерения регистра расчета ("Сотрудник" ), а значение содержит список измерений (в формате "ИмяРегистра.ИмяИзмерения" ), в нашем случае это одно измерение. Эти данные будут использованы при получении расчетной базы при расчете премии.
В цикле мы записываем в переменную ДанныеБазы результаты выполнения метода ПолучитьБазу для текущей записи регистра расчета (то есть - для вида расчета Премия ). Метод ПолучитьБазу возвращает таблицу значений, строки которой хранят запрошенные при вызове метода данные.
Вспомним, как называется ресурс регистра расчета , в котором хранятся результаты вычислений - это ресурс Результат . Именно по такому имени мы можем обратиться к строке таблицы значений (в нашем случае это одна строка с индексом 0) и получить расчетную базу.
После того, как расчетная база получена, мы рассчитываем размер премии. Так как при заполнении документа подразумевается, что мы вводим процентное значение премии в виде количества процентов (10, 40 и т.д.), то для того, чтобы узнать размер премии, мы должны введенный процентный размер премии разделить на 100 и уже после этого умножать на полученную расчетную базу.
После того, как все вышеперечисленные действия выполнены, мы можем испытать наше решение на практике. Если все выполнено верно - в
В данной статье рассмотрим теоретические основы работы с регистрами расчёта, а также выполним расчёт заработной платы сотрудника пропорционально количеству отработанных часов.
Теория
Регистр расчета(РР) - объект метаданных конфигурации, служащий для реализации периодических расчетов в системе 1С. Из очевидных областей применения регистров расчета можно выделить следующие: расчет заработной платы, расчет квартплаты, расчет арендной платы.
По своей структуре регистры расчета похожи на регистры накопления или регистры сведений. Они так же как и регистры накопления имеют измерения, ресурсы, реквизиты, но принцип действия регистров расчета абсолютно другой.
По сути своей измерения в регистре накопления служат «фильтром » в разрезе которого мы получаем данные из регистра накопления. Как пример, когда мы берём «остатки» по регистру накопления «Остатки товаров» в разрезе определённой номенклатуры или «срез последних» по регистру сведений «Оклады сотрудников» в разрезе определённого сотрудника. В отличии от регистра накопления измерения в периодическом регистре расчета служат для реализации ««(это когда протяженные во времени виды расчета конкурируют между собой на интервале периода действия записи т.е. как пример, вид расчета командировка вытесняет вид расчета оклад по периоду действия) и ««(это когда вид расчета премия зависит от вида расчета оклад за прошлые периоды).
механизма вытеснения по периоду действия «:
Здесь мы видим что вид расчёта «Командировка» обладает протяжённостью во времени и действует с 10 по 20 апреля, «Командировка» указана как вытесняющий вид расчёта для вида расчета «Оклад». «Оклад» также обладает протяжённостью во времени и действует с 1 по 30 апреля. Так как «Командировка» указана как вытесняющий вид расчёта для вида расчета «Оклад»(имеет больший приоритет, чем оклад) и действует на периоде действия оклада, то происходит вытеснение оклада командировкой и формируется «Фактический период действия оклада».»Фактический период действия оклада» это период действия оклада после вытеснения командировкой, в нашем случае он состоит из 2 периодов — с 1 по 9 апреля и с 21 по 30 апреля и в сумме составляет 19 дней. Механизм вытеснения по периоду действия работает только для протяжённых во времени расчетов.
На рисунке выше графически показан принцип «механизма зависимости по базовому периоду «:
Допустим, в конце апреля 2017 мы хотим начислить сотруднику премию в размере 10% от оклада. В качестве базовых видов расчёта для премии указан оклад.
Но в качестве «базы» для расчета премии мы возьмём не весь месяц апрель, а только интервал с 10 по 20 апреля(11 дней). Рассчитаем базу для премии, оклад сотрудника составляет 60000 рублей, в месяце имеем 30 дней, дневной оклад = 60000/30 = 2000 руб. Далее 2000*11 = 22000 руб. База для расчета премии составляет 22000 рублей.
Рассчитаем премию: (22000/100)*10 = 2200 руб. Премия в размере 10% от оклада составляет 2200 рублей.
С регистром расчета тесно связан прикладной объект метаданных «План видов расчета».
План видов расчета(ПВР) - объект метаданных конфигурации, хранящий в себе сведения о типах видов расчетов и определяющий влияние разных расчетов друг на друга.
Один план видов расчета может использоваться в нескольких регистрах расчета, но один регистр расчета не может использовать несколько планов видов расчета одновременно.
Регистр расчета является таблицей в которой хранятся рассчитанные данные, а в плане видов расчета хранятся алгоритмы расчета этих данных. Регистр расчета обязательно должен иметь хотя бы один документ регистратор, который делает движения по регистру расчета(например Начисление зарплаты).
Механизмы расчета в системе 1С Предприятие устроены таким образом, что сперва требуется сделать записи в регистр расчета и только после этого выполнить расчет на основе этих данных. К примеру, нельзя рассчитать премию на основе оклада пока этот самый оклад не записан в регистр расчета.
Практика
Рассмотрим подробнее регистры расчета на практике:
Шаг 1 .Начнём с плана видов расчета. План видов расчета необходимо создать перед созданием регистра расчета. План видов расчета создаём перед регистром расчёта потому, что перед созданием таблицы для хранения рассчитанных данных(т.е. регистра расчета) необходимо задать алгоритмы расчета этих данных(т.е. план видов расчета).
Создадим план видов расчета «Основные начисления». Сразу же перейдём на вкладку «Расчет». Здесь мы сразу же видим флаг «Использует период действия «, при установке данного флага все виды расчета входящие в данный план будут обладать протяжённостью во времени (например Оклад, Командировка), а также для данного плана видов расчета включается «механизма вытеснения по периоду действия «. Если флаг «Использует период действия» не установлен, то виды расчета не будут обладать протяжённостью во времени(например Премия, Штраф) и «механизма вытеснения по периоду действия» действовать не будет. Также на данной вкладке есть разделы «Зависимость от базы» и «Базовые планы видов расчета» — они служат для реализации «механизма зависимости по базовому периоду «, но об нём поговорим позже. Пока оставим «Зависимость от базы» в режиме «Не зависит».
Создадим предопределённый вид расчета «Оклад». На вкладке «Основное» всё просто. Задаём имя и код вида расчета.
Благодаря тому, что мы установили флаг «Использует период действия » у нас появилась вкладка «Вытесняющие » и включился «механизм вытеснения по периоду действия «.
На данной вкладке мы указываем виды расчета, которые будут вытеснять оклад по периоду действия(например Командировка).
Примечание : в «Вытесняющие» можно добавить виды расчета принадлежащие только данному плану видов расчета.
Также есть вкладка «Ведущие » — на ней указываются виды расчета при изменении которых должен пересчитываться текущий вид расчёта. Здесь можно указать и виды расчёта из других планов видов расчёта. Например, вид расчета «Оклад» является ведущим для вида расчёта «Премия» т.е. при изменении оклада у нас должна пересчитаться и премия т.к. премия начисляется в зависимости от оклада. В данном случае вид расчёта «Оклад» принадлежит ПВР «Основные начисления» использующем период действия, а вид расчета «Премия» принадлежит ПВР «Дополнительные начисления» не использующем период действия.
Шаг 2 .Создадим справочник «Графики» со структурой по-умолчанию. В справочнике «Графики» будем хранить режимы работы сотрудников(пятидневка, шестидневка и.т.д.).
Шаг 3 .Также нам нужен объект в котором мы будем хранить Производственный календарь(рабочие и выходные дни). Для этих целей используем непериодический независимый регистр сведений.
Создадим непериодический независимый регистр сведений «Графики работы» с 2 измерениями «Дата» и «График» и ресурсом «Количество часов».
Благодаря регистру сведений «Графики работы» мы сможем начислять заработную плату от оклада пропорционально количеству отработанных дней.
Шаг 4 .Создадим документ «Начисление зарплаты» со структурой реквизитов показанной ниже:
Реквизиты:
Оперативное проведение ставим в значение «Запретить» т.к. оно не имеет смысла для механизма периодических расчётов в 1С — ни премию, ни оклад, ни штраф мы никогда не начисляем в реальном времени.
Создадим форму документа с настройками по-умолчанию.
Шаг 5 . Наконец-то мы дошли и до создания регистров расчета.
Объект метаданных регистр расчета расположен в ветке «Регистры расчета» конфигуратора.
Создадим регистр расчета «Основные начисления». Настройки регистра расчета рассмотрим ниже:
1.В поле «План видов расчета» указываем ПВР «Основные начисления» созданный на шаге 1.
2.Ставим флаг «Период действия» в значение «Истина» т.к. ПВР, указанный на шаге 1 обладает протяжённостью во времени.
После установки данного флага у нас сразу же становятся доступны стандартные реквизиты «ПериодДействия», «ПериодДействияНачало», «ПериодДействияКонец» это значит, что виды расчета регистрируемые в данном регистре расчета также обладают протяжённостью во времени и у нас становится доступен «механизма вытеснения по периоду действия «.
P.S. Если указать ПВР, обладающий протяжённостью во времени у РР с флагом «Период действия» в значении «Ложь», то данный ПВР будет работать как ПВР не обладающий протяжённостью во времени.
3.После установки флага «Период действия» в значение «Истина» у нас становятся доступны поля «График», «Значение графика», «Дата графика».
В поле «График» указываем регистр сведений «Графики работы», созданный на шаге 3.
В поле «Значение графика» указываем ресурс «КоличествоЧасов» регистра сведений «Графики работы».
В поле «Дата графика» указываем измерение «Дата» регистра сведений «Графики работы».
4.В поле «Периодичность» указываем значение «Месяц» это значит, что данные в регистр у нас будут заноситься ежемесячно.
Ниже представлена структура метаданных регистра:
Флаг «Базовое» у измерения влияет только на производительность, его можно и не проставлять, но если поставить, то поле «Сотрудник» будет проиндексировано.
Измерение «Сотрудник» — оно применяется в «механизме вытеснения по периоду действия » и «механизме зависимости по базовому периоду «.
Ресурс «Сумма» — туда запишется рассчитанная зарплата.
Реквизит «График» указан как реквизит, а не измерение регистра т.к. ни его, ни он ничего не вытесняет — по сути справочное поле. Важно!!! Не забудьте заполнить поле «Связь с графиком» у реквизита «График», там должно быть указано измерение «График» регистра сведений «Графики работы» иначе размер заработной платы не будет рассчитываться.
Реквизит «Параметр» будет хранить значение оклада.
Вот теперь когда мы указали связь с РС «Графики работы» у нас будет рассчитываться заработная плата сотрудника пропорционально количеству отработанных дней.
В качестве регистратора указываем документ «Начисление зарплаты «, созданный на шаге 4.
Шаг 6 . Делаем движения по регистру расчета «Основные начисления».
Вернёмся к документу «Начисление зарплаты» созданному на шаге 4.
Опишем обработку проведения в модуле объекта документа:
Фрагмент кода обработки проведения документа
1С (Код)
Процедура ОбработкаПроведения(Отказ, РежимПроведения) // регистр ОсновныеНачисления Движения.ОсновныеНачисления.Записывать = Истина; Движения.ОсновныеНачисления.Очистить(); ПериодРегистрации=НачалоМесяца(Дата); Для Каждого ТекСтрокаОсновныеНачисления Из ОсновныеНачисления Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодДействияНачало = ТекСтрокаОсновныеНачисления.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(ТекСтрокаОсновныеНачисления.ДатаОкончания); Движение.ПериодРегистрации = ПериодРегистрации; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.График = ТекСтрокаОсновныеНачисления.График; Движение.Параметр = ТекСтрокаОсновныеНачисления.Размер; КонецЦикла; КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения) // регистр ОсновныеНачисления Движения. ОсновныеНачисления. Записывать= Истина; Движения. ОсновныеНачисления. Очистить() ; ПериодРегистрации=НачалоМесяца(Дата) ; Для Каждого ТекСтрокаОсновныеНачисленияИз ОсновныеНачисленияЦикл Движение= Движения. ОсновныеНачисления. Добавить() ; Движение. Сторно= Ложь; Движение. ВидРасчета= ТекСтрокаОсновныеНачисления. ВидРасчета; Движение. ПериодДействияНачало= ТекСтрокаОсновныеНачисления. ДатаНачала; Движение. ПериодДействияКонец= КонецДня(ТекСтрокаОсновныеНачисления. ДатаОкончания) ; Движение. ПериодРегистрации = ПериодРегистрации; Движение. Сотрудник= ТекСтрокаОсновныеНачисления. Сотрудник; Движение. График= ТекСтрокаОсновныеНачисления. График; Движение. Параметр= ТекСтрокаОсновныеНачисления. Размер; КонецЦикла; КонецПроцедуры |
Создадим тестовый документ и проведём его:
Перейдём в «Движения документа»:
Видим, что период регистрации установился как начало месяца т.к. периодичность РР указана «Месяц». Так же видим, что заполнились все поля кроме суммы(ЗП ещё не рассчитана).
Шаг 7 .Напишем код расчета заработной платы.
Создадим общий модуль «Расчет» со следующими флагами:
В данном общем модуле у нас и будет происходить сам расчёт.
Напишем в модуле «Расчет» экспортную функцию «Рассчитать начисления»:
Так как мы заполнили в настройках РР «Основные начисления» поля «График», «Значение графика», «Дата графика» у нас стала доступна виртуальная таблица регистра расчета ДанныеГрафика, в запросе к виртуальной таблице нас интересуют поля:
«КоличествоЧасовФактическийПериодДействия» — содержит рассчитанное на основании данных графика количество фактически отработанных часов
«КоличествоЧасовПериодДействия» — содержит рассчитанное на основании данных графика количество рабочих часов в периоде расчёта
Процедура расчета заработной платы
1С (Код)
Процедура РассчитатьНачисления(Регистратор, НаборЗаписей) Экспорт //Оклад Запрос=Новый Запрос; Запрос.Текст="ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.КоличествоЧасовФактическийПериодДействия, 0) КАК ЧасовФакт, | ОсновныеНачисленияДанныеГрафика.Параметр, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.КоличествоЧасовПериодДействия, 0) КАК ЧасовПлан, | ОсновныеНачисленияДанныеГрафика.НомерСтроки |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(| Регистратор = &Регистратор | И ВидРасчета = &ВидРасчетаОклад) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Регистратор", Регистратор); // передаём документ регистратор чтобы поиск выполнялся только по текущему документу Запрос.УстановитьПараметр("ВидРасчетаОклад", ПланыВидовРасчета.ОсновныеНачисления.Оклад); //устанавливаем вид расчёта оклад т.к. рассчитываем оклад Выборка=Запрос.Выполнить().Выбрать(); СтруктураПоиска=Новый Структура; СтруктураПоиска.Вставить("НомерСтроки",0); //создадим структуру для поиска данных для расчёта по номеру строки Для Каждого Запись Из НаборЗаписей Цикл //цикл по набору записей текущего документа СтруктураПоиска.НомерСтроки=Запись.НомерСтроки; //заполняем номер строки для поиска Если Выборка.НайтиСледующий(СтруктураПоиска) Тогда //ищем в выборке данные для расчёта по текущему номеру строки Запись.Сумма =?(Выборка.ЧасовПлан=0,0, Выборка.ЧасовФакт/Выборка.ЧасовПлан * Выборка.Параметр); //рассчитываем ЗП пропорционально отработанным дням, в Параметр - текущий оклад КонецЕсли; Выборка.Сбросить(); //сбросим выборку, нужно чтобы следующая запись набора записей делала поиск по выборке сначала КонецЦикла; НаборЗаписей.Записать(,Истина); //записываем рассчитанные записи в базу, передаём параметр Замещать = Истина КонецПроцедуры
//Оклад Запрос=Новый Запрос; Запрос. Текст="ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.КоличествоЧасовФактическийПериодДействия, 0) КАК ЧасовФакт, | ОсновныеНачисленияДанныеГрафика.Параметр, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.КоличествоЧасовПериодДействия, 0) КАК ЧасовПлан, | ОсновныеНачисленияДанныеГрафика.НомерСтроки |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Регистратор |
Условие задачи
Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно. Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам.
За проведение занятий по основному месту работы сотрудники учебного предприятия получают оплату по часовому тарифу. Сумма начисления по тарифу рассчитывается как тарифная ставка, умноженная на количество фактически отработанных часов. Первоначальное значение тарифной ставки может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода
Сотрудники могут проводить выездные обучения. В этом случае начисление по тарифу за период выездного обучения не происходит, а начисления
сотрудника складываются из двух частей:
Некоторой фиксированной суммы, компенсирующей его транспортные расходы;
Начисления непосредственно за обучение в виде вознаграждения, рассчитываемого как общая сумма оплат, произведенных слушателями в текущем расчетном периоде, умноженная на определенный процент. Значение процента может быть задано в документе «Начисление зарплаты.
В декабре, по итогам года, сотрудникам предприятия может быть начислена премия процентом от суммы всех начислений, произведенных за прошедший год. Процент премии один для всех сотрудников предприятия. Значение процента определяется в момент занесения информации о начислении в информационную базу.
Механизм перерасчетов в рамках данной задачи использовать не надо.
Ввод всех начислений происходит документом «Начисление зарплаты». Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя.
Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида:
Отчет может быть построен за любой расчетный период. Для анализа сделанных начислений за обучение слушателей на выезде в конфигурации необходимо предусмотреть отчет следующего вида:
Отчет может быть построен за любой расчетный период.
Решение
1. Решение расчетной задачи начнем с определения того, какие виды начислений и удержаний необходимо создать в конфигурации и по каким формулам должен быть получен результат каждого вида расчета. Согласно заданию нам будет необходимо создать четыре вида расчета:
· Начисление за обучение слушателей по основному месту работы Результат = ТарифнаяСтавка * КоличествоОтработанныхЧасов;
Обратите внимание, для годовой премии сразу указан способ расчета общей суммы всех начислений, сделанных за прошедший год - «Получение базы».
2. На следующем этапе для вышеперечисленных видов расчета укажем зависимости между ними.
Таблица №5.1. Настройка зависимостей по вытеснению и по базе между видами расчетов, необходимых для решения задачи
Вид расчета | Вытесняющий | Базовый |
ТРФ | КМД | - |
ТРН | - | - |
КМД | - | - |
ПРМ | - | ТРФ, ТРН, КМД |
3. Создадим вышеперечисленные виды расчетов в конфигурации. Настроим раздел «Расчет» для каждого используемого плана расчетов;
4. Создадим регистры расчетов;
5. Внесем необходимые изменения в структуру документа «Начисление зарплаты»;
6. Перейдем к проведению документа «Начисление зарплаты»:
a. Добавим в регистр необходимое количество записей:
i. Определим границы интервалов всех существующих периодов у каждой записи;
ii. Укажем значения измерений и реквизитов регистра;
b. Проведем расчет записей сформированных наборов для первичных видов расчета:
i. Если введены транспортные расходы - результат начисления
определим сразу, по данным документа;
ii. Расчет по тарифу на основном месте работы
1. Используя механизм запросов, по каждой записи с указанным видом расчета получим данные по отработанному времени и актуальную тарифную ставку;
2. Организуем цикл по записям набора. Для каждой записи реализуем прямое позиционирование на нужную строку в выборке запроса. Рассчитаем результат начисления;
3. Запишем набор, без пересчета фактического периода действия;
iii. Расчет начисления за выезд
1. Создадим оборотный регистр накопления «Оплаты
слушателей»;
2. Внесем изменения в алгоритм проведения документа «Приход денег», при выполнении которого должен заполняться данный регистр;
3. Используя механизм запросов, по каждому сотруднику, работавшего на выезде и указанного в документе, получим данные по оплатам слушателей;
4. Организуем цикл по записям набора. Для каждой записи реализуем прямое позиционирование на нужную строку в выборке запроса. Рассчитаем результат начисления;
5. Запишем набор, без пересчета фактического периода действия;
d. Повторим действия, описанные в п.4 для записей вторичных видов расчета каждого уровня:
i. Расчет годовой премии
1. Создадим константу для хранения процента премии. Включим режим использования основной формы констант по умолчанию;
2. Используя механизм запросов, по каждой записи с указанным видом расчета получим данные по базе;
3. Организуем цикл по записям набора. Для каждой записи реализуем прямое позиционирование на нужную строку в выборке запроса. Рассчитаем результат начисления;
4. Запишем набор;
e. Перенесем программный код, связанный с расчетом, в общий модуль;
7. Построим требуемые в задании отчеты по данным регистров расчета, используя механизм компоновки данных.
Управляемые формы
Условие задачи
В формы всех документов, использующихся в задании, необходимо добавить возможность просмотра движений в регистрах, связанных с тем документом, чья форма открыта на данный момент времени.
В форме выбора сотрудника, вызываемой из формы документа «Начисление зарплаты», список выбираемых сотрудников должен быть дополнен информацией об их тарифных ставках. При выборе сотрудника, информация о соответствующей ставке должна попадать в колонку «Размер». Для документа «Начисление зарплаты» необходимо создать основную форму списка, в которой для текущего документа должны быть отражены записи, сделанные им в регистрах расчета.
Решение
1. Создадим основные формы документов. Откроем каждую форму в окне редактораформы. На закладке «Командный интерфейс» раскроем ветвь «Панель навигации - Перейти». Установим флажки «Видимость» для регистров.
2. Создадим не основную форму выбора справочника «Физические лица»;
a. Внесем необходимые изменения в структуру регистра «Сведения о сотрудниках»;
b. Создадим новую форму;
c. Откроем палитру свойств основного реквизита формы;
d. В разделе «Объект» установим флаг «Произвольный запрос»;
e. Откроем настройку списка;
f. Внесем необходимые изменения в текст запроса;
g. При создании формы на сервере определим значения внешних параметров запроса;
h. Определим собственную обработку выбора значения из формы справочника;
3. Организуем вызов формы справочника из формы документа
a. Создадим основную форму документа «Начисление зарплаты»;
b. Укажем созданную форму справочника в качестве значения свойства «Форма выбора» элемента формы документа «ОсновныеНачисленияСотрудник »;
Планы видов расчета - это прикладные объекты конфигурации . Они используются в механизме сложных периодических расчетов и служат для описания видов расчета и их взаимного влияния друг на друга.
Структура
План видов расчета представляет собой список видов расчета. Каждый вид расчета имеет код, наименование и набор реквизитов , содержащих дополнительную информацию о данном виде расчета:
Например, план видов расчета Основные начисления организаций может выглядеть следующим образом:
Создание и редактирование видов расчета может выполняться как разработчиком (предопределенные виды расчета), так и пользователем, в процессе работы с прикладным решением. Однако пользователь не может удалять виды расчета, созданные разработчиком.
Виды расчета, созданные в плане видов расчета, могут влиять друг на друга. Система поддерживает два вида такого влияния: зависимость по базовому периоду и вытеснение по периоду действия .
Для каждого вида расчета можно указать перечень видов расчета, от которых он будет зависеть по базовому периоду, и которые будут вытеснять его по периоду действия.
Например, вид расчета Алименты может зависеть по базовому периоду от таких видов расчета, как Оклад , ТарифДневной , ДоплатаПерсональная и т.д. А вид расчета Оклад может вытесняться видом расчета Невыход :
Кроме этих зависимостей, для вида расчета могут быть указаны так называемые ведущие виды расчета, - те, от которых он не зависит напрямую, но которые могут оказывать на него влияние через другие виды расчетов.
Формы плана видов расчета
Для того чтобы пользователь мог просматривать и изменять данные, содержащиеся в плане видов расчета, система поддерживает несколько форм его представления. Система может автоматически генерировать все нужные формы; наряду с этим разработчик имеет возможность создать собственные формы, которые система будет использовать вместо форм по умолчанию:
Форма списка
Для просмотра видов расчета используется форма списка. Она позволяет выполнять навигацию по списку, добавлять, помечать на удаление и удалять виды расчетов. Форма списка позволяет выполнять сортировку и отбор отображаемой информации по нескольким критериям:
![Bookmark and Share](http://s7.addthis.com/static/btn/v2/lg-share-en.gif)