Пример решения расчетной задачи с табелем (для 1С:Специалист)

Публикация № 365846

Программирование - Практика программирования

Решение расчетной задачи 1С Специалист Расчетная задача 1С Специалист

14
Условие задачи собрано из нескольких экзаменационных задач и служит общим примером решения.

Условие задачи:

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

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

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

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

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

Ввод всех начислений происходит документом "Начисление зарплаты". Документ в расчетном периоде может быть один.

Решение:

1. Создадим документ "Табель". По условию табель заполняется на каждую отдельную неделю.

Реквизиты:

ДатаНачала (Дата)

ДатаОкончания (Дата)

 

Табличная часть: СписокСотрудников

Сотрудник (СправочникСсылка.ФизическиеЛица)

Подразделение (СправочникСсылка.Подразделения)

Д1, Д2 ... Д7 (всего 7 реквизитов с типом Булево)

 

В реквизитах Д1,Д2...Д7 будем определять фактически отработанные дни сотрудником, если Истина - сотрудник данный день отработал, если Ложь - то нет.

 

Код в модуле Формы:

&НаКлиенте
Процедура ДатаНачалаПриИзменении(Элемент)	
	 Объект.ДатаОкончания = Объект.ДатаНачала + 6*86400;  //конец недели заполним автоматически	
КонецПроцедуры

&НаКлиенте
Процедура СписокСотрудниковСотрудникПриИзменении(Элемент) 	
	ТекущаяСтрока = Элементы.СписокСотрудников.ТекущиеДанные;
	ТекущаяСтрока.Д1 = Истина;
	ТекущаяСтрока.Д2 = Истина;
	ТекущаяСтрока.Д3 = Истина;
	ТекущаяСтрока.Д4 = Истина;
	ТекущаяСтрока.Д5 = Истина;
	ТекущаяСтрока.Д6 = Ложь;
	ТекущаяСтрока.Д7 = Ложь;	
КонецПроцедуры

Документ выполняет движения в оборотный регистр накопления "ЗначениеТабеля".

Измерения:

Сотрудник (СправочникСсылка.ФизическиеЛица)

Подразделение (СправочникСсылка.Подразделения)

Ресурсы:

Отработано (Число (1,0))

 

Код в модуле объекта документа "Табель":

Процедура ОбработкаПроведения(Отказ, РежимПроведения) 	
	Движения.ЗначениеТабеля.Записывать = Истина;
	Для Каждого ТекСтрокаСписокСотрудников Из СписокСотрудников Цикл				
		ЗаписываемаяДата = ДатаНачала;
		Для Счетчик = 1 По 7 Цикл
			Движение = Движения.ЗначениеТабеля.Добавить(); 
			Движение.Период = НачалоДня(ЗаписываемаяДата);
			ЗаписываемаяДата = ЗаписываемаяДата + 86400;
			Движение.Сотрудник = ТекСтрокаСписокСотрудников.Сотрудник;
			Движение.Подразделение = ТекСтрокаСписокСотрудников.Подразделение;
			Движение.Отработано = Число(ТекСтрокаСписокСотрудников["Д"+Строка(Счетчик)]);
    	        КонецЦикла; 		
	КонецЦикла;     	
КонецПроцедуры

 

2. Заполним график работы: Регистр сведений "ГрафикиРаботы".

Измерения:

Дата (Дата)

ГрафикРаботы (СправочникСсылка.ГрафикРаботы)

Ресурсы:

Значение (Число (1,0))

 

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

Значение будет равно единице или нулю (работал/не работал), так как оклад определяется по дням. В качестве значения также можно задать часы, например, 8. А в расчетах затем все равно рассматривать день как рабочий или не рабочий.

 

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

Например, размер оклада сотрудника - 18 750. В январе (2015) количество рабочих дней - 15, это задается в графике работы. А табелем регистрируется количество фактически отработанных дней сотрудником.

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

Означает: 18 750 / 15 = 1250 - размер дневной ставки. По табелю же определяем фактически отработанное время, если количество дней составит также 15, то сотрудник в результате получит полный размер оклада 18 750.

Предположим, сотрудник отработал 12 дней, 3 дня он отсутствовал по невыясненной причине.

(18 750 / 15) * 12 = 15 000 рублей получит сотрудник в конце месяца.

 

3. Заполним План видов расчета. ОсновныеНачисления:

Использует период действия: Истина.

Зависимость от базы: Зависит по периоду действия.

Базовые планы видов расчета: Основные и дополнительные начисления. (Для больничного, в качестве базы выступает сумма всех начислений сотрудника за 3 предыдущих месяца. В качестве данных начислений выступает Оклад, Премия и предыдущие Больничные, поэтому делить мы будем не на фактически отработанные дни сотрудником из табеля, а на количество дней по графику). 

Добавим предопределенные начисления: Оклад (для Оклада на закладке Вытесняющие укажите Больничный), Больничный (Базовые: Оклад, Больничный, Премия (Премия - Дополнительное начисление)).

На закладке Ведущие подразумеваются те начисления, перерасчет которых должен влекти за собой перерасчет и Больничного, рассчитанного на основании данных начислений. То есть, если вы рассчитали Оклад. Далее на основании Оклада рассчитали Больничный и провели документ. То, после внесения корректировок в Оклад, необходимо перерасчитать и Больничный.

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

 

4. Заполним План видов расчета: ДополнительныеНачисления:

Использует период действия: Истина.

Зависимость от базы: Зависит по периоду действия.

Базовые планы видов расчета: Основные начисления.

Предопределенное начисление: Премия, его базовое начисление - Оклад.

 

5. Заполним регистр расчета: ОсновныеНачисления.

 

 

6. Заполним регистр расчета: ДополнительныеНачисления.

 

7. Документ "Начисление зарплаты".

 


Процедура ОбработкаПроведения(Отказ, Режим)
	
	Движения.ОсновныеНачисления.Очистить();
	Для Каждого ТекСтрокаОсновныеНачисления Из ОсновныеНачисления Цикл
		Движение = Движения.ОсновныеНачисления.Добавить();
		Движение.Сторно = Ложь;
		Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета;
		Движение.ПериодДействияНачало = ТекСтрокаОсновныеНачисления.ДатаНачала;
		Движение.ПериодДействияКонец = ТекСтрокаОсновныеНачисления.ДатаОкончания; 		
		Если ТекСтрокаОсновныеНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Больничный Тогда				Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(ТекСтрокаОсновныеНачисления.ДатаНачала,-3));
			Движение.БазовыйПериодКонец = КонецМесяца(ДобавитьМесяц(ТекСтрокаОсновныеНачисления.ДатаНачала,-1));			
		КонецЕсли;	 		
		Движение.ПериодРегистрации = НачалоМесяца(Дата);
		Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник;
		Движение.Подразделение = ТекСтрокаОсновныеНачисления.Подразделение;
		Движение.ГрафикРаботы = ТекСтрокаОсновныеНачисления.ГрафикРаботы;
	КонецЦикла;

	Движения.ДополнительныеНачисления.Очистить();
	Для Каждого ТекСтрокаДополнительныеНачисления Из ДополнительныеНачисления Цикл
		Движение = Движения.ДополнительныеНачисления.Добавить();
		Движение.Сторно = Ложь;
		Движение.ВидРасчета = ТекСтрокаДополнительныеНачисления.ВидРасчета;
		Движение.ПериодДействияНачало = ТекСтрокаДополнительныеНачисления.ДатаНачала;
		Движение.ПериодДействияКонец = ТекСтрокаДополнительныеНачисления.ДатаОкончания;
		Движение.ПериодРегистрации = НачалоМесяца(Дата);
		Движение.Сотрудник = ТекСтрокаДополнительныеНачисления.Сотрудник;
		Движение.Подразделение = ТекСтрокаДополнительныеНачисления.Подразделение;
		Движение.РазмерПроцента = ТекСтрокаДополнительныеНачисления.РазмерПроцента;		
		Если ТекСтрокаДополнительныеНачисления.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Премия Тогда
			Движение.БазовыйПериодНачало = НачалоМесяца(ТекСтрокаДополнительныеНачисления.ДатаНачала);
			Движение.БазовыйПериодКонец = КонецМесяца(ТекСтрокаДополнительныеНачисления.ДатаНачала); 
		КонецЕсли;  		
	КонецЦикла; 
	
	// для сторно записей, в случае когда Больничный вытесняет Оклад
	ТаблицаДополнений = Движения.ОсновныеНачисления.ПолучитьДополнение();
	Для каждого ЗаписьСторно из ТаблицаДополнений Цикл
		Движение = Движения.ОсновныеНачисления.Добавить();
		ЗаполнитьЗначенияСвойств(Движение, ЗаписьСторно);
		Движение.ПериодРегистрации = ЗаписьСторно.ПериодРегистрацииСторно;
		Движение.ПериодДействияНачало = ЗаписьСторно.ПериодДействияНачалоСторно;
		Движение.ПериодДействияКонец = ЗаписьСторно.ПериодДействияКонецСторно;
		Движение.Сторно = Истина;
	КонецЦикла; 
	
	Движения.ОсновныеНачисления.Записать();
	Движения.ДополнительныеНачисления.Записать();
	
	// общий модуль
	Расчеты.Рассчитать(Ссылка); 
	
КонецПроцедуры

 

8. Общий модуль "Расчеты".

 

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

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

 

Результат работы:

 

14

Скачать файлы

Наименование Файл Версия Размер
Пример решения расчетной задачи с табелем (для 1С:Специалист).:
.dt 216,11Kb
25.01.18
5
.dt 1.0 216,11Kb 5 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. DrAku1a 1302 26.01.18 02:48 Сейчас в теме
Код в модуле объекта документа "Табель":
Зачем записывать нулевое значение отработанных дней?
Оставьте свое сообщение