Смекни!
smekni.com

Описание функционирования организации (стр. 11 из 12)

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

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

Необходимо создать новый регистр расчета с именем ЗП_Расчет.

На вкладке Основные: план видов расчета – ОсновныеНачисления, Период действии – активизировать, график – регистр сведений ГрафикиРабот, значение – в ресурсе значение, дата – в измерении Дата. Базовый период – месяц.

Вкладка Данные: измерение – Сотрудник, ресурс – Результат (число), реквизит – ГрафикРабот (тип данных – ВидыГрафиковРабот, связь с графиком по измерению График), реквизит - ИсходныеДанные (число, длина 15). Реквизит исходные данные потребуется, чтобы хранить исходные данные, которые понадобятся при расчете или перерасчете.

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

Несколько слов о виртуальном представлении регистра расчета, с чем разработчик может столкнуться при создании запросов:

Наименование виртуальной таблицы Поля Характеристика
(ИмяРегистра)ДанныеГрафикаОтображает сведения по периодам действия расчета - базового периода, фактического периода и др. Сведения могут быть представлены как в виде «крайних» дат периодов, так и дней в периоде. При расчете фактических периодов учитываются вытесняющие виды расчета. ПериодРегистрации Дата начала периода, соответствующего дате регистрации
Регистратор Ссылка на документ
НомерСтроки Номер строки записи регистра
ВидРасчета
ПериодДействия Дата начала периода, соответствующего указанной дате начала периода действия вида расчета (по документу-регистратору)
ПериодДействияНачало Дата начала периода действия вида расчета (по документу-регистратору)
ПериодДействияКонец Дата окончания периода действия вида расчета (по документу-регистратору)
БазовыйПериодНачало Для вторичных расчетов Дата начала базового периода
БазовыйПериодКонец Для вторичных расчетов Дата окончания базового периода
Измерения, Ресурсы…
ЗначениеПериодДействия Дней в периоде действия в соответствии указанным рабочим графиком (например, в месяце)
ЗначениеФактическийПериодДействия Фактически дней для расчета в периоде (с учетом всех вытесняющих видов расчета)
ЗначениеБазовыйПериодДействия Для вторичных расчетов - фактически дней в периоде для базовых расчетов (с учетом всех вытесняющих видов расчета)
(ИмяРегистра)База((ИмяРегистра)Отображает информацию для вторичных расчетов. Определяет фактическую базу для расчета с учетом всех вытеснений в установленных измерениях ПериодРегистрации
Регистратор
…….
Измерения, Ресурсы…
РезультатБаза Базовый результат первичных расчетов с учетом вытеснений (фактического базового периода).

3.9.2 Разработка процедур начислений сотрудникам

Создание документа о начислении сотрудникам

Создать документ Начисления. На вкладке Данные создать табличную часть РасшифровкаНачислений, которая включает следующие реквизиты: Сотрудник, ГрафикРаботы, ДатаНачала, ДатаОкончания, ВидРасчета (План видов расчета Основные начисления), Результат (Число).

Анализ алгоритма проведения расчетов

На Рис. 14Алгоритм расчета по окладу представлен алгоритм расчета составляющей по окладу. Особенностью представленных расчетов является то, что сначала документ Начисление проводится по регистру расчета (без расчета результата), а потом на основании созданных записей рассчитываются значений оклада. При этом учитывается как нормативный период, так и фактический период работы, так и вытесняющие расчеты. Результат заносится в регистр.

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


Рис. 14Алгоритм расчета по окладу


Рис. 15 Фрагмент алгоритма расчета премии

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

Проведение документа Начисления по регистру расчета

В документе Начисления вызвать Конструктор движений и сформировать движения документа. Вид движения представлен на Рис. 16.

Рис. 16 Движения документа Начисления в режиме конструктора

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

Создание процедур расчета в общем модуле

Создать новый общий модуль, имя – Расчеты. В модуле сформировать следующую процедуру.

Процедура Рассчитать(ЗаписиРегистра, ВидРасчета,СписокРаботников) Экспорт Начало процедуры. В скобках – входящие параметры, которые будут формироваться в документах, использующих процедуру
Если ВидРасчета=ПланыВидовРасчета. ОсновныеНачисления.Оклад тогда Начало расчетов по ВидуРасчета Оклад
Запрос=Новый Запрос; Запрос.Текст= Организация нового запроса к регистру ЗП_Расчет, виртуальное представление – Данные графика
Формирование запроса в режиме конструктора. Результатом выполнения запроса является: ПоНорме (нормативный период действия – дней в месяце), ПоФакту – фактический период действия с учетом вытесняющих расчетов для строк регистра (НомерСтроки). Ограничения (условия): по заданному виду расчета (оклад), по ограниченному списку сотрудников, анализируются записи регистра, соответствующие заданному документу (регистратору).
"ВЫБРАТЬ | ЗП_РасчетДанныеГрафика.ЗначениеФактическийПериодДействия КАК ПоФакту, | ЗП_РасчетДанныеГрафика.НомерСтроки, | ЗП_РасчетДанныеГрафика.ЗначениеПериодДействия КАК ПоНорме |ИЗ | РегистрРасчета.ЗП_Расчет.ДанныеГрафика КАК ЗП_РасчетДанные Графика |ГДЕ | ЗП_РасчетДанныеГрафика.Регистратор = &Регистратор | И ЗП_РасчетДанныеГрафика.ВидРасчета = &ВидРасчета | И ЗП_РасчетДанныеГрафика.Сотрудник В(&СписокСотрудников)";
Запрос.УстановитьПараметр("Регистратор", ЗаписиРегистра.Отбор.Регистратор. Значение); Установка параметра Регистратор. Будет соответствовать ссылке на регистратор для переданных Записей регистра (которые, в свою очередь будут соответствовать документу Начисления)
Запрос.УстановитьПараметр ("ВидРасчета",ВидРасчета); Установка параметра Вид расчета (Оклад).
Запрос.УстановитьПараметр ("СписокСотрудников",СписокРаботников); Установка параметра СписокСотрудников, который будет передан из документа при вызове процедуры.
ВыборкаРезультата=Запрос.Выполнить().Выбрать(); Выполнение запроса, результату выполнения присвоено имя – ВыборкаРезультата
Для каждого ЗаписьРегистра из ЗаписиРегистра Цикл Начало цикла для перебора переданных записей регистра расчета
СтруктураНомер=Новый Структура("НомерСтроки"); Создание временной структуры, состоящей из одной колонки (НомерСтроки)
СтруктураНомер.Номер Строки= Запись Регистра НомерСтроки; Передача в структуру, созданную на предыдущем шаге номера записи регистра (Номера Строки)
ВыборкаРезультата.Сбросить(); Позиционирование выборки на первую запись
Если ВыборкаРезультата.Найти Следующий(СтруктураНомер) тогда Если номер записи в выборке совпадает с номером записи из переданных записей регистра, то переход к расчету по окладу
Если ВыборкаРезультата.ПоНорме=0 тогда Сообщить("Нет рабочих дней"); ЗаписьРегистра.Результат=0 Если отсутствует результат по норме (для сотрудника не установлен график), то формирование нулевого результата
Иначе ЗаписьРегистра.Результат= (ЗаписьРегистра. ИсходныеДанные/ ВыборкаРезультата. ПоНорме)* ВыборкаРезультата.ПоФакту; Расчет фактического оклада
КонецЕслиКонецЕслиКонецЦикла Завершения расчета по окладу
ИначеЕсли ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Премия тогда Начало расчетов по ВидуРасчета Премия
Формирование запроса в режиме конструктора. Результатом является значение базы по каждой строке регистра. Ограничения аналогичны предыдущему запросу. Добавляются ограничения по измерениям основного и базового регистра. В данном примере это один регистр, требуемое измерение - Сотрудник
Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | ЗП_РасчетБазаЗП_Расчет.НомерСтроки, | ЗП_РасчетБазаЗП_Расчет.РезультатБаза КАК База |ИЗ | РегистрРасчета.ЗП_Расчет.БазаЗП_Расчет(&ИзмеренияОсновной, &ИзмеренияБазовый, , ) КАК ЗП_РасчетБазаЗП_Расчет |ГДЕ | ЗП_РасчетБазаЗП_Расчет.Регистратор = &Регистратор | И ЗП_РасчетБазаЗП_Расчет.ВидРасчета = &ВидРасчета | И ЗП_РасчетБазаЗП_Расчет.Сотрудник В(&СписокСотрудников)";
Измерение=Новый Массив(1);
Измерение[0]="Сотрудник";
Запрос.УстановитьПараметр ("ИзмеренияОсновной",Измерение); Установка параметров для запроса
Запрос.УстановитьПараметр ("ИзмеренияБазовый", Измерение);
Запрос.УстановитьПараметр ("Регистратор",ЗаписиРегистра.Отбор.Регистратор.Значение);
Запрос.УстановитьПараметр ("ВидРасчета",ВидРасчета);
Запрос.УстановитьПараметр ("СписокСотрудников",СписокРаботников);
ВыборкаРезультата=Запрос.Выполнить().Выбрать(); Смотри комментарии выше для расчета оклада
Для каждого ЗаписьРегистра из ЗаписиРегистра Цикл
СтруктураНомер=Новый Структура("НомерСтроки");
СтруктураНомер.НомерСтроки=ЗаписьРегистра.НомерСтроки;
ВыборкаРезультата.Сбросить();
Если ВыборкаРезультата.Найти Следующий(СтруктураНомер) тогда
ЗаписьРегистра.Результат=ВыборкаРезультата.База*0.25;
КонецЕсли
КонецЦикла
КонецЕсли
КонецПроцедуры

Разработка процедуры обработки проведения (расчета) в документе Начисления