Автоматический расчет стажа для ЗУП 3.0 на основании таблицы Места работы

07.06.16

Учетные задачи - Зарплата

Часто кадровики просят сделать доработку - рассчитывать данные о стаже на основании данных таблицы "Места работы" раздела Трудовая деятельность. Создание такой доработки описано в данной статье.
В результате в форме ввода стажа появится кнопка "Заполнить по данным Места работы", которая рассчитает стаж из таблицы мест работы автоматически на дату приема или на дату, которую введет пользователь.

Для реализации этой доработки нужно всего-навсего добавить несколько процедур в модуль общей формы, итак:

Общая форма "Ввод стажа сотрудников", модуль формы.

1 Изменяем процедуру:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
..................
ДополнитьФорму();
//АВТО РАСЧЕТ СТАЖА + 
РазместитьДополнительныеЭлементыНаФорму();
//АВТО РАСЧЕТ СТАЖА -
ЗаполнитьДанныеОСтаже(Параметры.ДанныеСтажей);
..............................
КонецПроцедуры 

2 Добавляем процедуры

//АВТО РАСЧЕТ СТАЖА +
&НаСервере     
Процедура РазместитьДополнительныеЭлементыНаФорму()
	
	Кнопка = Элементы.Добавить("АвтоРасчетСтажа", Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель);
	Кнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;	
	Команда = Команды.Добавить("РассчитатьСтажПоДаннымПредМестРаботы");
	Команда.Действие = "РассчитатьСтажПоДаннымПредМестРаботы";
	Команда.Отображение = ОтображениеКнопки.Текст;
	Команда.Заголовок = "Заполнить по данным Места работы"; 
	Кнопка.ИмяКоманды = "РассчитатьСтажПоДаннымПредМестРаботы";	
	
	МассивДобавляемыхРеквизитов = Новый Массив;
	МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ТаблицаСведенийОСтаже", новый ОписаниеТипов("таблицаЗначений")));
	МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ДатаНачала", новый ОписаниеТипов("Дата"),"ТаблицаСведенийОСтаже"));
	МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ДатаОкончания", новый ОписаниеТипов("Дата"),"ТаблицаСведенийОСтаже"));  	
	ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); 
	
	УстановитьДействие("ПриОткрытии","ПриОткрытии");
	
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьСтажПоДаннымПредМестРаботы(Команда)
	
	Если ЭтаФорма.ТаблицаСведенийОСтаже.Количество() = 0 Тогда
		Сообщить("Данные о трудовой деятельности не заполнены");
		Возврат;
	КонецЕсли;
	
	ЭтаФорма.СпособИсчисленияСтажа1  = 0;
	
	Если ЭтаФорма.ДатаОтсчета1 = Дата(1,1,1) Тогда
		Если ЭтаФорма.ДатаПриема1 = Дата(1,1,1) Тогда
			ЭтаФорма.ДатаОтсчета1 = ТекущаяДата();
		Иначе
			ЭтаФорма.ДатаОтсчета1 = ЭтаФорма.ДатаПриема1;
		КонецЕсли;
	КонецЕсли; 
	
	ИтогСтажДатаОтсчёта = ЭтаФорма.ДатаОтсчета1;
		
	РассчитатьСтажПоДаннымПредМестРаботыНаСервере(ИтогСтажДатаОтсчёта);    
	
	Модифицированность = Истина;
	
КонецПроцедуры

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

Процедура ПолучитьТаблицуИтоговСтажаПоСотруднику(ЗаписиОСтаже, РасчётСтажДатаОтсчёта, РасчётЛет=0, РасчётМесяцев=0, РасчётДней =0);
    ДлинаСуток = 86400;
	
	ТаблицаЗаписейОСтаже = ЗаписиОСтаже.Скопировать();
    //РАСЧЕТ ОБЩЕГО ТРУДОВОГО СТАЖА С УЧЕТОМ ПЕРЕСЕЧЕНИЯ ПЕРИОДОВ

	//Выполним календарное поглащение:
	ВсегоЗаписей = ТаблицаЗаписейОСтаже.Количество(); 
	Для Н = 0 по ВсегоЗаписей - 1 Цикл
		Запись = ТаблицаЗаписейОСтаже[Н];

		Для К = 0 по ВсегоЗаписей - 1 Цикл
			Запись2 = ТаблицаЗаписейОСтаже[К];

			Если Запись = Запись2 Тогда//Запись не может поглатить саму себя
				Продолжить;
			КонецЕсли;	 
			
			Если (Запись2.ДатаНачала > Запись.ДатаОкончания) или
				(Запись2.ДатаОкончания < Запись.ДатаНачала)Тогда
				//Периоды не пересекаются
				Продолжить;
			Иначе	
				Если (Запись2.ДатаНачала >= Запись.ДатаНачала) Тогда
					Если (Запись2.ДатаОкончания <= Запись.ДатаОкончания) Тогда
						//Полное поглощение периода - удаляем запись2 с помощью задания отрицательного интервала
						Запись2.ДатаНачала = Дата('00010102');
						Запись2.ДатаОкончания = Дата('00010101');
					Иначе//Запись 2 начинается позднее и оканчивается позднее записи 1 - обрежем голову
						Запись2.ДатаНачала = Запись.ДатаОкончания + ДлинаСуток;
					КонецЕсли;	
				Иначе
					Если (Запись2.ДатаОкончания <= Запись.ДатаОкончания) Тогда
						//Запись2 начинается раньше и оканчивается раньше Записи1 - обрежем хвост
						Запись2.ДатаОкончания = Запись.ДатаНачала - ДлинаСуток;
					Иначе//Запись 2 начинается раньше и оканчивается позднее записи 1 - разбиение интервала на 2 части
						//породим вторую часть копирование исходной записи
						НоваяСтрока = ТаблицаЗаписейОСтаже.Добавить();
						ЗаполнитьЗначенияСвойств(НоваяСтрока, Запись2);
						//обрежем хвост у первой части
						Запись2.ДатаОкончания = Запись.ДатаНачала - ДлинаСуток;
						//обрежем голову у второй части
						НоваяСтрока.ДатаНачала = Запись.ДатаОкончания + ДлинаСуток;
					КонецЕсли;	
				КонецЕсли;	 
			КонецЕсли;	 
		КонецЦикла;	  
	КонецЦикла;	
	
	//если дата отсчета меньше даты окончания данных о стаже - скорректируем таблицу
	УдалитьПоследующиеЗаписи = Ложь;
	МассивКУдалению = Новый Массив;
	Для Каждого Запись из ТаблицаЗаписейОСтаже Цикл
		Если УдалитьПоследующиеЗаписи Тогда
			МассивКУдалению.Добавить(Запись);
		Иначе		
			Если Запись.ДатаНачала >= РасчётСтажДатаОтсчёта Тогда
				МассивКУдалению.Добавить(Запись);
				УдалитьПоследующиеЗаписи = Истина;
			ИначеЕсли Запись.ДатаОкончания >= РасчётСтажДатаОтсчёта Тогда
				Запись.ДатаОкончания = РасчётСтажДатаОтсчёта - 24*60*60;
				УдалитьПоследующиеЗаписи = Истина;
			КонецЕсли;    				
		КонецЕсли;
	КонецЦикла;	  	
	Для Каждого Элемент Из МассивКУдалению Цикл
		ТаблицаЗаписейОСтаже.Удалить(Элемент);
	КонецЦикла;   		
	
	//Расчет общего стажа по оставшимся записям
	ОбщийСтажДатаОтсчёта		=	Дата('00010101');
	ОбщийСтажЛет				=	0;
	ОбщийСтажМесяцев			=	0;
	ОбщийСтажДней				=	0;

	Для Каждого Запись из ТаблицаЗаписейОСтаже Цикл

		//Пропустим поглощенные и дополнительные записи
		Если  Запись.ДатаОкончания = Дата('00010101') Тогда
			Продолжить;
		КонецЕсли;	
		
		ЛетПоПериоду = 0;
		МесяцевПоПериоду = 0;
		ДнейПоПериоду = 0;
		ПерсонифицированныйУчет.ПолучитьСтажЗаПериод(Запись.ДатаОкончания,	Запись.ДатаНачала, ЛетПоПериоду,	МесяцевПоПериоду, ДнейПоПериоду);

		ОбщийСтажДатаОтсчёта	= Запись.ДатаОкончания; 
		ОбщийСтажЛет			=	ОбщийСтажЛет		+	ЛетПоПериоду;
		ОбщийСтажМесяцев		=	ОбщийСтажМесяцев	+	МесяцевПоПериоду;
		ОбщийСтажДней			=	ОбщийСтажДней		+	ДнейПоПериоду;
	КонецЦикла;	
	
	//Заносим в таблицу итогового стажа данные об общем стаже

	ПерсонифицированныйУчет.ПолучитьПриведенныйСтаж(ОбщийСтажЛет,ОбщийСтажМесяцев,ОбщийСтажДней);
	Если ОбщийСтажЛет + ОбщийСтажМесяцев + ОбщийСтажДней <> 0 Тогда
		
		//Получаем дату приёма
		ПараметрыПолученияСотрудников = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
		ПараметрыПолученияСотрудников.СписокФизическихЛиц = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ЭтаФорма.ФизическоеЛицо);
		ПараметрыПолученияСотрудников.НачалоПериода = ТекущаяДатаСеанса();	
		ПараметрыПолученияСотрудников.ОкончаниеПериода = ТекущаяДатаСеанса();
		ПараметрыПолученияСотрудников.КадровыеДанные = "ДатаПриема";
		
		СотрудникиОрганизации = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников);
		
		ДатаПриема = Неопределено;
		Для Каждого ДанныеСотрудника Из СотрудникиОрганизации Цикл
			Если ЗначениеЗаполнено(ДанныеСотрудника.ДатаПриема) Тогда 
				Если ДатаПриема = Неопределено Тогда 
					ДатаПриема = ДанныеСотрудника.ДатаПриема;
				Иначе 
					ДатаПриема = Мин(ДатаПриема, ДанныеСотрудника.ДатаПриема);
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		
		Если Не ЗначениеЗаполнено(ДатаПриема) Тогда 
			ДатаПриема = ТекущаяДатаСеанса();
		КонецЕсли; 		
		
		ЭтаФорма.Лет1				= ОбщийСтажЛет;
		ЭтаФорма.Месяцев1			= ОбщийСтажМесяцев;
		ЭтаФорма.Дней1				= ОбщийСтажДней;
	КонецЕсли;	 
