Получить подразделения для списка сотрудников на разные даты. ЗУП 3.1

1. mike40 01.03.24 11:59 Сейчас в теме
Коллеги, доброго дня!

Есть таблица со списком сотрудников и дат, такого вида:

11.05.2022 18:13:39 Иванов Иван Иванович
25.01.2023 21:56:50 Иванов Иван Иванович
09.02.2024 18:55:44 Иванов Иван Иванович
22.02.2024 22:49:28 Иванов Иван Иванович
25.01.2024 21:56:50 Петров Петр Петрович
25.01.2024 21:56:41 Петров Петр Петрович
09.02.2024 18:55:44 Петров Петр Петрович
26.02.2024 23:16:27 Петров Петр Петрович
25.01.2024 21:56:50 Сидоров Сидор Сидорович
09.02.2024 18:55:44 Сидоров Сидор Сидорович
22.02.2024 22:49:26 Сидоров Сидор Сидорович

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

Спасибо!
По теме из базы знаний
Найденные решения
10. Vinzor 91 02.03.24 17:29 Сейчас в теме
(1) Вот так, простым запросом. Попробуйте, вам понравится ))
ВЫБРАТЬ
	ВходящаяТаблица.Сотрудник КАК Сотрудник,
	ВходящаяТаблица.Период КАК Период
ПОМЕСТИТЬ ВТ_ВходящаяТаблица
ИЗ
	&ВходящаяТаблица КАК ВходящаяТаблица
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ВходящаяТаблица.Сотрудник КАК Сотрудник,
	ВТ_ВходящаяТаблица.Период КАК Период,
	КадроваяИсторияСотрудниковИнтервальный.Подразделение КАК Подразделение
ИЗ
	ВТ_ВходящаяТаблица КАК ВТ_ВходящаяТаблица
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный
		ПО (ВТ_ВходящаяТаблица.Сотрудник = КадроваяИсторияСотрудниковИнтервальный.Сотрудник
				И КадроваяИсторияСотрудниковИнтервальный.ДатаНачала <= ВТ_ВходящаяТаблица.Период
				И КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания >= ВТ_ВходящаяТаблица.Период)
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. Vladimir-R 167 01.03.24 13:56 Сейчас в теме
(1) Когда для каждого документа на разные даты нужно получать отдельную кадровую информацию. Так как в цикле запросы выполнять не хорошо, то нужно сформировать один запрос сразу для всех документов. Для этого можно использовать функции ЗапросВТКадровыеДанныеФизическихЛиц и ЗапросВТКадровыеДанныеСотрудников все из того же общего модуля КадровыйУчет.

Для примера используем все того же сотрудника Борового Дмитрия Валентиновича и его таблицу изменения ФИО.

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

МенеджерВТ = Новый МенеджерВременныхТаблиц;

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ
               |	&ФизическоеЛицо КАК ФизическоеЛицо,
               |	ДАТАВРЕМЯ(2018, 1, 1) КАК Период
               |ПОМЕСТИТЬ ВТФизическиеЛица
               |
               |ОБЪЕДИНИТЬ ВСЕ
               |
               |ВЫБРАТЬ
               |	&ФизическоеЛицо,
               |	ДАТАВРЕМЯ(2019, 12, 2)
               |
               |ОБЪЕДИНИТЬ ВСЕ
               |
               |ВЫБРАТЬ
               |	&ФизическоеЛицо,
               |	ДАТАВРЕМЯ(2020, 1, 2)";

Запрос.УстановитьПараметр("ФизическоеЛицо", ФизическоеЛицо);

Запрос.Выполнить();
Показать

Во временной таблице будет три строки с разными датами.

Далее формируем описание нашей временной таблицы с физическими лицами:

ОписательВременнойТаблицыФизЛиц = КадровыйУчет.ОписаниеВременнойТаблицыОтборовФизическихЛиц("ВТФизическиеЛица");
Если колонка, содержащая ссылки на физические лица, будет называться не ФизическоеЛицо, необходимо указать это в функции ОписаниеВременнойТаблицыОтборовФизическихЛиц в параметре ИмяПоляФизическоеЛицо. Это же касается и колонки, содержащей даты, по умолчанию она должна называться Период.

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

ПоляОтбораПериодическихДанных = Неопределено;

Запрос = КадровыйУчет.ЗапросВТКадровыеДанныеФизическихЛиц(Истина, ОписательВременнойТаблицыФизЛиц, "Фамилия, Имя, Отчество", ПоляОтбораПериодическихДанных);

Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

