Oks9I
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору vizlipuzli Все верно. Не получается высчитать сумму премии на основе суммы продаж предыдущего месяца и сделать движения в регистр расчета ДополнительНачисления В конфигурации имеются: Справочник - ГрафикиРаботы Документ - НачислениеЗарплаты Планы видов расчета - ОсновыеНачисления и ДополнительныеНачисления Регистр сведений - НормаПродажи Регистр накопления - Продажи Регистры расчета - ОсновыеНачисления и ДополнительныеНачисления Все расчеты должны выполняться в общем модуле. Вот что у меня получилось. Документ НачислениеЗарплаты: Цитата: Процедура ОбработкаПроведения(Отказ, Режим) Для Каждого ТекСтрокаОсновныеНачисления Из ОсновныеНачисления Цикл // регистр ОсновныеНачисления Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодДействияНачало = ТекСтрокаОсновныеНачисления.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(ТекСтрокаОсновныеНачисления.ДатаОкончания); Движение.ПериодРегистрации = Дата; Движение.БазовыйПериодНачало = ТекСтрокаОсновныеНачисления.ДатаНачала; Движение.БазовыйПериодКонец = КонецДня(ТекСтрокаОсновныеНачисления.ДатаОкончания); Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаОсновныеНачисления.Подразделение; Движение.Должность = ТекСтрокаОсновныеНачисления.Должность; Движение.ГрафикРаботы = ТекСтрокаОсновныеНачисления.ГрафикРаботы; Движение.ИсходныеДанные = ТекСтрокаОсновныеНачисления.Результат; КонецЦикла; // записываем движения регистров Движения.ОсновныеНачисления.Записать(); //получим список всех сотрудников, содержащихся в документе Запрос = Новый Запрос( "ВЫБРАТЬ РАЗЛИЧНЫЕ | НачислениеЗарплатыОсновныеНачисления.Сотрудник |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &ТекущийДокумент"); Запрос.УстановитьПараметр("ТекущийДокумент",Ссылка); //сформируем список сотрудников ТаблЗнач = Запрос.Выполнить().Выгрузить(); МассивСотрудников = ТаблЗнач.ВыгрузитьКолонку("Сотрудник"); СписокСотрудников = Новый СписокЗначений; СписокСотрудников.ЗагрузитьЗначения(МассивСотрудников); РасчитатьНачисления(Движения.ОсновныеНачисления, ПланыВидовРасчета.ОсновныеНачисления.Оклад, СписокСотрудников,ПериодРегистрации); Движения.ОсновныеНачисления.Записать(, Истина); РасчитатьНачисления(Движения.ДополнительныеНачисления, ПланыВидовРасчета.ДополнительныеНачисления.Премия, СписокСотрудников,ПериодРегистрации); Движения.ДополнительныеНачисления.Записать(, Истина); КонецПроцедуры | Общий модуль: Цитата: Процедура РасчитатьНачисления (НаборЗаписейРегистра, ТребуемыйВидРасчета, СписокСотрудников, ПериодРегистрации) Экспорт //эта часть работает Регистратор = НаборЗаписейРегистра.Отбор.Регистратор.Значение; //Рассчитать первичные записи Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт, | ОсновныеНачисленияДанныеГрафика.НомерСтроки |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Регистратор | И ВидРасчета = &ВидРасчета | И Сотрудник В (&СписокСотрудников)) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Регистратор", Регистратор); Запрос.УстановитьПараметр("ВидРасчета",ТребуемыйВидРасчета); Запрос.УстановитьПараметр("СписокСотрудников",СписокСотрудников); ВыборкаРезультата = Запрос.Выполнить().Выбрать(); Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл СтруктураНомер = Новый Структура("НомерСтроки"); СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки; ВыборкаРезультата.Сбросить(); Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда Если ВыборкаРезультата.Норма = 0 Тогда Сообщить("Вид расчета: Оклад — Нет рабочих дней в заданном периоде",); ЗаписьРегистра.Результат = 0; Иначе //Рассчитать оклад по фактическому периоду и исходным данным ЗаписьРегистра.Результат = (ЗаписьРегистра.ИсходныеДанные/ВыборкаРезультата.Норма) *ВыборкаРезультата.Факт; Сообщить("Выполнен расчет "+ЗаписьРегистра.Регистратор+" - " +ЗаписьРегистра.ВидРасчета+" - " +ЗаписьРегистра.Сотрудник,); КонецЕсли; КонецЕсли; КонецЦикла; //Рассчитать вторичные записи ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Премия Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза КАК База, | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &ИзмеренияОсновного, | &ИзмеренияБазового, | , | ВидРасчета = &ВидРасчета | И Сотрудник В (&СписокСотрудников)) КАК ДополнительныеНачисленияБазаОсновныеНачисления | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | НормаПродажиСрезПоследних.Сотрудник КАК Сотрудник, | НормаПродажиСрезПоследних.Норма КАК Норма, | ПродажиОбороты.СуммаОборот КАК СуммаОборот | ИЗ | РегистрСведений.НормаПродажи.СрезПоследних КАК НормаПродажиСрезПоследних | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&НачПериода, &КонПериода, , ) КАК ПродажиОбороты | ПО НормаПродажиСрезПоследних.Сотрудник = ПродажиОбороты.Сотрудник) КАК ВложенныйЗапрос | ПО ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза = ВложенныйЗапрос.Сотрудник"; Измер = Новый Массив(1); Измер[0] = "Сотрудник"; Запрос.УстановитьПараметр("ИзмеренияОсновного", Измер); Запрос.УстановитьПараметр("ИзмеренияБазового", Измер); Запрос.УстановитьПараметр("ВидРасчета", ТребуемыйВидРасчета); Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников); Запрос.УстановитьПараметр("НачПериода", НачалоМесяца(ДобавитьМесяц(ПериодРегистрации,-1))); Запрос.УстановитьПараметр("КонПериода", КонецМесяца(ДобавитьМесяц(ПериодРегистрации,-1))); ВыборкаРезультата = Запрос.Выполнить().Выбрать(); //а в этом месте идет перескок на конец этого цикла и //ничего не происходит Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл СтруктураНомер = Новый Структура("НомерСтроки"); СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки; ВыборкаРезультата.Сбросить(); Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда СуммаПродажи = ВыборкаРезультата.Сумма; Норма = ВыборкаРезультата.Норма; СуммаПремии = 0; Если СуммаПродажи >= Норма*0.5 Тогда СуммаПремии = 20; ИначеЕсли СуммаПродажи >= Норма*0.75 Тогда СуммаПремии = 30; ИначеЕсли СуммаПродажи >= Норма+Норма Тогда СуммаПремии = 50; КонецЕсли; ЗаписьРегистра.Результат = ВыборкаРезультата.База * ((100 - СуммаПремии)/100); Сообщить("Выполнен расчет "+ЗаписьРегистра.Регистратор+" - " +ЗаписьРегистра.ВидРасчета+" - "+ЗаписьРегистра.Сотрудник,); КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры | |