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