КонецПроцедуры 


&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если СтрНайти(ВладелецФормы.ИмяФормы,"ТрудоваяДеятельность") <> 0 Тогда
		Для Каждого СтрокаДанных Из ВладелецФормы.ТрудоваяДеятельностьФизическихЛиц Цикл
			Строка = ЭтаФорма.ТаблицаСведенийОСтаже.Добавить();
			Строка.ДатаНачала = СтрокаДанных.ДатаНачала;	
			Строка.ДатаОкончания = СтрокаДанных.ДатаОкончания;
		КонецЦикла;
	Иначе
		ЗаполнитьСведенияОТрудовойДеятельностиНаСервере();
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСведенияОТрудовойДеятельностиНаСервере() 
	
	НаборЗаписей = РегистрыСведений["ТрудоваяДеятельностьФизическихЛиц"].СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.ФизическоеЛицо.Значение = ЭтаФорма.ФизическоеЛицо;
	НаборЗаписей.Отбор.ФизическоеЛицо.Использование = Истина;
	
	НаборЗаписей.Прочитать();
	
	Для Каждого Запись Из НаборЗаписей Цикл
		Строка = ЭтаФорма.ТаблицаСведенийОСтаже.Добавить();
		Строка.ДатаНачала = Запись.ДатаНачала;	
		Строка.ДатаОкончания = Запись.ДатаОкончания; 		
	КонецЦикла;     
	
