Опубликован: 06.12.2011 | Уровень: специалист | Доступ: свободно
Лекция 4:

Разработка расчетной подсистемы

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

Создадим в общем модуле процедуру следующего вида:

Процедура РассчитатьЗарплату(Регистратор) Экспорт
КонецПроцедуры

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

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

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

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

Сотрудник: Тип: СправочникСсылка.Сотрудники

ВидРасчета: Тип: ПланВидовРасчетаСсылка.ОсновныеНачисления

ИсходныеДанные: Тип: Число, длина 10, точность 2

График: Тип: СправочникСсылка.ГрафикиРаботы

ДатаНачалаПериодаДействия: Тип: Дата, состав даты – Дата

ДатаОкончанияПериодаДействия: Тип: Дата, состав даты – Дата

ДатаНачалаБазовогоПериода: Тип: Дата, состав даты – Дата

ДатаОкончанияБазовогоПериода: Тип: Дата, состав даты – Дата

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

Сотрудник: Тип: СправочникСсылка.Сотрудники

ВидРасчета: Тип: ПланВидовРасчетаСсылка.ДополнительныеНачисления

ИсходныеДанные: Тип: Число, длина 10, точность 2

ДатаНачалаБазовогоПериода: Тип: Дата, состав даты – Дата

ДатаОкончанияБазовогоПериода: Тип: Дата, состав даты – Дата

Создадим форму документа, согласившись с параметрами, предложенными по умолчанию ( рис. 4.17).

Форма документа НачислениеЗарплаты

увеличить изображение
Рис. 4.17. Форма документа НачислениеЗарплаты

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

Процедура обработки проведения нашего документа содержит такой код:

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

Формирование движений по регистрам расчета в циклах перебора табличных частей документа выполняются вполне стандартно.

Обратите внимание на команду:

Дополнения=Движения.ОсновныеНачисления.ПолучитьДополнение();

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

Например, в октябре 2011 года сотруднику был задан вид расчета Оклад, а в ноябре 2011 выяснилось, что часть оклада начислена неправомерно – лишь в ноябре стало известно, что несколько дней в предыдущем месяце сотрудник прогулял. В ноябре ему вводится вид расчета Прогул, в котором указаны пропущенные дни – Прогул является вытесняющим видом расчета для Оклада. За эти дни ему не должен начисляться оклад, но записи предыдущего месяца менять нельзя, например, с них уже начислены налоги. При вводе данных о прогуле система, на основе механизма вытеснения, может "предложить" сформировать сторно-запись, которая отразит в текущем периоде данные (вычет, в конечном счете), которые приведут, в итоге, к правильным взаиморасчетам организации и сотрудника. Например, если в предыдущем периоде ему было переплачено 1500 рублей, то, в соответствии с идеологией сторнирования, в текущем периоде у него вычтут те же 1500 рублей, не затрагивая, при этом, записи, сформированные в предыдущем периоде.

После того, как записи, и, при необходимости, сторно-записи сформированы, записываем их и вызываем процедуру РассчитатьЗарплату() из общего модуля РасчетЗарплаты.

Расчетом записей мы займемся в следующей лекции.

Выводы

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

Наша следующая лекция продолжает тему решения расчетных задач.

Константин Павлов
Константин Павлов
Почему информация по Плану счетов не полная?
Надежда Федулкина
Надежда Федулкина
где находиться выгрузка базы?
Эварист Аминев
Эварист Аминев
Россия
Илья Калиничев
Илья Калиничев
Россия, Самара