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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Выводы

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

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

Константин Павлов
Константин Павлов

Почему в лекции 1 "Основы организации бухгалтерской подсистемы" курса "Разработка прикладных решений для платформы 1С:Предприятие 8.2 в режиме "Управляемое приложение"" совершенно нет информации о том что нужно на вкладке данные в табличной части создать табличную часть "ВидыСубконто" и также нет информации о том какие нужно добавить реквизиты и какие у этих реквизитов должен быть тип? Считаю лекцию 1 в данном вопросе недоработанной.

Надежда Федулкина
Надежда Федулкина
Олег Некрасов
Олег Некрасов
Россия
Алексей Васильев
Алексей Васильев
Россия, Новосибирск