Управленческая зарплата в BAS ERP 2.1 для Украины

Задача: реализовать механизм управленческой зарплаты (только оклад) в BAS ERP для Украины 2.1

Для проведения операций только по упр. учету, в конфигурации 1С BAS ERP присутствует предопределенная организация "Управленческая организация". Это полноценная организация в которую можно принять сотрудника, но механизм управленческих начислений не реализован.

После анализа конфигурации самым простым вариантом был выбран план:

  1. Создаем показатель расчета Начислено (по регл. учету)
  2. Создаем начисления Упр. оклад по дням на базе оклада по дням, где в формуле начисления уменьшаем сумму оклада на сумма показателя Начислено (по регл. учету)
  3. Показатель Начислено (по регл. учету) вычисляем программно на основании данных регистра накопления НачисленияУдержанияПоСотрудникам в процедуре РасчетЗарплатыРасширенныйПереопределяемый.ЗаполнитьЗначенияДополнительныхПоказателей
  4. Данные о видах начислений, суммы которых необходимо поместить в показатель расчета Начислено (по регл. учету) будем брать из базовых видов расчета для начисления Упр. оклад по дням

1. Добавляем показатель расчета

Добавляем показатель расчета Начислено (по регл. учету)

Создаем показатель "Начислено (по регл. учету)"

2. Добавляем начисление

Добавляем начисление, которое в дальнейшем будет указано для сотрудника в управленческой организации.Самым простым вариантом будет скопировать его с начисления "Оклад по дням". Однако, необходимо указать что НДФЛ он не облагается и в ЕСВ не учитывается.

НДФЛ и ЕСВ для нового начисления

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

(Оклад * ДоляНеполногоРабочегоВремени * ВремяВДнях / НормаДней) - НачисленоПоРеглУчету + ?(РасчетнаяБаза = 0, РасчетнаяБаза, 0)

Добавляем базовые виды расчета:

Добавляем базовые начисления

3. Вычисления показателя расчета Начислено (по регл. учету)

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

// Процедура предназначена для заполнения значений показателей, 
// которые не удалось выявить по источникам данных подсистемы «Расчет зарплаты».
//
// Параметры:
//	ДополнительныеПоказатели - таблица значений с колонками:
//		Сотрудник
//		Подразделение
//		ДатаНачала
//		ДатаОкончания
//		Начисление
//		ВремяВЧасах
//		Показатель
//		Значение
//		КомандаРасшифровки - строка, если заполнена отображается в табличной части 
//								под значением показателя.
//		ЗначениеОпределено - булево, признак того, что значение выявлено.
//
Процедура ЗаполнитьЗначенияДополнительныхПоказателей(ДополнительныеПоказатели) Экспорт
	//для того чтобы использовать ТЗ в запросе - должны быть типизированные колонки
	времТЗ =  Новый ТаблицаЗначений;
	времТЗ.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
	времТЗ.Колонки.Добавить("ДатаНачала", ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты.ДатаВремя));
	времТЗ.Колонки.Добавить("ДатаОкончания", ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты.ДатаВремя));
	времТЗ.Колонки.Добавить("Начисление", Новый ОписаниеТипов("ПланВидовРасчетаСсылка.Начисления"));
	времТЗ.Колонки.Добавить("Показатель", Новый ОписаниеТипов("СправочникСсылка.ПоказателиРасчетаЗарплаты"));
	времТЗ.Колонки.Добавить("ИндексСтроки", ОбщегоНазначения.ОписаниеТипаЧисло(10));

	Для Каждого дпСтрока из ДополнительныеПоказатели Цикл
		времСтрока = времТЗ.Добавить();
		ЗаполнитьЗначенияСвойств(времСтрока, дпСтрока);
		времСтрока.ИндексСтроки = ДополнительныеПоказатели.Индекс(дпСтрока);
	КонецЦикла;

	брЗапрос = Новый Запрос;
	брЗапрос.Текст = "
		|ВЫБРАТЬ
		|	ДополнительныеПараметры.Сотрудник,
		|	ДополнительныеПараметры.ДатаНачала,
		|	ДополнительныеПараметры.ДатаОкончания,
		|	ДополнительныеПараметры.Начисление,
		|	ДополнительныеПараметры.Показатель,
		|	ДополнительныеПараметры.ИндексСтроки	
		|ПОМЕСТИТЬ темп
		|ИЗ
		|	&ДополнительныеПараметры КАК ДополнительныеПараметры
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	темп.Сотрудник,
		|	темп.ДатаНачала,
		|	темп.ДатаОкончания,
		|	темп.Начисление,
		|	темп.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо,
		|	темп.Начисление.ВидВремени КАК ВидВремени,
		|	темп.Показатель,
		|	темп.Показатель.Идентификатор КАК Идентификатор,		
		|	темп.ИндексСтроки
		|ИЗ
		|	темп КАК темп
		|ГДЕ темп.Показатель.Идентификатор = ""НачисленоПоРеглУчету""";
	брЗапрос.УстановитьПараметр("ДополнительныеПараметры", времТЗ);
	брРезультат = брЗапрос.Выполнить();

	брВыборка = брРезультат.Выбрать();
	Пока брВыборка.Следующий() Цикл
		
		НачисленоСотруднику = ВычислитьПоказательНачисленоПоРеглУчету(брВыборка, ДополнительныеПоказатели);
		
		Если НачисленоСотруднику > 0 Тогда
			стр =  ДополнительныеПоказатели[брВыборка.ИндексСтроки];
			Сообщить(НачисленоСотруднику);
			стр.ЗначениеОпределено = Истина;
			стр.Значение = НачисленоСотруднику;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры


// Функция - Вычисляет сумму начисленную сотруднику по регл учету
//
//
// Параметры:
//  Выборка	 - ВыборкаИзРезультатаЗапроса	 - 
// 
// Возвращаемое значение:
//   - 
//
Функция ВычислитьПоказательНачисленоПоРеглУчету(Выборка, ДополнительныеПоказатели = Неопределено)
	НачисленоСотруднику = 0;
	
	Сотрудник = Выборка.Сотрудник;
	ВидРасчета = Выборка.Начисление;
	НачалоПериода = Выборка.ДатаНачала;
	КонецПериода = Выборка.ДатаОкончания;

	//Аванс
	Если Выборка.ВидВремени = Перечисления.ВидыРабочегоВремениСотрудников.ОтработанноеВПределахНормы И
		День(КонецПериода) = 15 Тогда
		
		НазваниеРН = "НачисленияУдержанияПоСотрудникамАвансом";
	Иначе
		НазваниеРН = "НачисленияУдержанияПоСотрудникам";
	КонецЕсли;

	//Получаем сотрудников по этому физлицу
	ПараметрыСоздания = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
	ПараметрыСоздания.СписокФизическихЛиц = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Выборка.ФизическоеЛицо);

	//Организация <>  Справочники.Организации.УправленческаяОрганизация
	ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
		ПараметрыСоздания.Отборы, 
		"ГоловнаяОрганизация", 
		"<>", 
		Справочники.Организации.УправленческаяОрганизация
	);

	ТЗ = КадровыйУчет.СотрудникиОрганизации(Ложь, ПараметрыСоздания);

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

	Возврат НачисленоСотруднику;

КонецФункции

4. Тестируем решение

После внесения изменений в демо-базу ERP примем сотрудника Спасов Артур Олегович в управленческую организацию с окладом 10 000 грн.

Принимаем сотрудника на работу в упр. организацию

Делаем начисление ему зарплаты за Декабрь 2017 по основному месту работы (ООО "Добро"). Начислено 3200 грн:

5.png

Далее создаем документ Начисление зарплаты за Декабрь 2017 в управленческой организации:

6.png

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


Похожие материалы

Комментарии