Здравствуйте. Ребята подскажите и объясните как правильно работать с Отбором! Есть запрос:

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

стрРабота.Работа - это табличная часть формы документа!
Также у меня есть Табличная часть (ТЗ_ЗАР) которая сформирована в коде, там есть колонка Сотрудник!

```1c
    Для каждого стрСотрудник из ТЗ_ЗАР Цикл
    Отбор = Новый Структура;
```

и вот тут нужно пояснить, что я должен вставить, чтобы с запроса в зависимости ФИО была выбрана соответствующая Роль, может даже я и не это рассматриваю, что-то типа того:

```1c
    Отбор = Новый Структура();
    Отбор.Вставить("Роль",стрСотрудник.Сотрудник);
    СтрокаСРолью = Выборка.НайтиСтроки(Отбор);
```

Пробовал и так Отбор.Вставить("Роль", Роль); но не могу допетрить. Объясните пожалуйста, то ли я делаю вообще и как можно решить эту задачу?
---
Что типа такого, если я правильно понял задачу

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

Пойду пожру, и попытаюсь разобраться в дальнейшем потоке сознания... Не понял, причем тут отбор, как он участвует в запросе и ваще.
---
Доброе утро! Ну т.е. у документа! Но отображается на форме! Запрос.УстановитьПараметр("Работа", стрРабота.Работа); с этим все в порядке, все работает как нужно1
---
```1c
    Отбор = Новый Структура("Роль");

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

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

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

не надо использовать код без вникания в суть
---
и имя колонки измените, как у Вас называется, иначе ошибка будет опять
---
я сделал так Работа = новый ТаблицаЗначений; у таблицы значений такого метода нет, а без присваивания переменная не определена
---
У таблицы значений, да, нет такого метода.

У типа ДанныеФормыКоллекция есть такой метод
---
{(44, 5)}: Операция не разрешена в предложении "ИТОГИ"
<<?>>СУММА(СуммаРаботы)
---
ой, итоги и ресурсы перепутал местами

|ИТОГИ
| СУММА(СуммаРаботы)
|ПО
| Сотрудник,
| Работа
---
о сейчас ошибок нет, проверяю.
---
Пока не очень ВыборкаСотрудник в таблице 4 строки с индексом , пустым значением и с типом не определено!
---
ВыборкаСотрудник это не таблица, это выборка из результата запроса
---
ну да, но я через отладчик открываю ее через "Вычислить Выражение" и открываю таблицу, в таблице только 4 строки! пустые ну кроме индекса и не определенно в типе! НАПИСАНО ОШИБКА ЧТЕНИЯ ЗНАЧЕНИЯ
---
потому что это выборка

Можно после установки параметров посмотреть результат, вычислив выражение "Запрос.Выполнить().Выбрать().Выгрузить()"
---
В параметры все передается и ТЧ документа и ТЗ, но выборка не происходит, но главное 4 строки там есть, пустые правда.
---
Связь в запросе не та,

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

в таблице ТЗ_ЗАР 4 строки?
---
пробую. Нет там много строк и колонок тоже не 3!
---
связь изменил, результат тот же! а в консоле запросов можно указать ТЗ?
---
Да можно, но надо будет в параметр добавить таблицу руками
---
я параметры открываю, там тип нужно выбрать, выбирать документ в котором работаю? Если да, то потом колонку с системным названием реквизита документа?
---
Надо прямо руками создавать таблицу, все колонки и строки

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

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

```1c
    ВЫБРАТЬ
    | ТзРабота.Работа КАК Работа,
    | ТзРабота.СуммаРаботы КАК СуммаРаботы
    |ПОМЕСТИТЬ ВтРабота
    |ИЗ
    | Документ.<ИмяДокумента>.<ИмяТаблицы> КАК ТзРабота
    |ГДЕ ТзРабота.Ссылка = &Ссылка
    |;
```
---
связь вернул как было, теперь заполняется, только все данные задвоены т.е. Иванова должно быть 3
допустим
Иванов Работа 1 Руководитель 10000
Иванов Работа 2 Исполнитель 23493
Иванов работа 3 Исполнитель 93823,
так должно быть!!!
А у меня так
Иванов Работа 1 Руководитель 10000
Иванов Работа 1 10000
Иванов Работа 2 Исполнитель 23493
Иванов Работа 2 23493
Иванов работа 3 Исполнитель 93823,
Иванов работа 3 93823,
т.е. во втором дубле не указаны роли, если только сделать условие ГДЕ Перечисление не путсая Ссылка
---
Это из-за итогов в запросе

Прочитайте про итоги и выборку по группировкам
---
В какой момент вычисляете выборку?

Вычислите внутри последнего цикла ВыборкаДетальный
---
После того, как перехожу на цикл, но следующий ход, сразу отбрасывает меня в конец процедуры! Я в цикл даже не попадаю!
---
Если по сотруднику нет работы, то он и не пойдет в нижнюю выборку
---
Условие соединения точно изменили?
---
Метод на Выгрузить вместо Выбрать поменял, таблица стала выгружаться, но работа, сумма, роль, пусты
---
https://its.1c.ru/db/pubqlang/content/60/hdoc
---
Может добавить в запросе еще одно условие для роли

```1c
    // |ГДЕ
    // | СоставРабот.Ссылка.Работа= &Работа
    | СоставРабот.Роль= &Роль
```

или по сотруднику еще условие добавить.
---
Еще один огромный совет!

старайтесь реквизиты с одинаковыми данными - называть одинаково!!
что бы не было такого

```1c
    Отбор.Роль = стрСотрудник.Сотрудник;
```

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

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