Цель лекции: освоить основные механизмы 1С:Предприятие 8.2., используемые при решении расчетных задач
Подсистемы, связанные с расчетом заработной платы, в конфигурациях, разработанных на 1С:Предприятие 8, проектируются с использованием специализированных объектов, в центре которых стоят
Мы, в нашей учебной конфигурации, разработаем подсистему учета заработной платы, основанную на регистрах расчета и планах
Работа нашей подсистемы, если описать ее схематично, будет выглядеть следующим образом.
Когда приходит время начислять заработную плату, используется документ НачислениеЗарплаты, который заполняется вручную. В реально используемых "зарплатных" конфигурациях подобный документ обычно заполняется автоматически, на основе списков начислений и удержаний, закрепленных за сотрудниками. Обычно после автоматического заполнения пользователь имеет возможность отредактировать набор начислений и удержаний, отраженных в документе, а так же – их параметров.
После заполнения документа данные из него переносятся в
После переноса сведений в регистры расчета производится расчет начислений. Расчет производится разными способами для разных начислений, причем, начисления характеризуются не только способом, но и очередностью расчета. Например, если Премия зависит от Оклада и от Надбавки, а Надбавка, в свою очередь, зависит от Оклада, то для правильного расчета Премии необходимо сначала рассчитать Оклад, потом – Надбавку, и уже потом – Премию.
Нужно учитывать и тот факт, что возможна ситуация, когда начисления предыдущих периодов нужно откорректировать. Если говорить о реальных конфигурациях, то суммы, начисленные в предыдущих периодах, обычно не правят (с них уже начислены налоги, произведены отчисления в фонды и т.д.), вместо этого используются так называемые сторно-записи (для учета отрицательных отклонений, например, если сотруднику неправильно начислили заработную плату, необоснованно увеличив ее). В случае, если работнику начислили меньше, чем положено, начисление в текущем периоде может быть увеличено.
Кроме того, нужно предусмотреть ситуацию в текущем периоде, когда изменение одних
В реально используемых конфигурациях, ориентированных на расчет зарплаты, расчетные механизмы дополняются большим набором вспомогательных объектов. Так, помимо начисления заработной платы нужно рассчитывать налоги и взносы, нужно вести учет взаиморасчетов с работниками, фиксировать в системе выплату заработной платы различными способами (наличными, путем банковского перечисления) с формированием всей необходимой документации. Кроме того, в подобных конфигурациях ведется учет сотрудников, плановые начисления и удержания вводятся с помощью специальных документов.
Наша подсистема расчета заработной платы будет включать в себя следующие объекты:
Справочники
Перечисления
Документы:
Регистры сведений:
Обработки
Отчеты
Перерасчеты
Начнем работу над зарплатной подсистемой нашей конфигурации, создав некоторые вспомогательные объекты
Создадим справочник ). Мы будем применять этот справочник для хранения наименований графиков работы, которые будут назначаться сотрудникам при приеме на работу. Включим справочник ГрафикиРаботы в состав подсистемы РасчетЗаработнойПлаты. Не будем модифицировать другие свойства графика.
(рис 4.1) Справочник Графики работы
Справочник Графики работы будет использоваться совместно с регистром сведений Рабочие дни по графику. Регистр будет содержать сведения о том, какие именно дни являются рабочими при работе по данному графику.
Создадим регистр сведений .
(рис 4.2) Регистр сведений РабочиеДниПоГрафику
Создадим следующие измерения и ресурсы (рис 4.3):
Измерение График, тип – СправочникСсылка.ГрафикиРаботы, установим галочку Ведущее в окне свойств измерения. Установка этого свойства позволяет подчинить запись регистра объекту, который записывается в данное измерение.
Измерение Дата, тип – Дата, состав даты – Дата;
Создадим ресурс РабочийДень, тип – Число, длина – 1, точность 0. Флаг Неотрицательное установлен. Этот ресурс будем устанавливать в 1 для рабочего дня и в 0 для выходного дня.
(рис 4.3) Регистр сведений РабочиеДниПоГрафику, состав данных
Создадим обработку добавим ее в состав подсистемы РасчетЗаработнойПлаты.
(рис 4.4) Обработка ЗаполнениеГрафиков
Создадим форму обработки. Добавим в состав ее реквизитов следующие:
Период, Тип: СтандартныйПериод
График, Тип: СправочникСсылка.ГрафикиРаботы
Добавим семь логических реквизитов (тип данных – Булево) с именами Пн, Вт, Ср, Чт, Пт, Сб, Вс.
Добавим команду с именем .
(рис 4.5) Форма обработки ЗаполнениеГрафиков
Заполнение выбранного графика с учетом указания рабочих дней можно реализовать с помощью следующего кода
НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
Предупреждение("График заполнен");
КонецПроцедуры
НаСервере
Процедура ЗаполнитьНаСервере()
СекундВСутках=60*60*24;
МассивРабочихДней=Новый Массив(7);
МассивРабочихДней[0]=Пн;
МассивРабочихДней[1]=Вт;
МассивРабочихДней[2]=Ср;
МассивРабочихДней[3]=Чт;
МассивРабочихДней[4]=Пт;
МассивРабочихДней[5]=Сб;
МассивРабочихДней[6]=Вс;
КоличествоДней = (НачалоДня(Период.ДатаОкончания)
- НачалоДня(Период.ДатаНачала)) / СекундВСутках;
Для НомерДня=0 По КоличествоДней Цикл
ТекущаяДата=Период.ДатаНачала+СекундВСутках*НомерДня;
Запись=РегистрыСведений.РабочиеДниПоГрафику.СоздатьМенеджерЗаписи();
Запись.График=График;
Запись.Дата=ТекущаяДата;
Запись.РабочийДень=?(МассивРабочихДней[ДеньНедели(ТекущаяДата)-1],1,0);
Запись.Записать();
КонецЦикла;
КонецПроцедуры
Процедура команды – это клиентская процедура, а нам нужно работать на сервере, так как мы собираемся выполнять операции с регистром сведений, а именно – создавать его элементы.
Мы вызываем из клиентской процедуры Заполнить() процедуру ЗаполнитьНаСервере().
В серверной процедуре мы сначала записываем в переменную СекундВСутках количество секунд в сутках – это значение пригодится нам в дальнейших вычислениях – при работе со значениями, представляющими собой дату, приходится оперировать именно секундами.
Далее, мы создаем новый массив, который называем МассивРабочихДней – этот массив будет содержать значения, установленные в логических реквизитах, размещенных на форме, то есть – либо значение Ложь, либо – значение Истина. В массиве семь элементов, по числу дней недели, нумерация элементов начинается с нуля.
Мы, в переменную КоличествоРабочихДней вносим количество дней, за которое нужно заполнить график. Получаем мы его, вычитая значение свойства ДатаНачала из значения ДатаОкончания – эти стандартные свойства получило поле Период, когда мы установили его тип как СтандартныйПериод. Полученное значение будет выражено в секундах, поэтому мы делим его на ранее найденное количество секунд в сутках.
Цикл Для оперирует счетчиком цикла НомерДня, который начинается с 0, что будет представлять дату начала и изменяется с шагом 1 до ранее найденного количества дней.
В цикле мы находим текущую дату, прибавляя к начальной дате произведение номера дня и количества секунд в сутках, после чего создаем новый менеджер записи для регистра сведений РабочиеДниПоГрафику, заполняем данные записи регистра.
При заполнении ресурса Рабочий день мы используем следующую конструкцию:
Запись.РабочийДень=?(МассивРабочихДней[ДеньНедели(ТекущаяДата)-1],1,0);
В ней мы сначала получаем значение массива МассивРабочихДней, индекс которого соответствует номеру дня в неделе. Метод ДеньНедели, вызванный для некоторой даты, возвращает номер дня в неделе для этой даты. Для понедельника он возвратит 1, для вторника – 2 и так далее. Наш массив имеет нумерацию, начинающуюся с 0, поэтому мы, получив номер дня в неделе, вычитаем из него 1, таким образом оказывается, что если ДеньНедели возвратит 1, что соответствует понедельнику, мы вычтем из этого числа 1, получим 0 и сможем получить значение, хранящееся в элементе массива с индексом 0, то есть – узнать, рабочий ли день в понедельник был выставлен при заполнении пользователем реквизитов формы.
Когда мы получили значение, хранящееся в массиве, мы, если оно истинно (то есть – день рабочий), устанавливаем его в 1, иначе – в 0.
Полученная нами обработка универсальна – она позволяет заполнять графики для любых сочетаний рабочих и нерабочих дней в неделе. На рис 4.6 показан результат заполнения графика Пятидневка с помощью обработки.
(рис 4.6) Результат заполнения графика с помощью обработки ЗаполнениеГрафиков
Создадим новое перечисление. Назовем его МетодыРасчета, включим в состав подсистемы РасчетЗаработнойПлаты, введем следующие предопределенные элементы:
Создадим еще одно перечисление. Назовем его КатегорииРасчета, включим в состав подсистемы РасчетЗаработнойПлаты, зададим следующие предопределенные элементы
На рис 4.7 вы можете видеть созданные перечисления
(рис 4.7) Перечисления МетодыРасчета и КатегорииРасчета
Мы собираемся реализовать в нашей конфигурации следующие виды расчета, таблица 4.1:
| Начисление / удержание | Способ расчета | Особенности расчета |
|---|---|---|
| Оклад | Рассчитывается пропорционально отработанным дням | Если сотрудник, которому назначен этот вид начисления, отработал все дни, предусмотренные соответствующим графиком, ему начисляется полный размер оклада. Если нет – оклад уменьшается пропорционально неотработанным дням. |
| Оклад по дням | Рассчитывается за каждый отработанный день | При расчете указывается ставка за день и период, оплата осуществляется за каждый отработанный день |
| Доплата | Процентом от расчетной базы | При расчете задается процент, который берется от оклада |
| Премия суммой | Фиксированная сумма | При расчете задается только сумма, которая будет выплачена сотруднику |
| Премия | Процентом от расчетной базы | При расчете задается процент, который берется от оклада, который начислен за текущий месяц, и от доплаты за текущий месяц |
| Удержание | Фиксированная сумма | Задается фиксированная сумма, которая будет удержана с сотрудника |
| Прогул | Нулевая сумма | Если у сотрудника был прогул, этот факт фиксируется вводом информации о прогуле. При расчете заработной платы оклад не платится за те дни, в которые у сотрудника был прогул. |
| Отпуск | По среднедневному заработку | Рассчитывается по количеству дней отпуска, умноженному на среднедневной заработок, полученный от оклада и от оклада по дням |
Для задания их в системе создадим два
Включим
МетодРасчета: Тип: ПеречисленияСсылка.МетодыРасчета
КатегорияРасчета: Тип: ПеречисленияСсылка.КатегорииРасчета
ВлияетНаОтработанноеВремя: Тип: Булево
(рис 4.8) Реквизиты плана видов расчета ОсновныеНачисления
Перейдем на закладку Расчет
Установим флаг Использует период действия
Параметр Зависимость от базы установим в значение Зависит по периоду регистрации.
В состав
(рис 4.9) Настройка расчетных параметров плана видов расчета ОсновныеНачисления
Создадим
МетодРасчета: Тип: ПеречисленияСсылка.МетодыРасчета
КатегорияРасчета: Тип: ПеречисленияСсылка.КатегорииРасчета
На закладке .
(рис 4.10) Настройка расчетных параметров плана видов расчета ДополнительныеНачисления
Запустим конфигурацию в пользовательском режиме, перейдем в
| Наименование и код | Метод расчета, категория расчета, влияние на отработанное время | |||
|---|---|---|---|---|
| Базовые | Ведущие | Вытесняющие | ||
| Оклад
000000001 | Метод расчета: По отработанному времени
Категория расчета: Первичное Влияет на отработанное время: Установлено | Прогул
Отпуск | ||
| Оклад по дням
000000002 | Метод расчета: По дням
Категория расчета: Первичное Влияет на отработанное время: Установлено | Прогул
Отпуск | ||
| Прогул
000000003 | Метод расчета: Фиксированная сумма
Категория расчета: Первичное Влияет на отработанное время: Не установлено | |||
| Отпуск
000000004 | Метод расчета: По среднему
Категория расчета: Зависимое первого уровня Влияет на отработанное время: Не установлено | Оклад
Оклад по дням | Оклад
Оклад по дням | |
Перейдем в
| Наименование, код | Метод расчета, категория расчета | ||
|---|---|---|---|
| Базовые | Ведущие | ||
| Доплата
000000001 | Метод расчета: Процентом
Категория расчета: Зависимое первого уровня | Оклад | Оклад |
| Премия суммой
000000002 | Метод расчета: Фиксированная сумма
Категория расчета: Первичное | ||
| Премия
000000003 | Метод расчета: Процентом
Категория расчета: Зависимое второго уровня | Оклад
Доплата | Оклад
Доплата |
| Удержание
000000004 | Метод расчета: Фиксированная сумма
Категория расчета: Первичное | ||
Обратите внимание на то, что в плане
На рис 4.11. вы можете видеть форму вида расчета Оклад, в которой открыта закладка Вытесняющие виды расчетов.
(рис 4.11) Настройка вида расчета Оклад
На рис 4.12 вы можете видеть форму вида расчета Премия с открытой вкладкой Базовые виды расчета.
(рис 4.12) Настройка вида расчета Премия
Перейдем в ), выполним следующие настройки
Имя: ОсновныеНачисления
План видов расчета: ОсновныеНачисления
Период действия: установлено
График: РабочиеДниПоГрафику
Значение графика: РабочийДень
Дата графика: Дата
Базовый период: установлено
Периодичность: Месяц
Включим
(рис 4.13) Регистр расчета ОсновныеНачисления, закладка Основные
Благодаря настройкам закладки Основные, мы настроили общие свойства
Перейдем на закладку ).
Создадим измерение Сотрудник, Тип: СправочникСсылка.Сотрудники, Запрет незаполненных значений – установлено. Благодаря этому измерению мы сможем учитывать начисления и удержания в разрезе сотрудников.
Создадим следующие ресурсы:
Сумма, Тип: Число, Длина 10, точность 2.
Здесь мы будем хранить результат расчета, полученный из исходных данных с использованием алгоритма расчета, используемого для конкретного начисления.
ДнейОтработано, Тип: Число, Длина 2, точность 0
Здесь мы будем, в том случае, если начисление увеличивает количество отработанных дней, хранить это количество.
Создадим следующие реквизиты:
ИсходныеДанные, Тип: Число, длина 10, точность 2
В этом реквизите мы будем хранить исходные данные для расчета вида начисления (суммы, процентные показатели).
График: Тип: СправочникСсылка.ГрафикиРаботы, Связь с графиком – График (измерение регистра сведений)
Здесь мы будем хранить ссылку на график, используемый с начислением в том случае, если это имеет смысл.
(рис 4.14) Регистр расчета ОсновныеНачисления, закладка Данные
Создадим еще один
(рис 4.15) Регистр расчета ДополнительныеНачисления, закладка Основные
Имя: ДополнительныеНачисления
Периодичность: месяц
Этот
Включим регистр в состав подсистемы РасчетЗаработнойПлаты.
Перейдем на закладку окна редактирования объекта ).
(рис 4.16) Регистр расчета ДополнительныеНачисления, закладка Данные
Создадим измерение:
Имя: Сотрудник, Тип: СправочникСсылка.Сотрудники
Создадим ресурс:
Имя: Сумма, Тип: Число, длина 10, точность 2
Создадим реквизит:
Имя: ИсходныеДанные, Тип: Число, длина 10, точность 2
Создадим общий модуль, назовем его РасчетЗарплаты, включим в его свойствах параметр Привилегированный – это позволит, в том случае, если расчет зарплаты выполняется пользователем, права которого ограничены, при обращении к данным, доступа к которым пользователь не имеет, обойти ограничения пользователя.
Создадим в общем модуле процедуру следующего вида:
Процедура РассчитатьЗарплату(Регистратор) Экспорт КонецПроцедуры
Мы будем вызывать эту процедуру из процедуры обработки проведения документа. Мы будем передавать в процедуру параметр Регистратор – ссылку на документ, который сформировал движения в регистре. Отобрав записи регистра по переданному регистратору, в дальнейшем мы реализуем расчет записей.
Теперь займемся документом, который будет использоваться для начисления заработной платы.
Создадим новый документ, назовем его НачислениеЗарплаты, укажем, что он входит в подсистему РасчетЗаработнойПлаты, укажем, что он проводится по
На закладке Данные добавим табличную часть ОсновныеНачисления. Добавим в нее следующие реквизиты:
Сотрудник: Тип: СправочникСсылка.Сотрудники
ВидРасчета: Тип: ПланВидовРасчетаСсылка.ОсновныеНачисления
ИсходныеДанные: Тип: Число, длина 10, точность 2
График: Тип: СправочникСсылка.ГрафикиРаботы
ДатаНачалаПериодаДействия: Тип: Дата, состав даты – Дата
ДатаОкончанияПериодаДействия: Тип: Дата, состав даты – Дата
ДатаНачалаБазовогоПериода: Тип: Дата, состав даты – Дата
ДатаОкончанияБазовогоПериода: Тип: Дата, состав даты – Дата
Добавим табличную часть ДополнительныеНачисления, создадим в ней следующие реквизиты:
Сотрудник: Тип: СправочникСсылка.Сотрудники
ВидРасчета: Тип: ПланВидовРасчетаСсылка.ДополнительныеНачисления
ИсходныеДанные: Тип: Число, длина 10, точность 2
ДатаНачалаБазовогоПериода: Тип: Дата, состав даты – Дата
ДатаОкончанияБазовогоПериода: Тип: Дата, состав даты – Дата
Создадим форму документа, согласившись с параметрами, предложенными по умолчанию (рис 4.17).
(рис 4.17) Форма документа НачислениеЗарплаты
Сформируем, используя конструктор движений документа, процедуру проведения. Мы модифицировали процедуру проведения документа, в частности, добавили команды для формирования, при необходимости, сторно-записей, после формирования движений дали команду их записи, и, далее, вызвали процедуру из общего модуля для расчета заработной платы с указанием ссылки на документ в качестве параметра.
Процедура обработки проведения нашего документа содержит такой код:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// регистр ОсновныеНачисления
Движения.ОсновныеНачисления.Записывать = Истина;
Для Каждого ТекСтрокаОсновныеНачисления Из ОсновныеНачисления Цикл
Движение = Движения.ОсновныеНачисления.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета;
Движение.ПериодДействияНачало
= ТекСтрокаОсновныеНачисления.ДатаНачалаПериодаДействия;
Движение.ПериодДействияКонец
= ТекСтрокаОсновныеНачисления.ДатаОкончанияПериодаДействия;
Движение.ПериодРегистрации = Дата;
Движение.БазовыйПериодНачало
= ТекСтрокаОсновныеНачисления.ДатаНачалаБазовогоПериода;
Движение.БазовыйПериодКонец
= ТекСтрокаОсновныеНачисления.ДатаОкончанияБазовогоПериода;
Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник;
Движение.ИсходныеДанные = ТекСтрокаОсновныеНачисления.ИсходныеДанные;
Движение.График = ТекСтрокаОсновныеНачисления.График;
КонецЦикла;
// регистр ДополнительныеНачисления
Движения.ДополнительныеНачисления.Записывать = Истина;
Для Каждого ТекСтрокаДополнительныеНачисления Из ДополнительныеНачисления Цикл
Движение = Движения.ДополнительныеНачисления.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ТекСтрокаДополнительныеНачисления.ВидРасчета;
Движение.ПериодРегистрации = Дата;
Движение.БазовыйПериодНачало
= ТекСтрокаДополнительныеНачисления.ДатаНачалаБазовогоПериода;
Движение.БазовыйПериодКонец
= ТекСтрокаДополнительныеНачисления.ДатаОкончанияБазовогоПериода;
Движение.Сотрудник = ТекСтрокаДополнительныеНачисления.Сотрудник;
Движение.ИсходныеДанные = ТекСтрокаДополнительныеНачисления.ИсходныеДанные;
КонецЦикла;
// Сторно-записи
Дополнения=Движения.ОсновныеНачисления.ПолучитьДополнение();
Для Каждого Дополнение из Дополнения Цикл
Движение=Движения.ОсновныеНачисления.Добавить();
Движение.Сторно=Истина;
Движение.Сотрудник=Дополнение.Сотрудник;
Движение.ВидРасчета=Дополнение.ВидРасчета;
Движение.БазовыйПериодНачало=Дополнение.БазовыйПериодНачало;
Движение.БазовыйПериодКонец=Дополнение.БазовыйПериодКонец;
Движение.График=Дополнение.График;
Движение.ИсходныеДанные=Дополнение.ИсходныеДанные;
Движение.ПериодРегистрации=Дополнение.ПериодРегистрацииСторно;
Движение.ПериодДействияНачало=Дополнение.ПериодДействияНачалоСторно;
Движение.ПериодДействияКонец=Дополнение.ПериодДействияКонецСторно;
КонецЦикла;
Движения.Записать();
РасчетЗарплаты.РассчитатьЗарплату(Ссылка);
КонецПроцедуры
Формирование движений по
Обратите внимание на команду:
Дополнения=Движения.ОсновныеНачисления.ПолучитьДополнение();
Метод набора записей ПолучитьДополнение() позволяет получить дополнительные данные, с помощью которых можно выполнить сторнирование записей предыдущих периодов при вводе в текущем периоде записей, влияющих на записи предыдущих периодов.
Например, в октябре 2011 года сотруднику был задан Оклад, а в ноябре 2011 выяснилось, что часть оклада начислена неправомерно – лишь в ноябре стало известно, что несколько дней в предыдущем месяце сотрудник прогулял. В ноябре ему вводится Прогул, в котором указаны пропущенные дни – Прогул является Оклада. За эти дни ему не должен начисляться оклад, но записи предыдущего месяца менять нельзя, например, с них уже начислены налоги. При вводе данных о прогуле система, на основе механизма вытеснения, может "предложить" сформировать сторно-запись, которая отразит в текущем периоде данные (вычет, в конечном счете), которые приведут, в итоге, к правильным взаиморасчетам организации и сотрудника. Например, если в предыдущем периоде ему было переплачено 1500 рублей, то, в соответствии с идеологией сторнирования, в текущем периоде у него вычтут те же 1500 рублей, не затрагивая, при этом, записи, сформированные в предыдущем периоде.
После того, как записи, и, при необходимости, сторно-записи сформированы, записываем их и вызываем процедуру РассчитатьЗарплату() из общего модуля РасчетЗарплаты.
Расчетом записей мы займемся в следующей лекции.
В этой лекции мы рассмотрели создание основных объектов, на которых базируется подсистема расчета заработной платы. Это –
Наша следующая лекция продолжает тему решения расчетных задач.
Для данной лекции подготовлен видеоурок.
Цель лекции: освоить основные механизмы 1С:Предприятие 8.2., используемые при решении расчетных задач
Подсистемы, связанные с расчетом заработной платы, в конфигурациях, разработанных на 1С:Предприятие 8, проектируются с использованием специализированных объектов, в центре которых стоят
Мы, в нашей учебной конфигурации, разработаем подсистему учета заработной платы, основанную на регистрах расчета и планах
Работа нашей подсистемы, если описать ее схематично, будет выглядеть следующим образом.
Когда приходит время начислять заработную плату, используется документ НачислениеЗарплаты, который заполняется вручную. В реально используемых "зарплатных" конфигурациях подобный документ обычно заполняется автоматически, на основе списков начислений и удержаний, закрепленных за сотрудниками. Обычно после автоматического заполнения пользователь имеет возможность отредактировать набор начислений и удержаний, отраженных в документе, а так же – их параметров.
После заполнения документа данные из него переносятся в
После переноса сведений в регистры расчета производится расчет начислений. Расчет производится разными способами для разных начислений, причем, начисления характеризуются не только способом, но и очередностью расчета. Например, если Премия зависит от Оклада и от Надбавки, а Надбавка, в свою очередь, зависит от Оклада, то для правильного расчета Премии необходимо сначала рассчитать Оклад, потом – Надбавку, и уже потом – Премию.
Нужно учитывать и тот факт, что возможна ситуация, когда начисления предыдущих периодов нужно откорректировать. Если говорить о реальных конфигурациях, то суммы, начисленные в предыдущих периодах, обычно не правят (с них уже начислены налоги, произведены отчисления в фонды и т.д.), вместо этого используются так называемые сторно-записи (для учета отрицательных отклонений, например, если сотруднику неправильно начислили заработную плату, необоснованно увеличив ее). В случае, если работнику начислили меньше, чем положено, начисление в текущем периоде может быть увеличено.
Кроме того, нужно предусмотреть ситуацию в текущем периоде, когда изменение одних
В реально используемых конфигурациях, ориентированных на расчет зарплаты, расчетные механизмы дополняются большим набором вспомогательных объектов. Так, помимо начисления заработной платы нужно рассчитывать налоги и взносы, нужно вести учет взаиморасчетов с работниками, фиксировать в системе выплату заработной платы различными способами (наличными, путем банковского перечисления) с формированием всей необходимой документации. Кроме того, в подобных конфигурациях ведется учет сотрудников, плановые начисления и удержания вводятся с помощью специальных документов.
Наша подсистема расчета заработной платы будет включать в себя следующие объекты:
Справочники
Перечисления
Документы:
Регистры сведений:
Обработки
Отчеты
Перерасчеты
Начнем работу над зарплатной подсистемой нашей конфигурации, создав некоторые вспомогательные объекты
Создадим справочник ). Мы будем применять этот справочник для хранения наименований графиков работы, которые будут назначаться сотрудникам при приеме на работу. Включим справочник ГрафикиРаботы в состав подсистемы РасчетЗаработнойПлаты. Не будем модифицировать другие свойства графика.
(рис 4.1) Справочник Графики работы
Справочник Графики работы будет использоваться совместно с регистром сведений Рабочие дни по графику. Регистр будет содержать сведения о том, какие именно дни являются рабочими при работе по данному графику.
Создадим регистр сведений .
(рис 4.2) Регистр сведений РабочиеДниПоГрафику
Создадим следующие измерения и ресурсы (рис 4.3):
Измерение График, тип – СправочникСсылка.ГрафикиРаботы, установим галочку Ведущее в окне свойств измерения. Установка этого свойства позволяет подчинить запись регистра объекту, который записывается в данное измерение.
Измерение Дата, тип – Дата, состав даты – Дата;
Создадим ресурс РабочийДень, тип – Число, длина – 1, точность 0. Флаг Неотрицательное установлен. Этот ресурс будем устанавливать в 1 для рабочего дня и в 0 для выходного дня.
(рис 4.3) Регистр сведений РабочиеДниПоГрафику, состав данных
Создадим обработку добавим ее в состав подсистемы РасчетЗаработнойПлаты.
(рис 4.4) Обработка ЗаполнениеГрафиков
Создадим форму обработки. Добавим в состав ее реквизитов следующие:
Период, Тип: СтандартныйПериод
График, Тип: СправочникСсылка.ГрафикиРаботы
Добавим семь логических реквизитов (тип данных – Булево) с именами Пн, Вт, Ср, Чт, Пт, Сб, Вс.
Добавим команду с именем .
(рис 4.5) Форма обработки ЗаполнениеГрафиков
Заполнение выбранного графика с учетом указания рабочих дней можно реализовать с помощью следующего кода
НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
Предупреждение("График заполнен");
КонецПроцедуры
НаСервере
Процедура ЗаполнитьНаСервере()
СекундВСутках=60*60*24;
МассивРабочихДней=Новый Массив(7);
МассивРабочихДней[0]=Пн;
МассивРабочихДней[1]=Вт;
МассивРабочихДней[2]=Ср;
МассивРабочихДней[3]=Чт;
МассивРабочихДней[4]=Пт;
МассивРабочихДней[5]=Сб;
МассивРабочихДней[6]=Вс;
КоличествоДней = (НачалоДня(Период.ДатаОкончания)
- НачалоДня(Период.ДатаНачала)) / СекундВСутках;
Для НомерДня=0 По КоличествоДней Цикл
ТекущаяДата=Период.ДатаНачала+СекундВСутках*НомерДня;
Запись=РегистрыСведений.РабочиеДниПоГрафику.СоздатьМенеджерЗаписи();
Запись.График=График;
Запись.Дата=ТекущаяДата;
Запись.РабочийДень=?(МассивРабочихДней[ДеньНедели(ТекущаяДата)-1],1,0);
Запись.Записать();
КонецЦикла;
КонецПроцедуры
Процедура команды – это клиентская процедура, а нам нужно работать на сервере, так как мы собираемся выполнять операции с регистром сведений, а именно – создавать его элементы.
Мы вызываем из клиентской процедуры Заполнить() процедуру ЗаполнитьНаСервере().
В серверной процедуре мы сначала записываем в переменную СекундВСутках количество секунд в сутках – это значение пригодится нам в дальнейших вычислениях – при работе со значениями, представляющими собой дату, приходится оперировать именно секундами.
Далее, мы создаем новый массив, который называем МассивРабочихДней – этот массив будет содержать значения, установленные в логических реквизитах, размещенных на форме, то есть – либо значение Ложь, либо – значение Истина. В массиве семь элементов, по числу дней недели, нумерация элементов начинается с нуля.
Мы, в переменную КоличествоРабочихДней вносим количество дней, за которое нужно заполнить график. Получаем мы его, вычитая значение свойства ДатаНачала из значения ДатаОкончания – эти стандартные свойства получило поле Период, когда мы установили его тип как СтандартныйПериод. Полученное значение будет выражено в секундах, поэтому мы делим его на ранее найденное количество секунд в сутках.
Цикл Для оперирует счетчиком цикла НомерДня, который начинается с 0, что будет представлять дату начала и изменяется с шагом 1 до ранее найденного количества дней.
В цикле мы находим текущую дату, прибавляя к начальной дате произведение номера дня и количества секунд в сутках, после чего создаем новый менеджер записи для регистра сведений РабочиеДниПоГрафику, заполняем данные записи регистра.
При заполнении ресурса Рабочий день мы используем следующую конструкцию:
Запись.РабочийДень=?(МассивРабочихДней[ДеньНедели(ТекущаяДата)-1],1,0);
В ней мы сначала получаем значение массива МассивРабочихДней, индекс которого соответствует номеру дня в неделе. Метод ДеньНедели, вызванный для некоторой даты, возвращает номер дня в неделе для этой даты. Для понедельника он возвратит 1, для вторника – 2 и так далее. Наш массив имеет нумерацию, начинающуюся с 0, поэтому мы, получив номер дня в неделе, вычитаем из него 1, таким образом оказывается, что если ДеньНедели возвратит 1, что соответствует понедельнику, мы вычтем из этого числа 1, получим 0 и сможем получить значение, хранящееся в элементе массива с индексом 0, то есть – узнать, рабочий ли день в понедельник был выставлен при заполнении пользователем реквизитов формы.
Когда мы получили значение, хранящееся в массиве, мы, если оно истинно (то есть – день рабочий), устанавливаем его в 1, иначе – в 0.
Полученная нами обработка универсальна – она позволяет заполнять графики для любых сочетаний рабочих и нерабочих дней в неделе. На рис 4.6 показан результат заполнения графика Пятидневка с помощью обработки.
(рис 4.6) Результат заполнения графика с помощью обработки ЗаполнениеГрафиков
Создадим новое перечисление. Назовем его МетодыРасчета, включим в состав подсистемы РасчетЗаработнойПлаты, введем следующие предопределенные элементы:
Создадим еще одно перечисление. Назовем его КатегорииРасчета, включим в состав подсистемы РасчетЗаработнойПлаты, зададим следующие предопределенные элементы
На рис 4.7 вы можете видеть созданные перечисления
(рис 4.7) Перечисления МетодыРасчета и КатегорииРасчета
Мы собираемся реализовать в нашей конфигурации следующие виды расчета, таблица 4.1:
| Начисление / удержание | Способ расчета | Особенности расчета |
|---|---|---|
| Оклад | Рассчитывается пропорционально отработанным дням | Если сотрудник, которому назначен этот вид начисления, отработал все дни, предусмотренные соответствующим графиком, ему начисляется полный размер оклада. Если нет – оклад уменьшается пропорционально неотработанным дням. |
| Оклад по дням | Рассчитывается за каждый отработанный день | При расчете указывается ставка за день и период, оплата осуществляется за каждый отработанный день |
| Доплата | Процентом от расчетной базы | При расчете задается процент, который берется от оклада |
| Премия суммой | Фиксированная сумма | При расчете задается только сумма, которая будет выплачена сотруднику |
| Премия | Процентом от расчетной базы | При расчете задается процент, который берется от оклада, который начислен за текущий месяц, и от доплаты за текущий месяц |
| Удержание | Фиксированная сумма | Задается фиксированная сумма, которая будет удержана с сотрудника |
| Прогул | Нулевая сумма | Если у сотрудника был прогул, этот факт фиксируется вводом информации о прогуле. При расчете заработной платы оклад не платится за те дни, в которые у сотрудника был прогул. |
| Отпуск | По среднедневному заработку | Рассчитывается по количеству дней отпуска, умноженному на среднедневной заработок, полученный от оклада и от оклада по дням |
Для задания их в системе создадим два
Включим
МетодРасчета: Тип: ПеречисленияСсылка.МетодыРасчета
КатегорияРасчета: Тип: ПеречисленияСсылка.КатегорииРасчета
ВлияетНаОтработанноеВремя: Тип: Булево
(рис 4.8) Реквизиты плана видов расчета ОсновныеНачисления
Перейдем на закладку Расчет
Установим флаг Использует период действия
Параметр Зависимость от базы установим в значение Зависит по периоду регистрации.
В состав
(рис 4.9) Настройка расчетных параметров плана видов расчета ОсновныеНачисления
Создадим
МетодРасчета: Тип: ПеречисленияСсылка.МетодыРасчета
КатегорияРасчета: Тип: ПеречисленияСсылка.КатегорииРасчета
На закладке .
(рис 4.10) Настройка расчетных параметров плана видов расчета ДополнительныеНачисления
Запустим конфигурацию в пользовательском режиме, перейдем в
| Наименование и код | Метод расчета, категория расчета, влияние на отработанное время | |||
|---|---|---|---|---|
| Базовые | Ведущие | Вытесняющие | ||
| Оклад
000000001 | Метод расчета: По отработанному времени
Категория расчета: Первичное Влияет на отработанное время: Установлено | Прогул
Отпуск | ||
| Оклад по дням
000000002 | Метод расчета: По дням
Категория расчета: Первичное Влияет на отработанное время: Установлено | Прогул
Отпуск | ||
| Прогул
000000003 | Метод расчета: Фиксированная сумма
Категория расчета: Первичное Влияет на отработанное время: Не установлено | |||
| Отпуск
000000004 | Метод расчета: По среднему
Категория расчета: Зависимое первого уровня Влияет на отработанное время: Не установлено | Оклад
Оклад по дням | Оклад
Оклад по дням | |
Перейдем в
| Наименование, код | Метод расчета, категория расчета | ||
|---|---|---|---|
| Базовые | Ведущие | ||
| Доплата
000000001 | Метод расчета: Процентом
Категория расчета: Зависимое первого уровня | Оклад | Оклад |
| Премия суммой
000000002 | Метод расчета: Фиксированная сумма
Категория расчета: Первичное | ||
| Премия
000000003 | Метод расчета: Процентом
Категория расчета: Зависимое второго уровня | Оклад
Доплата | Оклад
Доплата |
| Удержание
000000004 | Метод расчета: Фиксированная сумма
Категория расчета: Первичное | ||
Обратите внимание на то, что в плане
На рис 4.11. вы можете видеть форму вида расчета Оклад, в которой открыта закладка Вытесняющие виды расчетов.
(рис 4.11) Настройка вида расчета Оклад
На рис 4.12 вы можете видеть форму вида расчета Премия с открытой вкладкой Базовые виды расчета.
(рис 4.12) Настройка вида расчета Премия
Перейдем в ), выполним следующие настройки
Имя: ОсновныеНачисления
План видов расчета: ОсновныеНачисления
Период действия: установлено
График: РабочиеДниПоГрафику
Значение графика: РабочийДень
Дата графика: Дата
Базовый период: установлено
Периодичность: Месяц
Включим
(рис 4.13) Регистр расчета ОсновныеНачисления, закладка Основные
Благодаря настройкам закладки Основные, мы настроили общие свойства
Перейдем на закладку ).
Создадим измерение Сотрудник, Тип: СправочникСсылка.Сотрудники, Запрет незаполненных значений – установлено. Благодаря этому измерению мы сможем учитывать начисления и удержания в разрезе сотрудников.
Создадим следующие ресурсы:
Сумма, Тип: Число, Длина 10, точность 2.
Здесь мы будем хранить результат расчета, полученный из исходных данных с использованием алгоритма расчета, используемого для конкретного начисления.
ДнейОтработано, Тип: Число, Длина 2, точность 0
Здесь мы будем, в том случае, если начисление увеличивает количество отработанных дней, хранить это количество.
Создадим следующие реквизиты:
ИсходныеДанные, Тип: Число, длина 10, точность 2
В этом реквизите мы будем хранить исходные данные для расчета вида начисления (суммы, процентные показатели).
График: Тип: СправочникСсылка.ГрафикиРаботы, Связь с графиком – График (измерение регистра сведений)
Здесь мы будем хранить ссылку на график, используемый с начислением в том случае, если это имеет смысл.
(рис 4.14) Регистр расчета ОсновныеНачисления, закладка Данные
Создадим еще один
(рис 4.15) Регистр расчета ДополнительныеНачисления, закладка Основные
Имя: ДополнительныеНачисления
Периодичность: месяц
Этот
Включим регистр в состав подсистемы РасчетЗаработнойПлаты.
Перейдем на закладку окна редактирования объекта ).
(рис 4.16) Регистр расчета ДополнительныеНачисления, закладка Данные
Создадим измерение:
Имя: Сотрудник, Тип: СправочникСсылка.Сотрудники
Создадим ресурс:
Имя: Сумма, Тип: Число, длина 10, точность 2
Создадим реквизит:
Имя: ИсходныеДанные, Тип: Число, длина 10, точность 2
Создадим общий модуль, назовем его РасчетЗарплаты, включим в его свойствах параметр Привилегированный – это позволит, в том случае, если расчет зарплаты выполняется пользователем, права которого ограничены, при обращении к данным, доступа к которым пользователь не имеет, обойти ограничения пользователя.
Создадим в общем модуле процедуру следующего вида:
Процедура РассчитатьЗарплату(Регистратор) Экспорт КонецПроцедуры
Мы будем вызывать эту процедуру из процедуры обработки проведения документа. Мы будем передавать в процедуру параметр Регистратор – ссылку на документ, который сформировал движения в регистре. Отобрав записи регистра по переданному регистратору, в дальнейшем мы реализуем расчет записей.
Теперь займемся документом, который будет использоваться для начисления заработной платы.
Создадим новый документ, назовем его НачислениеЗарплаты, укажем, что он входит в подсистему РасчетЗаработнойПлаты, укажем, что он проводится по
На закладке Данные добавим табличную часть ОсновныеНачисления. Добавим в нее следующие реквизиты:
Сотрудник: Тип: СправочникСсылка.Сотрудники
ВидРасчета: Тип: ПланВидовРасчетаСсылка.ОсновныеНачисления
ИсходныеДанные: Тип: Число, длина 10, точность 2
График: Тип: СправочникСсылка.ГрафикиРаботы
ДатаНачалаПериодаДействия: Тип: Дата, состав даты – Дата
ДатаОкончанияПериодаДействия: Тип: Дата, состав даты – Дата
ДатаНачалаБазовогоПериода: Тип: Дата, состав даты – Дата
ДатаОкончанияБазовогоПериода: Тип: Дата, состав даты – Дата
Добавим табличную часть ДополнительныеНачисления, создадим в ней следующие реквизиты:
Сотрудник: Тип: СправочникСсылка.Сотрудники
ВидРасчета: Тип: ПланВидовРасчетаСсылка.ДополнительныеНачисления
ИсходныеДанные: Тип: Число, длина 10, точность 2
ДатаНачалаБазовогоПериода: Тип: Дата, состав даты – Дата
ДатаОкончанияБазовогоПериода: Тип: Дата, состав даты – Дата
Создадим форму документа, согласившись с параметрами, предложенными по умолчанию (рис 4.17).
(рис 4.17) Форма документа НачислениеЗарплаты
Сформируем, используя конструктор движений документа, процедуру проведения. Мы модифицировали процедуру проведения документа, в частности, добавили команды для формирования, при необходимости, сторно-записей, после формирования движений дали команду их записи, и, далее, вызвали процедуру из общего модуля для расчета заработной платы с указанием ссылки на документ в качестве параметра.
Процедура обработки проведения нашего документа содержит такой код:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// регистр ОсновныеНачисления
Движения.ОсновныеНачисления.Записывать = Истина;
Для Каждого ТекСтрокаОсновныеНачисления Из ОсновныеНачисления Цикл
Движение = Движения.ОсновныеНачисления.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета;
Движение.ПериодДействияНачало
= ТекСтрокаОсновныеНачисления.ДатаНачалаПериодаДействия;
Движение.ПериодДействияКонец
= ТекСтрокаОсновныеНачисления.ДатаОкончанияПериодаДействия;
Движение.ПериодРегистрации = Дата;
Движение.БазовыйПериодНачало
= ТекСтрокаОсновныеНачисления.ДатаНачалаБазовогоПериода;
Движение.БазовыйПериодКонец
= ТекСтрокаОсновныеНачисления.ДатаОкончанияБазовогоПериода;
Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник;
Движение.ИсходныеДанные = ТекСтрокаОсновныеНачисления.ИсходныеДанные;
Движение.График = ТекСтрокаОсновныеНачисления.График;
КонецЦикла;
// регистр ДополнительныеНачисления
Движения.ДополнительныеНачисления.Записывать = Истина;
Для Каждого ТекСтрокаДополнительныеНачисления Из ДополнительныеНачисления Цикл
Движение = Движения.ДополнительныеНачисления.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ТекСтрокаДополнительныеНачисления.ВидРасчета;
Движение.ПериодРегистрации = Дата;
Движение.БазовыйПериодНачало
= ТекСтрокаДополнительныеНачисления.ДатаНачалаБазовогоПериода;
Движение.БазовыйПериодКонец
= ТекСтрокаДополнительныеНачисления.ДатаОкончанияБазовогоПериода;
Движение.Сотрудник = ТекСтрокаДополнительныеНачисления.Сотрудник;
Движение.ИсходныеДанные = ТекСтрокаДополнительныеНачисления.ИсходныеДанные;
КонецЦикла;
// Сторно-записи
Дополнения=Движения.ОсновныеНачисления.ПолучитьДополнение();
Для Каждого Дополнение из Дополнения Цикл
Движение=Движения.ОсновныеНачисления.Добавить();
Движение.Сторно=Истина;
Движение.Сотрудник=Дополнение.Сотрудник;
Движение.ВидРасчета=Дополнение.ВидРасчета;
Движение.БазовыйПериодНачало=Дополнение.БазовыйПериодНачало;
Движение.БазовыйПериодКонец=Дополнение.БазовыйПериодКонец;
Движение.График=Дополнение.График;
Движение.ИсходныеДанные=Дополнение.ИсходныеДанные;
Движение.ПериодРегистрации=Дополнение.ПериодРегистрацииСторно;
Движение.ПериодДействияНачало=Дополнение.ПериодДействияНачалоСторно;
Движение.ПериодДействияКонец=Дополнение.ПериодДействияКонецСторно;
КонецЦикла;
Движения.Записать();
РасчетЗарплаты.РассчитатьЗарплату(Ссылка);
КонецПроцедуры
Формирование движений по
Обратите внимание на команду:
Дополнения=Движения.ОсновныеНачисления.ПолучитьДополнение();
Метод набора записей ПолучитьДополнение() позволяет получить дополнительные данные, с помощью которых можно выполнить сторнирование записей предыдущих периодов при вводе в текущем периоде записей, влияющих на записи предыдущих периодов.
Например, в октябре 2011 года сотруднику был задан Оклад, а в ноябре 2011 выяснилось, что часть оклада начислена неправомерно – лишь в ноябре стало известно, что несколько дней в предыдущем месяце сотрудник прогулял. В ноябре ему вводится Прогул, в котором указаны пропущенные дни – Прогул является Оклада. За эти дни ему не должен начисляться оклад, но записи предыдущего месяца менять нельзя, например, с них уже начислены налоги. При вводе данных о прогуле система, на основе механизма вытеснения, может "предложить" сформировать сторно-запись, которая отразит в текущем периоде данные (вычет, в конечном счете), которые приведут, в итоге, к правильным взаиморасчетам организации и сотрудника. Например, если в предыдущем периоде ему было переплачено 1500 рублей, то, в соответствии с идеологией сторнирования, в текущем периоде у него вычтут те же 1500 рублей, не затрагивая, при этом, записи, сформированные в предыдущем периоде.
После того, как записи, и, при необходимости, сторно-записи сформированы, записываем их и вызываем процедуру РассчитатьЗарплату() из общего модуля РасчетЗарплаты.
Расчетом записей мы займемся в следующей лекции.
В этой лекции мы рассмотрели создание основных объектов, на которых базируется подсистема расчета заработной платы. Это –
Наша следующая лекция продолжает тему решения расчетных задач.
Для данной лекции подготовлен видеоурок.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.