КонецПроцедуры
 //АВТО РАСЧЕТ СТАЖА -
 

3. PROFIT! Проверяем рекультат.

См. также

Обновление для КА 1.1, ЗУП 2.5, БУХ 2.0: НДС, ЕФС-1, Расчет страховых взносов, Мобилизация, Статистика, Электронные трудовые книжки, 2-НДФЛ, Регламентированная отчетность, Кадровый учет, Прослеживаемость импортных товаров

Зарплата Регламентированный учет и отчетность Кадровый учет Обновление 1С Платформа 1С v8.3 Сложные периодические расчеты 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Зарплата и Управление Персоналом 2.5 Бухгалтерский учет Налоговый учет Управленческий учет Акцизы ЕНВД ЕСН Земельный налог ИП, ПБОЮЛ, КФХ Налог на имущество Налог на прибыль НДС НДФЛ ФОМС, ЕФС Транспортный налог УСН ПСН (патентная система налогообложения) Платные (руб)

Обновления для конфигураций: КА 1.1; ЗУП 2.5; БУХ 2.0; КА 1.1 Комплексная автоматизация торговли алкогольной продукцией; КА 1.1 Комплексный учет сельскохозяйственного предприятия

19900 руб.

01.04.2020    140623    678    352    

232

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22450    19    1    

22

SALE! 20%

Перенос данных из Камин 3.5 (5.5) в ЗиКГУ 3.х

Обмен между базами 1C Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Обработки для быстрого перехода с конфигураций «КАМИН:Расчет зарплаты для бюджетных учреждений 3.5» и «КАМИН:Зарплата для бюджетных учреждений 5.5» на конфигурацию «Зарплата и кадры государственного учреждения».

12000 9600 руб.

28.07.2016    57085    140    139    

116

Запрет доступа к данным по зарплате для БП 3.0 и КА 2.5

Зарплата Роли и права Платформа 1С v8.3 Бухгалтерский учет Управление правами 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х Молдова Россия Казахстан Бухгалтерский учет Платные (руб)

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

5700 руб.

27.05.2021    32738    204    89    

165

Исправление в 1С:ЗУП/ЗКГУ ошибок по НДФЛ и взаиморасчетам с сотрудниками на начало расчетного года.

Корректировка данных Зарплата Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры бюджетного учреждения 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ Платные (руб)

Обработка исправляет технические ошибки по НДФЛ, взаиморасчетам с сотрудниками в 1С:ЗУП (1С:ЗКГУ) на начало года. Фактически все ошибки, которые проявляются в ведомостях на выплату, расчетных листках, при заполнении ведомостей на выплату и отчетах 6-НДФЛ и т.д. нужно начинать исправлять с начала расчетного года. Это позволит быть уверенными, что после завершения расчетов предыдущего года, начали работать с «чистого листа» без ошибочных остатков.

4800 руб.

06.10.2023    2324    29    15    

33

Устранение сальдо прошлых периодов в ведомостях ЗУП 3.1, КА, ЗиКГУ 3.1

Зарплата Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

При заполнении ведомости на выплату зарплаты вылазят задолженности прошлых периодов, которых быть не должно? Наша обработка позволяется убрать эти доходы прошлых периодов за пару секунд. Больше не нужно тратить часы на анализ каждого такого случая.

15600 руб.

14.09.2022    12596    60    22    

62

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48704    97    163    

86
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Michael0507 07.07.16 14:49 Сейчас в теме
3. pentanom 25 07.07.16 15:19 Сейчас в теме
4. Shefer 3 04.10.16 15:15 Сейчас в теме
mangy, спасибо, пригодилось. Единственное, кадровики попросили: для того, что бы у них сошлось с программкой, по которой они считают стаж, вычитать из получившегося стажа количество дней, равное количеству строк в таблице Места работы. И вручную проверяли - именно на это количество и разница.
5. пользователь 27.03.20 12:52
Сообщение было скрыто модератором.
...
Оставьте свое сообщение