Если в ЗУП в формуле начисления требуется показатель - средний заработок (как для отпуска)

09.02.24

Задачи пользователя - Адаптация типовых решений

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

Здравствуйте.

Мне потребовался такой показатель для начисления - средний заработок (за 12 месяцев), который используется, например, для расчета отпуска.

Как решалась данная задача:

1. Создаем новое начисление (или меняем существующее) - в моем случае это "Единовременная выплата к отпуску"

2. Создаем новый показатель - СреднийДоходДляОтпуска

 

 

и сохраняем

3. Далее, в созданном начислении прописываем необходимую формулу:

 

 

4. Создаем новый шаблон ввода исходных данных: Настройка - Шаблоны ввода исходных данных.

 

 

5. Теперь, используя Зарплата - Данные для расчета зарплаты, можно создать документы, заполнить...

 

Вторая часть:

Как обеспечить автоматическое создание и заполнение документов, шаблон для которых мы подготовили?

Идея была такая: получить средний заработок и, используя внешнюю обработку, создавать или перезаполнять документы Зарплата - Данные для расчета зарплаты 1 раз в месяц, используя механизм ЗУП Администрирование - Печатные формы, отчеты и обработки - Дополнительные отчеты и обработки. 

Делаем...

1. В конфигураторе создаем новую внешнюю обработку

2. Создаем форму - она нам понадобится, чтобы иметь возможность запускать обработку вручную.

 

 

В модуле формы:

&НаКлиенте
Процедура КомандаВыполнить(Команда)
	ВыполнитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьНаСервере()
	ДокументОбъект = РеквизитФормыВЗначение("Объект");
	ДокументОбъект.ЗаписатьВШаблон();	
КонецПроцедуры

3. Теперь кодим в модуле объекта внешней обработки.

Первое, что необходимо сделать, это создать служебную функцию СведенияОВнешнейОбработке(), которая будет содержать, собственно, сведения о внешней обработке

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

 

Следующим шагом будет создание функции ВыполнитьКоманду(), которая будет запускать код получения среднего и записи в документ.

Функция ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыКоманды) Экспорт
	
	Если ИдентификаторКоманды = "Старт" Тогда
		ЗаписатьВШаблон();
	КонецЕсли;
	
КонецФункции

 

Ну и самое главное - получение среднего:

&НаСервере
Функция ЗапросСреднегоРасширенный(Сотрудник, _ДатаНачалаСобытия, _НачалоПериода, _ОкончаниеПериода, _ПоЧасам = Ложь, _ПоСтатьямФинансирования = Ложь, _СпособРасчетаОтпуска)
	ДополнительныеПараметрыРасчетаСреднегоЗаработка = УчетСреднегоЗаработкаКлиентСервер.ДополнительныеПараметрыРасчетаСреднегоЗаработка();
	ДополнительныеПараметрыРасчетаСреднегоЗаработка.НачалоПериода = _НачалоПериода;
	ДополнительныеПараметрыРасчетаСреднегоЗаработка.ОкончаниеПериода = _ОкончаниеПериода;
	ДополнительныеПараметрыРасчетаСреднегоЗаработка.ПоЧасам = _ПоЧасам;
	ДополнительныеПараметрыРасчетаСреднегоЗаработка.ПоСтатьямФинансирования = _ПоСтатьямФинансирования;
	ДополнительныеПараметрыРасчетаСреднегоЗаработка.СпособРасчетаОтпуска = _СпособРасчетаОтпуска;
	Возврат УчетСреднегоЗаработка.СреднийЗаработок(Сотрудник, _ДатаНачалаСобытия,ДополнительныеПараметрыРасчетаСреднегоЗаработка);
КонецФункции

 

Запись в документ/обновление документа:

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

 

Обратите внимание на начало процедуры ЗаписатьВШаблон - требуется указать наименование организации, документов и.т.д 

В завершение необходимо добавить данную обработку и настроить автозапуск.

Идем в Администрирование - Печатные формы, отчеты и обработки - Дополнительные отчеты и обработки.

С помощью кнопки Добавить из файла добавляем нашу обработку и настраиваем периодичность работы.

См. также

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    5678    14    5    

24

Логистика, склад и ТМЦ Адаптация типовых решений Пользователь Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3926    11    0    

29

Адаптация типовых решений Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Каждый из нас сталкивается с ситуацией, когда какой-нибудь менеджер показывает свой Excel и рассказывает, как он что-то из 1С копирует в него, снабжает пояснениями, выделяет цветом и т.д. и т.п. Заканчивается все просьбой сделать вот чтобы также было в 1С. И оказывается такой человек (почти с гарантией) либо лучшим продажником, либо каким-то важным, за все отвечающим, - на ком все держится.

2 стартмани

22.04.2024    5105    dimanich70    15    

21

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    5572    dimanich70    9    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 1904 12.02.24 10:09 Сейчас в теме
Можно использовать типовой показатель СреднийЗаработокОбщий безо всяких танцев с бубном
Прикрепленные файлы:
2. user1892597 13 13.02.24 10:52 Сейчас в теме
Спасибо за информацию.

Средний заработок (общий) – среднедневной или среднечасовой заработок сотрудника (в зависимости от вида графика сотрудника: суммированный учет времени или нет), рассчитанный по правилам расчета среднего заработка для командировок и подобных случаев (кроме отпуска).

Это с ИТС, а мне нужен был именно как для отпуска.

Так что пришлось...танцы с бубном
3. Vinzor 107 23.02.24 17:24 Сейчас в теме
(2) Ну откуда такая уверенность, что для командировок и подобного, кроме отпуска?
Та статья в ИТС без даты, и неизвестно, каких времён: "Очакова и покорения Крыма" или "Татаро-Монгольского нашествия".

Сейчас этот показатель, СреднийЗаработокОбщий, как раз для отпусков и используется.
Загляните в сконфигурированный программой вид начисления "Отпуск"

В конце концов, воспользуйтесь показателем "СреднедневнойЗаработок".
4. user892786 27.02.24 06:57 Сейчас в теме
(3) Vinzor, Вы, к сожалению, не правы. СреднийЗаработокОбщий - только для командировок, даёт сумму примерно на 50 т. больше в сумме 300 т.р., чем средний для отпуска.

Спасибо автору.
5. Vinzor 107 27.02.24 08:48 Сейчас в теме
(4) Ну то что для командировки средний идёт по рабочим дням или часам в зависимости от настроек графика, а для отпуска - по календарным дням. Здесь да, разница есть.

Я вообще другое имел в виду. В начислениях, что для отпуска, что для командировок, применяется один предопределенный показатель "СреднийЗаработокОбщий", который рассчитывается программой нужным образом в зависимости от того, для чего он считается.
И если он у вас рассчитывается не так, как надо, то скорее всего причина в кривых данных базы или настройках.
Оставьте свое сообщение