Получить подразделения для списка сотрудников на разные даты. ЗУП 3.1
Коллеги, доброго дня!
Есть таблица со списком сотрудников и дат, такого вида:
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 Сидоров Сидор Сидорович
Требуется для каждого сотрудника на каждую дату найти Подразделение, в котором он работал в эту дату. Подскажите пожалуйста как это сделать правильно?
Думал в штатных функциях модуля КадровыйУчет, но кроме как в цикле перебирать строки таблицы в голову ничего не пришло.
Спасибо!
Есть таблица со списком сотрудников и дат, такого вида:
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 Сидоров Сидор Сидорович
Требуется для каждого сотрудника на каждую дату найти Подразделение, в котором он работал в эту дату. Подскажите пожалуйста как это сделать правильно?
Думал в штатных функциях модуля КадровыйУчет, но кроме как в цикле перебирать строки таблицы в голову ничего не пришло.
Спасибо!
По теме из базы знаний
Найденные решения
(1) Вот так, простым запросом. Попробуйте, вам понравится ))
ВЫБРАТЬ
ВходящаяТаблица.Сотрудник КАК Сотрудник,
ВходящаяТаблица.Период КАК Период
ПОМЕСТИТЬ ВТ_ВходящаяТаблица
ИЗ
&ВходящаяТаблица КАК ВходящаяТаблица
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_ВходящаяТаблица.Сотрудник КАК Сотрудник,
ВТ_ВходящаяТаблица.Период КАК Период,
КадроваяИсторияСотрудниковИнтервальный.Подразделение КАК Подразделение
ИЗ
ВТ_ВходящаяТаблица КАК ВТ_ВходящаяТаблица
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный
ПО (ВТ_ВходящаяТаблица.Сотрудник = КадроваяИсторияСотрудниковИнтервальный.Сотрудник
И КадроваяИсторияСотрудниковИнтервальный.ДатаНачала <= ВТ_ВходящаяТаблица.Период
И КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания >= ВТ_ВходящаяТаблица.Период)
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Когда для каждого документа на разные даты нужно получать отдельную кадровую информацию. Так как в цикле запросы выполнять не хорошо, то нужно сформировать один запрос сразу для всех документов. Для этого можно использовать функции ЗапросВТКадровыеДанныеФизическихЛиц и ЗапросВТКадровыеДанныеСотрудников все из того же общего модуля КадровыйУчет.
Для примера используем все того же сотрудника Борового Дмитрия Валентиновича и его таблицу изменения ФИО.
Чтобы продемонстрировать как работают данные функции подготовим таблицу физических лиц, которая содержит список физических лиц и дат. В нашем примере физическое лицо будет одно, но мы добавим несколько дат:
Во временной таблице будет три строки с разными датами.
Далее формируем описание нашей временной таблицы с физическими лицами:
ОписательВременнойТаблицыФизЛиц = КадровыйУчет.ОписаниеВременнойТаблицыОтборовФизическихЛиц("ВТФизическиеЛица");
Если колонка, содержащая ссылки на физические лица, будет называться не ФизическоеЛицо, необходимо указать это в функции ОписаниеВременнойТаблицыОтборовФизическихЛиц в параметре ИмяПоляФизическоеЛицо. Это же касается и колонки, содержащей даты, по умолчанию она должна называться Период.
Далее получим запрос и выполним его, чтобы сформировать временную таблицу, содержащую кадровые данные:
ПоляОтбораПериодическихДанных = Неопределено;
Запрос = КадровыйУчет.ЗапросВТКадровыеДанныеФизическихЛиц(Истина, ОписательВременнойТаблицыФизЛиц, "Фамилия, Имя, Отчество", ПоляОтбораПериодическихДанных);
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Выполнить();
Ну и в конце мы можем использовать эту временную таблицу. В данном примере мы просто выведем ее в таблицу значений.
Для примера используем все того же сотрудника Борового Дмитрия Валентиновича и его таблицу изменения ФИО.
Чтобы продемонстрировать как работают данные функции подготовим таблицу физических лиц, которая содержит список физических лиц и дат. В нашем примере физическое лицо будет одно, но мы добавим несколько дат:
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ
| &ФизическоеЛицо КАК ФизическоеЛицо,
| ДАТАВРЕМЯ(2018, 1, 1) КАК Период
|ПОМЕСТИТЬ ВТФизическиеЛица
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| &ФизическоеЛицо,
| ДАТАВРЕМЯ(2019, 12, 2)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| &ФизическоеЛицо,
| ДАТАВРЕМЯ(2020, 1, 2)";
Запрос.УстановитьПараметр("ФизическоеЛицо", ФизическоеЛицо);
Запрос.Выполнить();
ПоказатьВо временной таблице будет три строки с разными датами.
Далее формируем описание нашей временной таблицы с физическими лицами:
ОписательВременнойТаблицыФизЛиц = КадровыйУчет.ОписаниеВременнойТаблицыОтборовФизическихЛиц("ВТФизическиеЛица");
Если колонка, содержащая ссылки на физические лица, будет называться не ФизическоеЛицо, необходимо указать это в функции ОписаниеВременнойТаблицыОтборовФизическихЛиц в параметре ИмяПоляФизическоеЛицо. Это же касается и колонки, содержащей даты, по умолчанию она должна называться Период.
Далее получим запрос и выполним его, чтобы сформировать временную таблицу, содержащую кадровые данные:
ПоляОтбораПериодическихДанных = Неопределено;
Запрос = КадровыйУчет.ЗапросВТКадровыеДанныеФизическихЛиц(Истина, ОписательВременнойТаблицыФизЛиц, "Фамилия, Имя, Отчество", ПоляОтбораПериодическихДанных);
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Выполнить();
Ну и в конце мы можем использовать эту временную таблицу. В данном примере мы просто выведем ее в таблицу значений.
Запрос.Текст = "ВЫБРАТЬ
| ВТКадровыеДанныеФизическихЛиц.ФизическоеЛицо КАК ФизическоеЛицо,
| ВТКадровыеДанныеФизическихЛиц.Период КАК Период,
| ВТКадровыеДанныеФизическихЛиц.Фамилия КАК Фамилия,
| ВТКадровыеДанныеФизическихЛиц.Имя КАК Имя,
| ВТКадровыеДанныеФизическихЛиц.Отчество КАК Отчество
|ИЗ
| ВТКадровыеДанныеФизическихЛиц КАК ВТКадровыеДанныеФизическихЛиц";
КадровыеДанные = Запрос.Выполнить().Выгрузить();
Показать
(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 Сидоров Сидор Сидорович
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 Сидоров Сидор Сидорович
(1) Вот так, простым запросом. Попробуйте, вам понравится ))
ВЫБРАТЬ
ВходящаяТаблица.Сотрудник КАК Сотрудник,
ВходящаяТаблица.Период КАК Период
ПОМЕСТИТЬ ВТ_ВходящаяТаблица
ИЗ
&ВходящаяТаблица КАК ВходящаяТаблица
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_ВходящаяТаблица.Сотрудник КАК Сотрудник,
ВТ_ВходящаяТаблица.Период КАК Период,
КадроваяИсторияСотрудниковИнтервальный.Подразделение КАК Подразделение
ИЗ
ВТ_ВходящаяТаблица КАК ВТ_ВходящаяТаблица
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный
ПО (ВТ_ВходящаяТаблица.Сотрудник = КадроваяИсторияСотрудниковИнтервальный.Сотрудник
И КадроваяИсторияСотрудниковИнтервальный.ДатаНачала <= ВТ_ВходящаяТаблица.Период
И КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания >= ВТ_ВходящаяТаблица.Период)
Показать
(7) Стандартная задача. В 1С решается поиском ближайшей даты изменения подразделения и взятием на эту дату значения подразделения. Макс(датаИзмененияПодразделения) где датаИзмененияПодразделения<ДатаХ.
Либо коррелированный запрос "В (Выбрать первые 1...".
В SQL обычно проще
Либо коррелированный запрос "В (Выбрать первые 1...".
В SQL обычно проще
sel ect
ДатаХ как ДатаХ,
Сотрудник как Сотрудник,
(select TOP 1 Подразделение FR OM КадроваяИстория WH ERE ... Order by...) как Подразделение
FR OM...
примерно так
в КадровыеДанные вставьте подразделения и еще поля какие нужны из методов
далее достаете ВТСотрудникиКадровыеДанные из МВТ
// в этой точке уже должен быть определен запрос и ВТПериодыСотрудников
// Добавление колонок кадровых данных
КадровыеДанные = "
|ФизическоеЛицо,
|ТабельныйНомер,
|Состояние,
|ВидЗанятости,
|КоличествоСтавок,
|ДолжностьПоШтатномуРасписанию,
|РабочееМестоРегистратор,
|РабочееМестоПериодРегистрации,
|РазрядКатегория,
|РазрядКатегорияПериодРегистрации,
|РазрядКатегорияРегистратор,
|ГрафикРаботы";
// Далее типовой механизм формирования ВТ с кадровыми данными
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.ФизическоеЛицо КАК ФизическоеЛицо,
| Т.Сотрудник КАК Сотрудник,
| Т.ДатаОкончания КАК Период
|ПОМЕСТИТЬ ВТСотрудникиДатаОкончания
|ИЗ
| ВТПериодыСотрудников КАК Т
|
|ИНДЕКСИРОВАТЬ ПО
| ФизическоеЛицо,
| Период,
| Сотрудник";
Запрос.Выполнить();
Запрос.Текст = "";
ОписательДатаОкончания = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотруднико в(Запрос.МенеджерВременныхТаблиц, "ВТСотрудникиДатаОкончания");
ОписательДатаОкончания.ИмяВТКадровыеДанныеСотрудников = "ВТСотрудникиКадровыеДанные";
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ОписательДатаОкончания, СтруктураВыполнения.ТолькоРазрешенные, КадровыеДанные);
Показатьв КадровыеДанные вставьте подразделения и еще поля какие нужны из методов
КадровыйУчетВнутренний.ЗапросВТКадровыеДанныеФизическихЛиц(); // гражданство, паспорт, ФИО, инвалидность, страхование, стажи, выслуга, семейное положение, воинский учет, клас/ранг госсужбы, семья.
КадровыйУчетВнутренний.ЗапросВТПостоянныеКадровыеДанныеФизическихЛиц(); // контактная информация, образование, ученые степени, звания, награды, реестры госслужбы.
КадровыйУчетВнутренний.ЗапросВТКадровыеДанныеСотрудников(); // рабочие места, свойства рабочего места(шахтер, летчик, терифные сетки), оплата труда, авансы, учет затрат, контракты и договоры сотрудника, условия труда
далее достаете ВТСотрудникиКадровыеДанные из МВТ
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот