Проблема с запросом

1. Aftee 04.12.17 16:50 Сейчас в теме
Добрый день.
Написал следующий запрос:

ВЫБРАТЬ
	ЕСТЬNULL(ФИОФизическихЛицСрезПоследних.Фамилия + " " + ФИОФизическихЛицСрезПоследних.Имя + " " + ФИОФизическихЛицСрезПоследних.Отчество, ТЧСотрудники.Сотрудник.Наименование) КАК ФИО,
	ТЧСотрудники.Сотрудник КАК Сотрудник,
	ТЧСотрудники.ДатаВыхода КАК ДатаВыхода,
	ТЧСотрудники.ОтработаноЧасов КАК ОтработаноЧасов,
	ДолжностьИПодразделение.Должность КАК Должность,
	ДолжностьИПодразделение.Подразделение КАК Подразделение
ИЗ
	(ВЫБРАТЬ
		РаботаВВыходныеИПраздничныеДниСотрудники.Дата КАК ДатаВыхода,
		СУММА(РаботаВВыходныеИПраздничныеДниСотрудники.ОтработаноЧасов) КАК ОтработаноЧасов,
		РаботаВВыходныеИПраздничныеДниСотрудники.Сотрудник КАК Сотрудник
	ИЗ
		Документ.РаботаВВыходныеИПраздничныеДни.Сотрудники КАК РаботаВВыходныеИПраздничныеДниСотрудники
	ГДЕ
		РаботаВВыходныеИПраздничныеДниСотрудники.Ссылка = &Ссылка
	
	СГРУППИРОВАТЬ ПО
		РаботаВВыходныеИПраздничныеДниСотрудники.Сотрудник,
		РаботаВВыходныеИПраздничныеДниСотрудники.Дата) КАК ТЧСотрудники
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних КАК ФИОФизическихЛицСрезПоследних
		ПО ТЧСотрудники.Сотрудник.ФизическоеЛицо = ФИОФизическихЛицСрезПоследних.ФизическоеЛицо
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
			ДанныеДляПодбораСотрудников.Должность КАК Должность,
			ДанныеДляПодбораСотрудников.Начало КАК Начало,
			ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
			ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
		ИЗ
			РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
		
		УПОРЯДОЧИТЬ ПО
			Начало УБЫВ) КАК ДолжностьИПодразделение
		ПО ТЧСотрудники.Сотрудник = ДолжностьИПодразделение.Сотрудник

УПОРЯДОЧИТЬ ПО
	ДатаВыхода,
	ФИО
Показать


Но при его выполнении не получаю должность и подразделение сотрудника. Хотя, если прогнать отдельно вложенный запрос
ВЫБРАТЬ ПЕРВЫЕ 1
	ДанныеДляПодбораСотрудников.Должность КАК Должность,
	ДанныеДляПодбораСотрудников.Начало КАК Начало,
	ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
	ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
ИЗ
	РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников

УПОРЯДОЧИТЬ ПО
	Начало УБЫВ
Показать
, указав ссылку на сотрудника, то все прекрасно отрабатывает и должность с подразделением получаю. Как заставить работать общий запрос? Подскажите, пожалуйста, в чем косяк мой.
+
По теме из базы знаний
Найденные решения
22. Onwardv 64 04.12.17 19:40 Сейчас в теме
В Вашем случае необходимо определить последнюю занимаемую должность и подразделение сотрудником.
Из выложенного алгоритма ясно, что автор не предусмотрел смену должности/подразделения
сотрудниками позже анализируемого документа "РаботаВВыходныеИПраздничныеДни".
Т.е. если делаем запрос по старому документу, где есть сотрудник,
сменивший должность или подразделение после даты этого документа, то должность/подразделение
будет определяться неверно.
Если это не принципиально(м.б. запрос будет только по последнему сформированному документу),
то вот такой пакет отработает верно:

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


Если же принципиально, то необходимо добавить ограничение на дату документа, чтобы занимаемая
должность/подразделение из регистра "ДанныеДляПодбораСотрудников" бралась не позже, скорее всего по периоду.
dandykry; +1
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
12. pentanom 25 04.12.17 17:50 Сейчас в теме
(1) Что-то не видно соединения таблиц "ТЧСотрудники" и "ДолжностьИПодразделение".
+
14. Aftee 04.12.17 18:27 Сейчас в теме
(12)
	ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
			ДанныеДляПодбораСотрудников.Должность КАК Должность,
			ДанныеДляПодбораСотрудников.Начало КАК Начало,
			ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
			ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
		ИЗ
			РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
		
		УПОРЯДОЧИТЬ ПО
			Начало УБЫВ) КАК ДолжностьИПодразделение
Показать
+
2. Skill 04.12.17 16:54 Сейчас в теме
(0) Проверьте что у вас получается вот в этом запросе

ВЫБРАТЬ ПЕРВЫЕ 1
            ДанныеДляПодбораСотрудников.Должность КАК Должность,
            ДанныеДляПодбораСотрудников.Начало КАК Начало,
            ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
            ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
        ИЗ
            РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
        
        УПОРЯДОЧИТЬ ПО
            Начало УБЫВ