Запрос.Выполнить();
Ну и в конце мы можем использовать эту временную таблицу. В данном примере мы просто выведем ее в таблицу значений.

Запрос.Текст = "ВЫБРАТЬ
               |	ВТКадровыеДанныеФизическихЛиц.ФизическоеЛицо КАК ФизическоеЛицо,
               |	ВТКадровыеДанныеФизическихЛиц.Период КАК Период,
               |	ВТКадровыеДанныеФизическихЛиц.Фамилия КАК Фамилия,
               |	ВТКадровыеДанныеФизическихЛиц.Имя КАК Имя,
               |	ВТКадровыеДанныеФизическихЛиц.Отчество КАК Отчество
               |ИЗ
               |	ВТКадровыеДанныеФизическихЛиц КАК ВТКадровыеДанныеФизическихЛиц";

КадровыеДанные = Запрос.Выполнить().Выгрузить();
Показать
6. Said-We 01.03.24 14:56 Сейчас в теме
(1)
на каждую дату найти
А где эти каждые даты? Это ещё одна таблица?
7. mike40 01.03.24 14:57 Сейчас в теме
(6) Таблица одна:

11.05.2022 18:13:39 Иванов Иван Иванович
25.01.2023 21:56:50 Иванов Иван Иванович
09.02.2024 18:55:44 Иванов Иван Иванович
22.02.2024 22:49:28 Иванов Иван Иванович
25.01.2024 21:56:50 Петров Петр Петрович
25.01.2024 21:56:41 Петров Петр Петрович
09.02.2024 18:55:44 Петров Петр Петрович
26.02.2024 23:16:27 Петров Петр Петрович
25.01.2024 21:56:50 Сидоров Сидор Сидорович
09.02.2024 18:55:44 Сидоров Сидор Сидорович
22.02.2024 22:49:26 Сидоров Сидор Сидорович
10. Vinzor 91 02.03.24 17:29 Сейчас в теме
(1) Вот так, простым запросом. Попробуйте, вам понравится ))
ВЫБРАТЬ
	ВходящаяТаблица.Сотрудник КАК Сотрудник,
	ВходящаяТаблица.Период КАК Период
ПОМЕСТИТЬ ВТ_ВходящаяТаблица
ИЗ
	&ВходящаяТаблица КАК ВходящаяТаблица
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ВходящаяТаблица.Сотрудник КАК Сотрудник,
	ВТ_ВходящаяТаблица.Период КАК Период,
	КадроваяИсторияСотрудниковИнтервальный.Подразделение КАК Подразделение
ИЗ
	ВТ_ВходящаяТаблица КАК ВТ_ВходящаяТаблица
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный
		ПО (ВТ_ВходящаяТаблица.Сотрудник = КадроваяИсторияСотрудниковИнтервальный.Сотрудник
				И КадроваяИсторияСотрудниковИнтервальный.ДатаНачала <= ВТ_ВходящаяТаблица.Период
				И КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания >= ВТ_ВходящаяТаблица.Период)
Показать
11. mike40 05.03.24 10:09 Сейчас в теме
Всем спасибо за ответы!
(10) действительно, простой запрос, помогли!
2. starjevschik 01.03.24 12:08 Сейчас в теме
ну а чем плохо перебирать.
Можно еще запрос написать, но насколько это лучше - вопрос не такой уж очевидный.
3. mike40 01.03.24 12:10 Сейчас в теме
(2) если на каждой итерации цикла вызывать функцию КадровыйУчет.КадровыеДанныеСотрудника(), то получается запрос в цикле
4. starjevschik 01.03.24 13:29 Сейчас в теме
(3) и что? результат получается как нужно в приемлемые сроки? значит, задача решена.
8. Said-We 01.03.24 15:03 Сейчас в теме
(7) Стандартная задача. В 1С решается поиском ближайшей даты изменения подразделения и взятием на эту дату значения подразделения. Макс(датаИзмененияПодразделения) где датаИзмененияПодразделения<ДатаХ.
Либо коррелированный запрос "В (Выбрать первые 1...".
В SQL обычно проще
sel ect
      ДатаХ как ДатаХ,
      Сотрудник как Сотрудник,
      (select TOP 1 Подразделение FR OM КадроваяИстория WH ERE ... Order by...) как Подразделение
 FR OM...
9. VmvLer 01.03.24 15:30 Сейчас в теме
примерно так

        // в этой точке уже должен быть определен запрос и ВТПериодыСотрудников

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



в КадровыеДанные вставьте подразделения и еще поля какие нужны из методов

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


далее достаете ВТСотрудникиКадровыеДанные из МВТ
Оставьте свое сообщение

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