Вывод предыдущего графика работ при кадровом переводе списком

1. AndrewUs 11 26.05.23 09:54 Сейчас в теме
Добрый день!
Конфигурация ERP 2.5/

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

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


Вся проблема в строке
СтруктураГрафиковРабот = РегистрыСведений.ГрафикРаботыСотрудников.ПолучитьПоследнее(ДанныеДетальныхЗаписей.РаботаДатаНачалаПеревода - 1, Новый Структура("Сотрудник, ГоловнаяОрганизация", ДанныеДетальныхЗаписей.РаботаСотрудник, ДанныеДетальныхЗаписей.РаботаОрганизацияПрежняя));


Подскажите, пожалуйста, как можно выбрать из РС "ГрафикРаботыСотрудников" график, не учитывая строки, где заполнено значение ДействуетДо?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Vitaly1C8 26.05.23 10:11 Сейчас в теме
(1) Покажите запрос. Проверьте, в запросе записи должны быть сгруппированы/отсортированы по Дате
6. AndrewUs 11 26.05.23 11:48 Сейчас в теме
(4)Полная процедура формирования

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

			
			СписокУмещаемыхОбластей = Новый Массив;
			СписокУмещаемыхОбластей.Добавить(ОбластьСтроки);
			СписокУмещаемыхОбластей.Добавить(ОбластьПодвал);
			
			Если НЕ ДокументРезультат.ПроверитьВывод(СписокУмещаемыхОбластей) Тогда
				
				ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
				ДокументРезультат.Вывести(ОбластьШапкиТаблицы);
				
			КонецЕсли;
			
			ДокументРезультат.Вывести(ОбластьСтроки);
			
		КонецЦикла;
		
		ДокументРезультат.Вывести(ОбластьПодвал);
		
		Если ОбъектыПечати <> Неопределено Тогда
			УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ДокументРезультат, ПерваяСтрокаПечатнойФормы, ОбъектыПечати, ДанныеСсылок.СсылкаНаОбъект);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры
Показать
2. AndrewUs 11 26.05.23 09:57 Сейчас в теме
Так выглядит регистр по одному из сотрудников и так заполняется кадровый перевод в поле предыдущий график работы
Прикрепленные файлы:
3. AndrewUs 11 26.05.23 09:59 Сейчас в теме
Цикл находится в модуле объекта
5. laperuz 46 26.05.23 10:56 Сейчас в теме
Как-то так

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


Это, естественно, вне цикла, в цикле поиск по итоговой таблице значений по сотруднику.
7. AndrewUs 11 26.05.23 15:58 Сейчас в теме
Вопрос решён. Спасибо.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот