Как пользоваться Отбор = Новый Отбор Структура?

1. VID1234 146 23.09.21 18:55 Сейчас в теме
Здравствуйте. Ребята подскажите и объясните как правильно работать с Отбором! Есть запрос:
Запрос = Новый Запрос;
//			Запрос.Текст = 
//			"ВЫБРАТЬ
//			|	СоставРабот.Сотрудник,
//			|	СоставРабот.Роль КАК Роль
//			|ИЗ
//			|	Справочник.СоставРабот.Сотрудники КАК СоставРабот.
//			|ГДЕ
//			|	СоставРабот.Ссылка.Работа= &Работа
//			|   
//			|
//			|УПОРЯДОЧИТЬ ПО
//			|	Роль 
//			|АВТОУПОРЯДОЧИВАНИЕ";
//			
//			Запрос.УстановитьПараметр("Работа", стрРабота.Работа);
//			Выборка =  Запрос.Выполнить().Выгрузить();
//			Для Каждого Строка Из Выборка Цикл
//				Роль = Строка.Роль;
//			КонецЦикла;
Показать

стрРабота.Работа - это табличная часть формы документа!
Также у меня есть Табличная часть (ТЗ_ЗАР) которая сформирована в коде, там есть колонка Сотрудник!
Для каждого стрСотрудник из ТЗ_ЗАР Цикл
Отбор = Новый Структура;

и вот тут нужно пояснить, что я должен вставить, чтобы с запроса в зависимости ФИО была выбрана соответствующая Роль, может даже я и не это рассматриваю, что-то типа того:
Отбор = Новый Структура();
			Отбор.Вставить("Роль",стрСотрудник.Сотрудник);
			СтрокаСРолью = Выборка.НайтиСтроки(Отбор);

Пробовал и так Отбор.Вставить("Роль", Роль); но не могу допетрить. Объясните пожалуйста, то ли я делаю вообще и как можно решить эту задачу?
По теме из базы знаний
Найденные решения
11. DBV 24.09.21 13:09 Сейчас в теме
(10) Что типа такого, если я правильно понял задачу

Запрос = Новый Запрос;  Справочник.СоставРабот.Сотрудники
Запрос.Текст = "ВЫБРАТЬ
               |	ТзРабота.Работа КАК Работа,
			   |	ТзРабота.СуммаРаботы КАК СуммаРаботы
               |ПОМЕСТИТЬ ВтРабота
               |ИЗ
               |	&ТзРабота КАК ТзРабота
               |;
               |
               |////////////////////////////////////////////////////////////­////////////////////
               |ВЫБРАТЬ
               |	ТзЗар.Сотрудник КАК Сотрудник
               |ПОМЕСТИТЬ ВтЗар
               |ИЗ
               |	&ТзЗар КАК ТзЗар
               |;
               |
               |////////////////////////////////////////////////////////////­////////////////////
               |ВЫБРАТЬ
               |	ВтРабота.Работа КАК Работа,
			   |	ВтРабота.СуммаРаботы КАК СуммаРаботы,
			   |	СоставРабот.Сотрудник КАК Сотрудник,
			   |	СоставРабот.Роль КАК Роль
			   |ПОМЕСТИТЬ ВтРаботаСотрудники
               |ИЗ
               |	ВтРабота КАК ВтРабота
			   |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СоставРабот.Сотрудники КАК СоставРабот
			   |		ПО ВтРабота.Работа = СоставРабот.Ссылка.Работа
			   |;
               |
               |////////////////////////////////////////////////////////////­////////////////////
			   |ВЫБРАТЬ
			   |	ВтЗар.Сотрудник КАК Сотрудник,
			   |	ВтРаботаСотрудники.Работа КАК Работа,
			   |	ВтРаботаСотрудники.Роль КАК Роль,
			   |	ЕСТЬNULL(ВтРаботаСотрудники.СуммаРаботы, 0) КАК СуммаРаботы
			   |ИЗ 
			   |	ВтЗар КАК ВтЗар 
			   |		ЛЕВОЕ СОЕДИНЕНИЕ ВтРаботаСотрудники КАК ВтРаботаСотрудники 
			   | 		ПО ВтЗар.Сотрудник = ВтРаботаСотрудники.Сотрудник
			   |ИТОГИ
			   |	Сотрудник,
			   |	Работа
			   |ПО
			   |	СУММА(СуммаРаботы)";
Запрос.УстановитьПараметр("ТзРабота", Работа.Выгрузить());
Запрос.УстановитьПараметр("ТзЗар", ТЗ_ЗАР);
ВыборкаСотрудник = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСотрудник.Следующий() Цикл
	СуммаРаботПоСотруднику = ВыборкаСотрудник.СуммаРаботы;
	ВыборкаРабота = ВыборкаСотрудник.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Пока ВыборкаРабота.Следующий() Цикл
		СуммаРаботы = ВыборкаРабота.СуммаРаботы;
		ВыборкаДетальный = ВыборкаРабота.Выбрать();
		Пока ВыборкаДетальный.Следующий() Цикл
			// Расчет по ролям
		КонецЦикла;
	КонецЦикла;
КонецЦикла;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. FatPanzer 23.09.21 20:09 Сейчас в теме
(1)
стрРабота.Работа - это табличная часть формы документа!
Уже смешно. У форм не бывает табличных частей.
Запрос.УстановитьПараметр("Работа", стрРабота.Работа);
В запрос нельзя передать табличные данные прикладных объектов.

Пойду пожру, и попытаюсь разобраться в дальнейшем потоке сознания... Не понял, причем тут отбор, как он участвует в запросе и ваще.
7. VID1234 146 24.09.21 10:13 Сейчас в теме
(4) Доброе утро! Ну т.е. у документа! Но отображается на форме! Запрос.УстановитьПараметр("Работа", стрРабота.Работа); с этим все в порядке, все работает как нужно1
5. dehro 7 23.09.21 20:28 Сейчас в теме
Отбор = Новый Структура("Роль");

Для каждого стрСотрудник из ТЗ_ЗАР цикл
    Отбор.Роль = стрСотрудник.Сотрудник;
    СтрокиСРолью = Выборка.НайтиСтроки(Отбор);
    //Тут будет массив строк, удовлетворяющих условию
    Если СтрокиСРолью.Количество()>0 тогда
       //Строки найдены
    КонецЕсли;
КонецЦикла
Показать
user1534961; +1 Ответить
6. DBV 24.09.21 08:13 Сейчас в теме
(1) У выборки нет метода НайтиСтроки

Возможно надо в ТЗ сперва результат выгрузить, а потом искать или вообще в запросе уже соединить данные и обходить готовое
10. VID1234 146 24.09.21 11:34 Сейчас в теме
(6)Здравствуйте. у меня в таблице сотрудник один, а ролей для сотрудника может быть несколько и по каждой работе свой! Если только, разбить сумму и время сотрудника на количество работ и суммы распределить пропорционально суммам работ! Это идея! но как ее осуществить! Если бы так можно было сделать, то было бы хорошо. Допустим у меня в таблице есть сотрудник Иванов, он учувствует в трех работах в одной руководитель в других двух исполнитель, Условие если кол. работ >1 тогда добавляем еще 2 строки, одна у нас уже есть ПроцентПервойРаботы = Сумма1Работы/СуммаВсехРабот; ПроцентВторойРботы = Сумма2Работы/СуммаВсехРабот; ПроцентТретьейРботы = Сумма3Работы/СуммаВсехРабот; и тут же условие Сумма1Работы = Сумма1Работы* ПроцентПервойРаботы ну что-то в этом роде
11. DBV 24.09.21 13:09 Сейчас в теме
(10) Что типа такого, если я правильно понял задачу

Запрос = Новый Запрос;  Справочник.СоставРабот.Сотрудники
Запрос.Текст = "ВЫБРАТЬ
               |	ТзРабота.Работа КАК Работа,
			   |	ТзРабота.СуммаРаботы КАК СуммаРаботы
               |ПОМЕСТИТЬ ВтРабота
               |ИЗ
               |	&ТзРабота КАК ТзРабота
               |;
               |
               |////////////////////////////////////////////////////////////­////////////////////
               |ВЫБРАТЬ
               |	ТзЗар.Сотрудник КАК Сотрудник
               |ПОМЕСТИТЬ ВтЗар
               |ИЗ
               |	&ТзЗар КАК ТзЗар
               |;
               |
               |////////////////////////////////////////////////////////////­////////////////////
               |ВЫБРАТЬ
               |	ВтРабота.Работа КАК Работа,
			   |	ВтРабота.СуммаРаботы КАК СуммаРаботы,
			   |	СоставРабот.Сотрудник КАК Сотрудник,
			   |	СоставРабот.Роль КАК Роль
			   |ПОМЕСТИТЬ ВтРаботаСотрудники
               |ИЗ
               |	ВтРабота КАК ВтРабота
			   |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СоставРабот.Сотрудники КАК СоставРабот
			   |		ПО ВтРабота.Работа = СоставРабот.Ссылка.Работа
			   |;
               |
               |////////////////////////////////////////////////////////////­////////////////////
			   |ВЫБРАТЬ
			   |	ВтЗар.Сотрудник КАК Сотрудник,
			   |	ВтРаботаСотрудники.Работа КАК Работа,
			   |	ВтРаботаСотрудники.Роль КАК Роль,
			   |	ЕСТЬNULL(ВтРаботаСотрудники.СуммаРаботы, 0) КАК СуммаРаботы
			   |ИЗ 
			   |	ВтЗар КАК ВтЗар 
			   |		ЛЕВОЕ СОЕДИНЕНИЕ ВтРаботаСотрудники КАК ВтРаботаСотрудники 
			   | 		ПО ВтЗар.Сотрудник = ВтРаботаСотрудники.Сотрудник
			   |ИТОГИ
			   |	Сотрудник,
			   |	Работа
			   |ПО
			   |	СУММА(СуммаРаботы)";
Запрос.УстановитьПараметр("ТзРабота", Работа.Выгрузить());
Запрос.УстановитьПараметр("ТзЗар", ТЗ_ЗАР);
ВыборкаСотрудник = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСотрудник.Следующий() Цикл
	СуммаРаботПоСотруднику = ВыборкаСотрудник.СуммаРаботы;
	ВыборкаРабота = ВыборкаСотрудник.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Пока ВыборкаРабота.Следующий() Цикл
		СуммаРаботы = ВыборкаРабота.СуммаРаботы;
		ВыборкаДетальный = ВыборкаРабота.Выбрать();
		Пока ВыборкаДетальный.Следующий() Цикл
			// Расчет по ролям
		КонецЦикла;
	КонецЦикла;
КонецЦикла;
Показать
12. VID1234 146 24.09.21 13:26 Сейчас в теме
(11) {Документ.РаспределениеФОТПоПроектамПоСотрудникам.Форма.ФормаДокумента.Форма(892)}: Метод объекта не обнаружен (Выгрузить)
Запрос.УстановитьПараметр("ТзРабота", Работа.Выгрузить());
14. DBV 24.09.21 13:33 Сейчас в теме
(12) Там надо поменять "Работа" на вашу таблицу. (Объект.<ИмяТаблицы>, если это Тч документа)

не надо использовать код без вникания в суть
15. DBV 24.09.21 13:34 Сейчас в теме
(14) и имя колонки измените, как у Вас называется, иначе ошибка будет опять
13. VID1234 146 24.09.21 13:30 Сейчас в теме
(11) я сделал так Работа = новый ТаблицаЗначений; у таблицы значений такого метода нет, а без присваивания переменная не определена
16. DBV 24.09.21 13:37 Сейчас в теме
(13) У таблицы значений, да, нет такого метода.

У типа ДанныеФормыКоллекция есть такой метод
17. VID1234 146 24.09.21 13:41 Сейчас в теме
(16){(44, 5)}: Операция не разрешена в предложении "ИТОГИ"
<<?>>СУММА(СуммаРаботы)
18. DBV 24.09.21 13:43 Сейчас в теме
(17) ой, итоги и ресурсы перепутал местами

|ИТОГИ
| СУММА(СуммаРаботы)
|ПО
| Сотрудник,
| Работа
19. VID1234 146 24.09.21 13:46 Сейчас в теме
(18) о сейчас ошибок нет, проверяю.
20. VID1234 146 24.09.21 13:54 Сейчас в теме
(18)Пока не очень ВыборкаСотрудник в таблице 4 строки с индексом , пустым значением и с типом не определено!
21. DBV 24.09.21 14:01 Сейчас в теме
(20) ВыборкаСотрудник это не таблица, это выборка из результата запроса
23. VID1234 146 24.09.21 14:03 Сейчас в теме
(21) ну да, но я через отладчик открываю ее через "Вычислить Выражение" и открываю таблицу, в таблице только 4 строки! пустые ну кроме индекса и не определенно в типе! НАПИСАНО ОШИБКА ЧТЕНИЯ ЗНАЧЕНИЯ
27. DBV 24.09.21 14:08 Сейчас в теме
(23) потому что это выборка

Можно после установки параметров посмотреть результат, вычислив выражение "Запрос.Выполнить().Выбрать().Выгрузить()"
24. VID1234 146 24.09.21 14:05 Сейчас в теме
(21)
Прикрепленные файлы:
22. VID1234 146 24.09.21 14:01 Сейчас в теме
(18) В параметры все передается и ТЧ документа и ТЗ, но выборка не происходит, но главное 4 строки там есть, пустые правда.
25. DBV 24.09.21 14:05 Сейчас в теме
(22) Связь в запросе не та,

В последнем запросе ПО ВтЗар.Сотрудник = ВтРаботаСотрудники.Сотрудник
Измените на ВтЗар.Сотрудник = ВтРаботаСотрудники.роль

в таблице ТЗ_ЗАР 4 строки?
26. VID1234 146 24.09.21 14:06 Сейчас в теме
(25) пробую. Нет там много строк и колонок тоже не 3!
28. VID1234 146 24.09.21 14:08 Сейчас в теме
(25)связь изменил, результат тот же! а в консоле запросов можно указать ТЗ?
29. DBV 24.09.21 14:11 Сейчас в теме
(28) Да можно, но надо будет в параметр добавить таблицу руками
31. VID1234 146 24.09.21 14:13 Сейчас в теме
(29) я параметры открываю, там тип нужно выбрать, выбирать документ в котором работаю? Если да, то потом колонку с системным названием реквизита документа?
33. DBV 24.09.21 14:17 Сейчас в теме
(31) Надо прямо руками создавать таблицу, все колонки и строки



Да, кстати, в момент выполнения запроса документ записан?

Если да, то можно переделать запрос, чтобы не выгружать в таблицу значений

ВЫБРАТЬ
               |    ТзРабота.Работа КАК Работа,
               |    ТзРабота.СуммаРаботы КАК СуммаРаботы
               |ПОМЕСТИТЬ ВтРабота
               |ИЗ
               |    Документ.<ИмяДокумента>.<ИмяТаблицы> КАК ТзРабота
               |ГДЕ ТзРабота.Ссылка = &Ссылка
               |;
37. VID1234 146 24.09.21 14:24 Сейчас в теме
(33)связь вернул как было, теперь заполняется, только все данные задвоены т.е. Иванова должно быть 3
допустим
Иванов Работа 1 Руководитель 10000
Иванов Работа 2 Исполнитель 23493
Иванов работа 3 Исполнитель 93823,
так должно быть!!!
А у меня так
Иванов Работа 1 Руководитель 10000
Иванов Работа 1 10000
Иванов Работа 2 Исполнитель 23493
Иванов Работа 2 23493
Иванов работа 3 Исполнитель 93823,
Иванов работа 3 93823,
т.е. во втором дубле не указаны роли, если только сделать условие ГДЕ Перечисление не путсая Ссылка
38. DBV 24.09.21 14:29 Сейчас в теме
(37) Это из-за итогов в запросе

Прочитайте про итоги и выборку по группировкам
30. DBV 24.09.21 14:13 Сейчас в теме
(22) В какой момент вычисляете выборку?

Вычислите внутри последнего цикла ВыборкаДетальный
32. VID1234 146 24.09.21 14:15 Сейчас в теме
(30) После того, как перехожу на цикл, но следующий ход, сразу отбрасывает меня в конец процедуры! Я в цикл даже не попадаю!
35. DBV 24.09.21 14:20 Сейчас в теме
(32) Если по сотруднику нет работы, то он и не пойдет в нижнюю выборку
36. DBV 24.09.21 14:21 Сейчас в теме
(32) Условие соединения точно изменили?
34. VID1234 146 24.09.21 14:18 Сейчас в теме
(30) Метод на Выгрузить вместо Выбрать поменял, таблица стала выгружаться, но работа, сумма, роль, пусты
3. provadyuga 99 23.09.21 19:11 Сейчас в теме
Может добавить в запросе еще одно условие для роли
//            |ГДЕ
//            |    СоставРабот.Ссылка.Работа= &Работа
              |    СоставРабот.Роль= &Роль

или по сотруднику еще условие добавить.
8. soft_wind 24.09.21 10:29 Сейчас в теме
Еще один огромный совет!

старайтесь реквизиты с одинаковыми данными - называть одинаково!!
что бы не было такого
Отбор.Роль = стрСотрудник.Сотрудник;


иначе замучаетесь потом ошибки искать!

и по задаче: А вообще что надо решить-то? Основная задача какая? Возможно все решается гораздо проще!
9. VID1234 146 24.09.21 11:20 Сейчас в теме
(8)Здравствуйте у меня в таблице ТЗ_ЗАР есть сотрудники, суммы начислений по этим сотрудникам и количество отработанных часов. За каждым сотрудником закреплена определенная работа, и в каждой работе у сотрудников свои роли. Дополнить эту таблицу ролями я не могу, потому что в этой таблице нет колонки с работой и один и тот же сотрудник, может быть в нескольких работах и в разной работе у него может быть разная роль. Весь этот код тоже в цикле (для каждой работы) Так вот если это работа №1 и роль у сотрудника "Руководитель" то применяется один расчет, если другая роль то второй, если третья роль то третий расчет, и так для каждой работы! То что запросы в цикле, я знаю что это не очень, но пока мне нужно решить и проверить как все это будет выглядеть, а потом уже буду оптимизировать, пока знаний не достаточно, чтобы сразу приводить оптимальный код!
Оставьте свое сообщение

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