Имя: Пароль:
1C
 
Средний заработок через запрос
0 AleGol
 
23.07.08
08:19
Подскажите пожалуйста, ни разу не сталкивался с регистрами расчета, а теперь вот понадобилось. Как определить запросом среднюю зарплату отпуска. Какой вид расчета брать, в чем отличие и что делать когда запрос с фильтром по одному виду расчета и одному месяцу выдается несколько записей с разными сумами. Смотрел расчет в документе НачислениеОтпускаРаботникамОрганизаций, но там как то сильно завязано на документы. А чисто по регистру расчета можно ли определить?
1 xrrg
 
23.07.08
09:19
запиши в транзакции документ, посчитай, потом отмени транзакцию
2 Said_We
 
23.07.08
09:32
(0) Можно. Документ же определяет. Но для этого необзходимо написать все как в документе или не париться и сделать как в (1). :-))
3 AleGol
 
23.07.08
09:36
(1) Какой то кривой способ. Я так считаю что из регистра расчета все можно достать
4 almar
 
23.07.08
09:38
(3) ну тогда уж из двух регистров :)
5 xrrg
 
23.07.08
09:42
(3) есть подозрение, что если будешь сам реализовывать, то получится еще кривее.
6 Aprobator
 
23.07.08
09:52
(4) по поводу (1) - зато если что-то поменяется в расчете сумм среднего не надо будет париться самому с переписью своего отчета (1С сама на тебя поработает) или что там у тебя?
7 almar
 
23.07.08
09:57
Вообще-то, т.к. виды расчета по среднему могут вводится не только документами "оплата отпуска", "оплата по больничному" и "оплата по среднему" но и просто, например, "начислением зарплаты". Все процедуры расчета и запросы есть в общем модуле "проведение расчетов".
8 xrrg
 
23.07.08
10:30
(7) для отпуска значит для отпуска, для каждого из перечисленных начислений свой расчет среднедневного заработка
9 Said_We
 
23.07.08
10:40
(5) Смотря как реализовывать... :-))
Можно вообще без регистров расчета средний считать. Тем более что перерасчеты в 1С все равно не работают должным образом.
10 John Lennon
 
23.07.08
10:46
помоги себе сам это называется. Я мучался долго, пока все четко не прописал, зато терь знаю, как, где и что считается в моей конфе :) просто конфа старая и обновления на нее ставить бессмысленно...
11 John Lennon
 
23.07.08
10:47
(0) а мой запрос тебе не помощник, потому что все ВР старые и своя специфика при расчете среднего ;)
12 xrrg
 
23.07.08
11:10
(9) да кто ж спорит, только скока времени это займет. нормативная база там неистовая ;)

вот. для одной справки надо было узнать среднедневной заработок, потом тупо умножал на 29.4
эту функцию надо добавить СформироватьЗапросПоШапке.

Функция РассчитатьСреднийЗаработок(ДатаУвольнения)
   
   НачатьТранзакцию();
   
   Документ = Документы.НачислениеОтпускаРаботникамОрганизаций.СоздатьДокумент();
   Документ.Дата = ТекущаяДата();
   Документ.УстановитьНовыйНомер();
   Документ.Организация = Сотрудник.Организация;
   Документ.Сотрудник = Сотрудник;
   Документ.ПериодРегистрации = ТекущаяДата();
   Документ.ДатаНачалаОсновногоОтпуска = ДатаУвольнения + 86400;
   Документ.ДатаОкончанияОсновногоОтпуска = ДатаУвольнения + 86400;
   Документ.ПорядокРасчетаОсновногоОтпуска = Перечисления.ПорядокРасчетаОтпуска.ПоКалендарнымДням;
   Попытка
       Документ.Записать();
       Ссылка = Документ.Ссылка;
   Исключение
       Сообщить("Не удалось записать временный объект!" + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
       Возврат 0
   КонецПопытки;
   
   ВыборкаПоШапкеДокумента = СформироватьЗапросПоШапке(Документ).Выбрать();
   // позиционируем выборку
   ВыборкаПоШапкеДокумента.Следующий();
   
   // Создадим наборы записей используемых регистров
   НаборОсновныеНачисления = РегистрыРасчета.ОсновныеНачисленияРаботниковОрганизаций.СоздатьНаборЗаписей();
   НаборОсновныеНачисления.Отбор.Регистратор.Значение = Ссылка;
   НаборОсновныеНачисления.мВыполнятьВспомогательныеРасчеты = Ложь;
       
   НаборДополнительныеНачисления = РегистрыРасчета.ДополнительныеНачисленияРаботниковОрганизаций.СоздатьНаборЗаписей();
   НаборДополнительныеНачисления.Отбор.Регистратор.Значение = Ссылка;
   
   НаборРасчетСреднего = РегистрыРасчета.РасчетСреднегоЗаработка.СоздатьНаборЗаписей();
   НаборРасчетСреднего.Отбор.Регистратор.Значение = Ссылка;    
   
   Документ.СформироватьДвиженияПоНачислениям(ВыборкаПоШапкеДокумента, НаборОсновныеНачисления, НаборДополнительныеНачисления);
   
   Если НаборОсновныеНачисления.Количество() <> 0 Тогда        
       ПроведениеРасчетов.РассчитатьЗаписиРегистраРасчета("ОсновныеНачисленияРаботниковОрганизаций", НаборОсновныеНачисления, , НаборРасчетСреднего, ВыборкаПоШапкеДокумента.ГоловнаяОрганизация, ВыборкаПоШапкеДокумента.ОбособленноеПодразделение,,Истина);
   КонецЕсли;
       
   // перепишем записи основных начислений в документ
   ЗаписиНачислений = НаборОсновныеНачисления.Выгрузить();
   
   ОтменитьТранзакцию();
       
   Возврат ?(ЗаписиНачислений.Количество() > 0, ЗаписиНачислений[0].ДополнительныеДанные, 0)
   
КонецФункции
13 Said_We
 
23.07.08
11:43
(12) Несколько страниц текста - это неистовая база? :-))
Насмешил.
14 xrrg
 
23.07.08
11:46
(13) "нет препятствий патриотам"
имея ЗУП я не стану считать каким-то своим способом.
15 AleGol
 
23.07.08
11:50
(14) Спасибо, функция то что надо. Вот только возможно ли как проверить, что считает правильно?
16 AleGol
 
23.07.08
11:50
(12)(14) Спасибо, функция то что надо. Вот только возможно ли как проверить, что считает правильно?
17 xrrg
 
23.07.08
11:53
(16) рассчитай отпуск, посмотри там среднедневной
18 AleGol
 
23.07.08
11:55
(17) Ага, ну вообще огромное спасибо
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой