Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Создание процедуры расчета записей регистра Начисления



Откройте в конфигураторе текст обработчика проведения документа НачисленияСотрудникам и добавьте в него следующий текст на встроенном языке (добавляйте в соответствующие строки только те команды, которые выделены жирным шрифтом):

Процедура ОбработкаПроведения(Отказ, Режим)

// Записываем движения регистров

Движения.Начисления.Записать();

// Получим список всех сотрудников, содержащихся в документе

Запрос = Новый Запрос(

" ВЫБРАТЬ РАЗЛИЧНЫЕ

| НачисленияСотрудникамНачисления.Сотрудник

|ИЗ

| Документ.НачисленияСотрудникам.Начисления КАК НачисленияСотрудникамНачисления

|ГДЕ

| НачисленияСотрудникамНачисления.Ссылка = & ТекущийДокумент" );

Запрос.УстановитьПараметр(" ТекущийДокумент", Ссылка);

// Сформируем список сотрудников

ТаблЗнач = Запрос.Выполнить().Выгрузить();

МассивСотрудников = ТаблЗнач.ВыгрузитьКолонку(" Сотрудник" );

СписокСотрудников = Новый СписокЗначений;

СписокСотрудников.ЗагрузитьЗначения(МассивСотрудников);

РасчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.

ОсновныеНачисления. Оклад, СписокСотрудников);

Движения.Начисления.Записать(, Истина);

РасчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.

ОсновныеНачисления.Премия, СписокСотрудников);

Движения.Начисления.Записать(, Истина);

 

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

 

КонецПроцедуры

Обратите внимание: при проведении документа сначала записываются движения, сформированные документом, в регистр, а затем этот набор записей регистра передаются в процедуру расчета. Сначала для расчета первичных записей (Оклад), а затем для расчета вторичных (Премия). Процедура расчета на основе описанных в ней алгоритмов и данных, содержащихся в записях регистра, должна сформировать значения ресурсов регистра. После того, как ресурсы будут рассчитаны, перезаписывается набор записей регистра без формирования записей перерасчета (второй параметр в методе Записать() – Истина).

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

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


Процедура РасчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета,

СписокСотрудников) Экспорт

Регистратор = НаборЗаписейРегистра.Отбор.Регистратор.Значение;

// Рассчитать первичные записи

Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда

// Рассчитать вторичные записи

ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда

КонецЕсли;

КонецПроцедуры

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

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

 

// Рассчитать первичные записи

Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда

 

Запрос = Новый Запрос;

Запрос.Текст =

" ВЫБРАТЬ

| НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма,

| НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,

| НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки

|ИЗ

| РегистрРасчета.Начисления.ДанныеГрафика(

| Регистратор = & Регистратор И

| ВидРасчета = & ВидРасчета И

| Сотрудник В (& СписокСотрудников))

| КАК НачисленияДанныеГрафика";

Запрос.УстановитьПараметр(" Регистратор", Регистратор);

Запрос.УстановитьПараметр(" ВидРасчета", ТребуемыйВидРасчета);

Запрос.УстановитьПараметр(" СписокСотрудников", СписокСотрудников);

ВыборкаРезультата = Запрос.Выполнить().Выбрать();

 

// Рассчитать вторичные записи

ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда

КонецЕсли;

 

КонецПроцедуры

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

Теперь добавьте обход переданного в процедуру набора записей и расчет записей, для которых получены значения графика:

 

ВыборкаРезультата = Запрос.Выполнить().Выбрать();

 

Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл

СтруктураНомер = Новый Структура(" НомерСтроки" );

СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;

ВыборкаРезультата.Сбросить();

Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда

Если ВыборкаРезультата.Норма = 0 тогда

Сообщить(" Вид расчета: Оклад – Нет рабочих дней в заданном периоде", );

ЗаписьРегистра.Результат = 0;

Иначе

// Рассчитать оклад по фактическому периоду и исходным данным

ЗаписьРегистра.Результат = (ЗаписьРегистра.ИсходныеДанные /ВыборкаРезультата.Норма) * ВыборкаРезультата.Факт;

Сообщить(" Выполнен расчет" + ЗаписьРегистра.Регистратор + " - "

+ ЗаписьРегистра.ВидРасчета + " – " + ЗаписьРегистра.Сотрудник, );

КонецЕсли;

КонецЕсли;

КонецЦикла;

 

// Рассчитать вторичные записи

ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия

Тогда

КонецЕсли;

 

КонецПроцедуры

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

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

// Рассчитать вторичные записи

ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда

Запрос = Новый Запрос;

Запрос.Текст =

" ВЫБРАТЬ

| НачисленияБазаНачисления.РезультатБаза КАК База,

| НачисленияБазаНачисления.НомерСтроки КАК НомерСтроки

|ИЗ

| РегистрРасчета.Начисления.БазаНачисления(

| & ИзмеренияОсновного,

| & ИзмеренияБазового, ,

| Регистратор = & Регистратор И

| ВидРасчета = & ВидРасчета И

| Сотрудник В (& СписокСотрудников)) КАК НачисленияБазаНачисления";

Измер = Новый Массив(1);

Измер[0] = " Сотрудник";

Запрос.УстановитьПараметр(" ИзмеренияОсновного", Измер);

Запрос.УстановитьПараметр(" ИзмеренияБазового", Измер);

Запрос.УстановитьПараметр(" Регистратор", Регистратор);

Запрос.УстановитьПараметр(" ВидРасчета", ТребуемыйВидРасчета);

Запрос.УстановитьПараметр(" СписокСотрудников", СписокСотрудников);

ВыборкаРезультата = Запрос.Выполнить().Выбрать();

КонецЕсли;

КонецПроцедуры

В заключение осталось добавить во второе условие Если … обход набора записей регистра расчета и вычисление результата вторичных записей:

// Рассчитать вторичные записи

ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда

....

ВыборкаРезультата = Запрос.Выполнить().Выбрать();

Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл

СтруктураНомер = Новый Структура(" НомерСтроки" );

СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;

ВыборкаРезультата.Сбросить();


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-05-03; Просмотров: 1522; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.023 с.)
Главная | Случайная страница | Обратная связь