Имя: Пароль:
1C
1С v8
Отбор из результата запроса
,
0 МишельЛагранж
 
11.12.11
22:58
Нужно получить запросом всех сотрудников, которые приняты дважды в одну и ту же организацию (не говорите, что это невозможно, что нужно оформлять нового сотрудника если в ту же организацию снова принимается то же физлицо, и есть проверки при проведении дока ПриемНаРаботуВОрганизацию - все возможно!).
Получаем таким образом:

ВЫБРАТЬ
   ПлановыеНачисленияРаботниковОрганизаций.Регистратор,
   ПлановыеНачисленияРаботниковОрганизаций.Сотрудник,
   ПлановыеНачисленияРаботниковОрганизаций.Организация,
   ПлановыеНачисленияРаботниковОрганизаций.ДокументОснование,
   ПлановыеНачисленияРаботниковОрганизаций.ПервичныйДокумент,
   ПлановыеНачисленияРаботниковОрганизаций.Период
ПОМЕСТИТЬ ВтВыборка
ИЗ
   РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций КАК ПлановыеНачисленияРаботниковОрганизаций
ГДЕ
   ПлановыеНачисленияРаботниковОрганизаций.Сотрудник = &Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВтВыборка1.Сотрудник КАК Сотрудник1,
   ВтВыборка1.Регистратор,
   ВтВыборка1.Организация,
   ВтВыборка1.ПервичныйДокумент,
   ВтВыборка1.Период КАК Период1,
   ВтВыборка2.Регистратор,
   ВтВыборка2.ПервичныйДокумент,
   ВтВыборка2.Период КАК Период2

ИЗ
   ВтВыборка КАК ВтВыборка1
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтВыборка КАК ВтВыборка2
       ПО ВтВыборка1.Сотрудник = ВтВыборка2.Сотрудник
           
       И ВтВыборка1.ПервичныйДокумент ССЫЛКА Документ.ПриемНаРаботуВОрганизацию
       И ВтВыборка2.ПервичныйДокумент ССЫЛКА Документ.ПриемНаРаботуВОрганизацию
ГДЕ
   ВтВыборка1.Регистратор <> ВтВыборка2.Регистратор
   И ВтВыборка1.Организация = ВтВыборка2.Организация

Получили дубли записей по сотрудникам (если, например, было два принятия - то по две записи): "принятие1 - принятие2", "принятие2 - принятие1".
Как теперь из результата в этом же запросе отобрать одно реальное совпадение?
1 Лефмихалыч
 
11.12.11
23:02
СГРУППИРОВАТЬ ПО Физлицо ИМЕЮЩИЕ КОЛИЧЕСВТО(РАЗЛИЧНЫЕ Сотрудник) >1
2 МишельЛагранж
 
12.12.11
00:01
ФизЛицо в РС ПлановеНачисленияРаботниковОрганизаций - такого нет в регистре )),
и "ИМЕЮЩИЕ КОЛИЧЕСТВО (РАЗЛИЧНЫЕ Сотрудник)" - это д.б. агрегатное поле КОЛИЧЕСТВО (РАЗЛИЧНЫЕ Сотрудник), которое здесь не нужно...
А если имеется ввиду СГРУППИРОВАТЬ ПО Сотрудник ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Сотрудник) - то либо группировка, либо агрегатная функция на Сотрудника..
3 d_koz
 
12.12.11
00:14
(2) что мешает сравнить в таблице значений ? это же просто и быстро
4 МишельЛагранж
 
12.12.11
00:20
+(2) теряются разрезы по Регистратор, ДокументОснование, ПервичныйДокумент, Период - т.к. надо группировать и по этим полям, а они у одного и того же сотрудника как раз и разные, т.о. - не группируются..
(3) во-первых - для отчета нужно ))
и если тут не получится - надо еще думать, как тогда выпендриваться средствами СКД...
а во-вторых - надо запросом все обставить ))
5 sanja26
 
12.12.11
00:37
а период и период2 разные?
6 d_koz
 
12.12.11
00:39
(4) для отчета, хорошо, два малюсеньких запросика, в первой  - физ.лица, во второй - сотрудникики с приказами за нужный период, состряпай нужную тебе таблицу значений и помести ее в запрос, раз тебе на выходе именно запрос нужен...
хотя вывести на печать можно и с таблицы значений, но ведь легкие пути тебе не нужны, да?)
7 d_koz
 
12.12.11
00:42
+(6) если хочешь, стучись завтра в аську, скину код, как можно сделать через ТЗ и не мучаться
8 МишельЛагранж
 
12.12.11
00:51
(1) если переписать вот так вторую часть запроса:

ВЫБРАТЬ
   ВложенныйЗапрос.Сотрудник,
   КОЛИЧЕСТВО(ВложенныйЗапрос.Сотрудник) КАК Количество,
   ВложенныйЗапрос.Организация
ИЗ
   (ВЫБРАТЬ
       ВтВыборка1.Сотрудник КАК Сотрудник,
       ВтВыборка1.Регистратор КАК Регистратор1,
       ВтВыборка1.ПервичныйДокумент КАК ПервичныйДокумент1,
       ВтВыборка1.Период КАК Период1,
       ВтВыборка2.Регистратор КАК Регистратор2,
       ВтВыборка2.ПервичныйДокумент КАК ПервичныйДокумент2,
       ВтВыборка2.Период КАК Период2,
       ВтВыборка1.Организация КАК Организация
   ИЗ
       ВтВыборка КАК ВтВыборка1
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтВыборка КАК ВтВыборка2
           ПО ВтВыборка1.Сотрудник = ВтВыборка2.Сотрудник И
               (ВтВыборка1.ПервичныйДокумент ССЫЛКА Документ.ПриемНаРаботуВОрганизацию)
               И (ВтВыборка2.ПервичныйДокумент ССЫЛКА Документ.ПриемНаРаботуВОрганизацию)
   ГДЕ
       ВтВыборка1.Регистратор <> ВтВыборка2.Регистратор
       И ВтВыборка1.Организация = ВтВыборка2.Организация
   ) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Сотрудник,
   ВложенныйЗапрос.Организация

//ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВложенныйЗапрос.Сотрудник) > 1

УПОРЯДОЧИТЬ ПО
   ВложенныйЗапрос.Сотрудник
АВТОУПОРЯДОЧИВАНИЕ

Агрегирование поля Сотрудники с РАЗЛИЧНЫЕ смысла не имеет:
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВложенныйЗапрос.Сотрудник)
- т.к. у меня и так проверка по совпадению сотрудника в соединении
ПО ВтВыборка1.Сотрудник = ВтВыборка2.Сотрудник

а если попытаться использовать КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Сотрудник) как замену этому условию в соединении - так выберем вообще всех, у кого был хотя бы один приме на работу...

отбор по ИМЕЮЩИЕ тоже не поможет:
ВЫБРАТЬ
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВложенныйЗапрос.Сотрудник) КАК Количество,
...
уже возвращает 1 различного (из двух приемов того же сотрудника), и
ИМЕЮЩИЕ КОЛИЧЕСТВО(ВложенныйЗапрос.Сотрудник) > 1
- вообще никого не возвратит...
а без РАЗЛИЧНЫЕ:
ВЫБРАТЬ
   КОЛИЧЕСТВО(ВложенныйЗапрос.Сотрудник) КАК Количество
- что с отбором ИМЕЮЩИЕ > 2, что без - возвратит правильно по сотруднику, т.к. это делает основное условие в соединении ПО СОтрудник=Сотрудник.

И в любом случае - с агрегированием теряются необходимые поля вывода...
9 МишельЛагранж
 
12.12.11
00:56
(5) конечно разные, так как берутся от разных доков ПриемНаРаботу ))
запрос и сделан так, чтобы выявить два приема одного и того же сотрудника в одну организацию, и сопоставить две записи... поэтому периоды 1 и 2 - от разных документов приема.
(6) не люблю простые вещи мешать кашей и там (в схеме компоновки), и там (в модуле) :))
сначала по-максимуму нужно выжать из платформы красивое решение ))
(7) скайп подойдет?
10 sanja26
 
12.12.11
01:02
сделай 2 ВТ, в третьей соедини но без полей регистратор и период. Crl по-моему должна расшифровать по ним все-равно
11 sanja26
 
12.12.11
01:02
СКД
12 МишельЛагранж
 
12.12.11
02:26
(10) так-с..
вот, если пока делать ТОЛЬКО в разрезе документов приема (регистраторы пока опустим), то в третьей ВТ из первой вт беру сотрудника, по нему нахожу во 2-ой вт документы, объединяю, и красиво вывожу "Сотрудник - такой-то", ниже - "документы приема".

ВЫБРАТЬ
   ПлановыеНачисленияРаботниковОрганизаций.Регистратор,
   ПлановыеНачисленияРаботниковОрганизаций.Сотрудник,
   ПлановыеНачисленияРаботниковОрганизаций.Организация,
   ПлановыеНачисленияРаботниковОрганизаций.ДокументОснование,
   ПлановыеНачисленияРаботниковОрганизаций.ПервичныйДокумент,
   ПлановыеНачисленияРаботниковОрганизаций.Период
ПОМЕСТИТЬ втВыборка
ИЗ
   РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций КАК ПлановыеНачисленияРаботниковОрганизаций
ГДЕ
   ПервичныйДокумент ССЫЛКА Документ.ПриемНаРаботуВОрганизацию
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВложенныйЗапрос.Сотрудник,
   ВложенныйЗапрос.Организация
ПОМЕСТИТЬ втНайденныеСотрудники
ИЗ
   (ВЫБРАТЬ
       втВыборка1.Сотрудник КАК Сотрудник,
       втВыборка1.Регистратор КАК Регистратор1,
       втВыборка1.ПервичныйДокумент КАК ПервичныйДокумент1,
       втВыборка1.Период КАК Период1,
       втВыборка2.Регистратор КАК Регистратор2,
       втВыборка2.ПервичныйДокумент КАК ПервичныйДокумент2,
       втВыборка2.Период КАК Период2,
       втВыборка1.Организация КАК Организация
   ИЗ
       втВыборка КАК втВыборка1
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ втВыборка КАК втВыборка2
           ПО втВыборка1.Сотрудник = втВыборка2.Сотрудник И
               (втВыборка1.ПервичныйДокумент ССЫЛКА Документ.ПриемНаРаботуВОрганизацию)
               И (втВыборка2.ПервичныйДокумент ССЫЛКА Документ.ПриемНаРаботуВОрганизацию)
   ГДЕ
       втВыборка1.Регистратор <> втВыборка2.Регистратор
       И втВыборка1.Организация = втВыборка2.Организация
   ) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Сотрудник,
   ВложенныйЗапрос.Организация

//что с ИМЕЮЩИЕ, что - без него результат правильный; ИМЕЮЩИЕ в данном случае не нужно:
//ИМЕЮЩИЕ КОЛИЧЕСТВО(ВложенныйЗапрос.Сотрудник) > 1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВЫБОР
       КОГДА ВложенныйЗапрос.ПервичныйДокумент = ""
           ТОГДА ВложенныйЗапрос.Сотрудник
       ИНАЧЕ ""
   КОНЕЦ КАК Сотрудник,
   ВложенныйЗапрос.Сотрудник КАК ПолеСортировки,
   ВложенныйЗапрос.Организация,
   ВложенныйЗапрос.ПервичныйДокумент КАК ПервичныйДокумент
ИЗ
   (ВЫБРАТЬ
       Сотрудники.Сотрудник,
       Сотрудники.Сотрудник КАК ПолеСортировки,
       Сотрудники.Организация,
       "" КАК ПервичныйДокумент
   ИЗ втНайденныеСотрудники КАК Сотрудники

   ОБЪЕДИНИТЬ

   ВЫБРАТЬ
       ДокументыПриема.Сотрудник КАК Сотрудник,
       ДокументыПриема.Сотрудник КАК ПолеСортировки,
       ДокументыПриема.Организация,
       ДокументыПриема.ПервичныйДокумент КАК ПервичныйДокумент
   ИЗ втВыборка КАК ДокументыПриема
   ) КАК ВложенныйЗапрос    
   
ГДЕ
   ВложенныйЗапрос.Сотрудник В
   (ВЫБРАТЬ
       втНайденныеСотрудники.Сотрудник
       //втНайденныеСотрудники.Сотрудник КАК ПолеСортировки,
       //втНайденныеСотрудники.Организация,
   ИЗ втНайденныеСотрудники)
   
УПОРЯДОЧИТЬ ПО
   ПолеСортировки
АВТОУПОРЯДОЧИВАНИЕ

РЕЗУЛЬТАТ:
Сотрудник         Организация         Документы
Иванов            ИНТРА
                                     ПриемНаработуВОрганизацию1
                                     ПриемНаработуВОрганизацию2

- вообще, если не думать, как 1с, красивые вещи получаются ))
правда, по Периоду (дате) пришлепать не удалось в итоговой таблице - сортировка автоматом по Периоду идет, а не как указано - по Сотруднику...
13 МишельЛагранж
 
12.12.11
02:27
(7) так по скайпу спишемся? )
14 d_koz
 
12.12.11
07:11
(13) скайп такой же как и почта в моей карточке, тока без собаки и точки, слитно
15 МишельЛагранж
 
13.12.11
09:47
(14) в скайп постучался )
16 d_koz
 
13.12.11
22:06
(15)
//делаешь два запроса: первый просто физ лица (тзнФизики) , второй по сотрудникам (тзнСотрудники), выгружаешь в ТЗ.
//в физ.лицах у тебя будет по одному разу один и тот же чел встречаться
//а в сотрудниках  один и тот же чел может быть больше одного раза присутствовать.
//Дальше делаешь перебор таблицы с физ.лицами и делаешь поиск в таблице сотрудников:

   Для Каждого СтрокаТзнФизики из тзнФизики цикл
       СтруктураДляПоиска    = Новый Структура("Сотрудник",СтрокаТзнФизики.Физлицо);
       
       МассивНайденыхСотрудников            = тзнСотрудники.НайтиСтроки(СтруктураДляПоиска);
       Если МассивНайденыхСотрудников.Количество() > 1 тогда
       //Если в массиве будет больше одного раза, значит у тебя одно и то же физлицо
       //встречается в тзнСотрудники тоже больше одного раза
       //Дальше творишь,что тебе надо
       КонецЕсли;
   КонецЦикла;
17 МишельЛагранж
 
13.12.11
22:14
ну тогда еще и в ТЗ надо переводить результат, чтобы к СКД подключить..
18 kumena
 
13.12.11
22:21
"Нужно получить запросом всех сотрудников, которые приняты дважды в одну и ту же организацию"  - это просто номер!
а нескромный вопрос, а увольняете вы тоже по 2 раза чтобы уже наверняка уволить?
19 d_koz
 
13.12.11
22:21
(17) зачем переводить? у тебя уже есть результат в двух ТЗ, добавь, например, в нужную тебе ТЗ колонку с типом булево и записывай туда значение, когда сотрудники дублируются.
20 kumena
 
13.12.11
22:23
(16) за выгрузки в ТЗ на экзамене по рукам дают.
я думаю все можно в запросе сделать, но я чесно не понял чего хочет автор
21 d_koz
 
13.12.11
22:25
(18) , (20)
v8: Как добавить своё контекстное меню в дереве?

 kumena

4 - 03.04.11 - 13:30    я вас совсем огорчу, стажа в 1с у меня уже 10 лет.

если по делу сказать нечего, то не флудите здесь.

Дорогой kumena тебе твоими же словами
22 kumena
 
13.12.11
22:26
(21) я вам по делу сказал - это считается ошибкой программирования. запрос нормальный надо писать
23 kumena
 
13.12.11
22:27
+22 грубой ошибкой
24 d_koz
 
13.12.11
22:27
(22) ты преподаватель 1с ?
25 kumena
 
13.12.11
22:31
(24) мне не интересна полемика с вами, к тому же разбирательство кто я и где вы - офтоп.
26 d_koz
 
13.12.11
22:33
(22), (23) выгрузка нужного результата, как в таблицу значений, так и дерево значений не является ошибкой
(22) частично согласен-запрос надо писать нормальный, но ТС не может написать пока такой запрос ,может быть предложишь свой, правильный вариант?
27 МишельЛагранж
 
13.12.11
22:45
(18) сотрудники принимаются и уволняются многократно из орагнизации в организацию..
если Вам не дают такие примеры - это беда преподавателей 1с.
от этого и пишут как в типовых, так и не в типовых ахинею вместо проверок от дурака.
я забросил курсы подготовки к спецу именно поэтому - когда мне сказали, что проверку на дубли доков в запросе делать не надо...
(20) вы получаетет запрсоом данные.
все остальное - выборкой? ну-ну..
1с в своем репертуаре - делает фигню (выборку) и более-менее (выгрузку в тз), чтоб не ругали особо сильно.
но заставляет пользоваться фигней.