Показать
+
3. Aftee 04.12.17 16:56 Сейчас в теме
(2) если отдельно его взять, то я получаю первую запись, нужную мне. Как можно его проверить в общем запросе, подскажите?
+
4. dandykry 9 04.12.17 16:57 Сейчас в теме
(3) Независимо от того, сколько у вас сотрудников и какие, вы получаете из регистра первую запись
+
7. Skill 04.12.17 17:14 Сейчас в теме
(3) Вот только с этой записью у вас и идет дальнейшее соединение.
+
8. Aftee 04.12.17 17:16 Сейчас в теме
(7)так мне одна и нужна. Но она получается не та, почему то
+
5. dandykry 9 04.12.17 17:02 Сейчас в теме
Лучше напишите, что хотите сделать.
+
6. Aftee 04.12.17 17:14 Сейчас в теме
(5) пытаюсь должность и подразделение получить для отбираемых сотрудников. Но в регистре много должностей по одному сотруднику, по этому и пытался через "выбрать первые 1" выбрать только одну запись (актуальную должность)
+
9. Skill 04.12.17 17:20 Сейчас в теме
(8) Так вы выбираете не по каждому сотруднику одну запись с должностью, а всего ОДНУ запись.
+
10. Aftee 04.12.17 17:25 Сейчас в теме
(9)понял. А как теперь можно из множества записей выбрать только одну нужную?
+
11. Skill 04.12.17 17:46 Сейчас в теме
(10) Если я правильно понял у вас есть некая ТЧ с данными сотрудников. В одну ВТ отберите данные из этой ТЧ, в другую данные из регистра и только потом левым соединением их свяжите. Данные из регистра отбирайте по нужной вам должности и сгруппируйте их необходимым для вас способом, чтоб в результете была только нужная вам таблица.
+
16. Aftee 04.12.17 18:31 Сейчас в теме
(11) Дело в том, что понять какая должность мне нужна можно по дате начала ее действия (хранится в том же регистре). Поэтому я и сортирую по убыванию по дате. И если я помещаю данные из регистра во временную таблицу, то я так же получу только 1 запись, ту же самую, что и в имеющемся запросе, или нет?
+
13. YanTsys 12 04.12.17 17:51 Сейчас в теме
Вам именно запрос нужен? Такое решение не подойдет?

	Запрос=новый Запрос;
	Запрос.Текст=
	"ВЫБРАТЬ
	|	Сотрудники.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Сотрудники КАК Сотрудники";
	ТЗСотрудники=Запрос.Выполнить().Выгрузить();
	МассивСотрудников=ТЗСотрудники.ВыгрузитьКолонку("Ссылка");

	ТЗСотрудники = КадровыйУчет.КадровыеДанныеСотрудников(Истина, МассивСотрудников, "ДатаПриема,ДатаУвольнения,ТекущийВидЗанятости,ТекущаяДолжность,ТекущееПодразделение", ДатаОтчета);
Показать
+
15. Aftee 04.12.17 18:28 Сейчас в теме
(13)Да, нужен запрос именно.
+
17. YanTsys 12 04.12.17 18:35 Сейчас в теме
Почему у вас в общем запросе нет отбора по сотруднику в подзапросе
ВЫБРАТЬ ПЕРВЫЕ 1
            ДанныеДляПодбораСотрудников.Должность КАК Должность,
            ДанныеДляПодбораСотрудников.Начало КАК Начало,
            ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
            ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
        ИЗ
            РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
        
        УПОРЯДОЧИТЬ ПО
            Начало УБЫВ
Показать


Вы же получаете данные не по нужному сотруднику а по ДРУГОМУ первому попавшемуся и потом естественно не будет срабатывать левое соединение так как это не тот сотрудник который вам нужен...
+
18. Aftee 04.12.17 18:38 Сейчас в теме
(17) Думал в эту сторону. Можно как-то задать отбор по сотруднику, которого получаю только в запросе?
+
19. YanTsys 12 04.12.17 19:02 Сейчас в теме
(18) Ну так левое соединение и нужно для отбора.

А у вас из чего отбирать если вы чётко пишете что отобрать первую попавшуюся запись а все остальные отбросить?

Обычно пишется вложенный запрос внутри вложенного запроса где например для каждого физического лица отбирается критерий уникальности, например максимальный идентификатор записи, а уже потом выполняем соединение и остается только одна строка на каждое физлицо... потом уже присоединить эту уникальную строку не проблема.
+
20. Aftee 04.12.17 19:09 Сейчас в теме
(19) Спасибо за совет. Попробуй сделать как Вы сказали. Пока решил вопрос по-другому. Правда получился запрос в цикле...
+
21. YanTsys 12 04.12.17 19:28 Сейчас в теме
(20) Если всё равно не запрос, тогда зачем огород городить? Если я правильно понял что вам нужно то сами 1с-ники используют решение (13). Больше шансов на устойчивость при обновлениях...
+
22. Onwardv 64 04.12.17 19:40 Сейчас в теме
В Вашем случае необходимо определить последнюю занимаемую должность и подразделение сотрудником.
Из выложенного алгоритма ясно, что автор не предусмотрел смену должности/подразделения
сотрудниками позже анализируемого документа "РаботаВВыходныеИПраздничныеДни".
Т.е. если делаем запрос по старому документу, где есть сотрудник,
сменивший должность или подразделение после даты этого документа, то должность/подразделение
будет определяться неверно.
Если это не принципиально(м.б. запрос будет только по последнему сформированному документу),
то вот такой пакет отработает верно:

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


Если же принципиально, то необходимо добавить ограничение на дату документа, чтобы занимаемая
должность/подразделение из регистра "ДанныеДляПодбораСотрудников" бралась не позже, скорее всего по периоду.
dandykry; +1
23. Aftee 04.12.17 19:53 Сейчас в теме
(22) Огромное спасибо. Это как раз то, что нужно было. Отрабатывает так как нужно.
Всем остальным так же спасибо за помощь
+
24. Onwardv 64 04.12.17 19:55 Сейчас в теме
(23) Пожалуйста. Рад был помочь.
+
Внимание! Тема сдана в архив

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