Как пользоваться Отбор = Новый Отбор Структура?
Здравствуйте. Ребята подскажите и объясните как правильно работать с Отбором! Есть запрос:
стрРабота.Работа - это табличная часть формы документа!
Также у меня есть Табличная часть (ТЗ_ЗАР) которая сформирована в коде, там есть колонка Сотрудник!
и вот тут нужно пояснить, что я должен вставить, чтобы с запроса в зависимости ФИО была выбрана соответствующая Роль, может даже я и не это рассматриваю, что-то типа того:
Пробовал и так Отбор.Вставить("Роль", Роль); но не могу допетрить. Объясните пожалуйста, то ли я делаю вообще и как можно решить эту задачу?
Запрос = Новый Запрос;
// Запрос.Текст =
// "ВЫБРАТЬ
// | СоставРабот.Сотрудник,
// | СоставРабот.Роль КАК Роль
// |ИЗ
// | Справочник.СоставРабот.Сотрудники КАК СоставРабот.
// |ГДЕ
// | СоставРабот.Ссылка.Работа= &Работа
// |
// |
// |УПОРЯДОЧИТЬ ПО
// | Роль
// |АВТОУПОРЯДОЧИВАНИЕ";
//
// Запрос.УстановитьПараметр("Работа", стрРабота.Работа);
// Выборка = Запрос.Выполнить().Выгрузить();
// Для Каждого Строка Из Выборка Цикл
// Роль = Строка.Роль;
// КонецЦикла;
ПоказатьстрРабота.Работа - это табличная часть формы документа!
Также у меня есть Табличная часть (ТЗ_ЗАР) которая сформирована в коде, там есть колонка Сотрудник!
Для каждого стрСотрудник из ТЗ_ЗАР Цикл
Отбор = Новый Структура;
и вот тут нужно пояснить, что я должен вставить, чтобы с запроса в зависимости ФИО была выбрана соответствующая Роль, может даже я и не это рассматриваю, что-то типа того:
Отбор = Новый Структура();
Отбор.Вставить("Роль",стрСотрудник.Сотрудник);
СтрокаСРолью = Выборка.НайтиСтроки(Отбор);
Пробовал и так Отбор.Вставить("Роль", Роль); но не могу допетрить. Объясните пожалуйста, то ли я делаю вообще и как можно решить эту задачу?
По теме из базы знаний
Найденные решения
(10) Что типа такого, если я правильно понял задачу
Запрос = Новый Запрос; Справочник.СоставРабот.Сотрудники
Запрос.Текст = "ВЫБРАТЬ
| ТзРабота.Работа КАК Работа,
| ТзРабота.СуммаРаботы КАК СуммаРаботы
|ПОМЕСТИТЬ ВтРабота
|ИЗ
| &ТзРабота КАК ТзРабота
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ТзЗар.Сотрудник КАК Сотрудник
|ПОМЕСТИТЬ ВтЗар
|ИЗ
| &ТзЗар КАК ТзЗар
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВтРабота.Работа КАК Работа,
| ВтРабота.СуммаРаботы КАК СуммаРаботы,
| СоставРабот.Сотрудник КАК Сотрудник,
| СоставРабот.Роль КАК Роль
|ПОМЕСТИТЬ ВтРаботаСотрудники
|ИЗ
| ВтРабота КАК ВтРабота
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СоставРабот.Сотрудники КАК СоставРабот
| ПО ВтРабота.Работа = СоставРабот.Ссылка.Работа
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВтЗар.Сотрудник КАК Сотрудник,
| ВтРаботаСотрудники.Работа КАК Работа,
| ВтРаботаСотрудники.Роль КАК Роль,
| ЕСТЬNULL(ВтРаботаСотрудники.СуммаРаботы, 0) КАК СуммаРаботы
|ИЗ
| ВтЗар КАК ВтЗар
| ЛЕВОЕ СОЕДИНЕНИЕ ВтРаботаСотрудники КАК ВтРаботаСотрудники
| ПО ВтЗар.Сотрудник = ВтРаботаСотрудники.Сотрудник
|ИТОГИ
| Сотрудник,
| Работа
|ПО
| СУММА(СуммаРаботы)";
Запрос.УстановитьПараметр("ТзРабота", Работа.Выгрузить());
Запрос.УстановитьПараметр("ТзЗар", ТЗ_ЗАР);
ВыборкаСотрудник = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСотрудник.Следующий() Цикл
СуммаРаботПоСотруднику = ВыборкаСотрудник.СуммаРаботы;
ВыборкаРабота = ВыборкаСотрудник.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаРабота.Следующий() Цикл
СуммаРаботы = ВыборкаРабота.СуммаРаботы;
ВыборкаДетальный = ВыборкаРабота.Выбрать();
Пока ВыборкаДетальный.Следующий() Цикл
// Расчет по ролям
КонецЦикла;
КонецЦикла;
КонецЦикла;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Пойду пожру, и попытаюсь разобраться в дальнейшем потоке сознания... Не понял, причем тут отбор, как он участвует в запросе и ваще.
стрРабота.Работа - это табличная часть формы документа!
Уже смешно. У форм не бывает табличных частей.
Запрос.УстановитьПараметр("Работа", стрРабота.Работа);
В запрос нельзя передать табличные данные прикладных объектов.
Пойду пожру, и попытаюсь разобраться в дальнейшем потоке сознания... Не понял, причем тут отбор, как он участвует в запросе и ваще.
Отбор = Новый Структура("Роль");
Для каждого стрСотрудник из ТЗ_ЗАР цикл
Отбор.Роль = стрСотрудник.Сотрудник;
СтрокиСРолью = Выборка.НайтиСтроки(Отбор);
//Тут будет массив строк, удовлетворяющих условию
Если СтрокиСРолью.Количество()>0 тогда
//Строки найдены
КонецЕсли;
КонецЦикла
Показать
(6)Здравствуйте. у меня в таблице сотрудник один, а ролей для сотрудника может быть несколько и по каждой работе свой! Если только, разбить сумму и время сотрудника на количество работ и суммы распределить пропорционально суммам работ! Это идея! но как ее осуществить! Если бы так можно было сделать, то было бы хорошо. Допустим у меня в таблице есть сотрудник Иванов, он учувствует в трех работах в одной руководитель в других двух исполнитель, Условие если кол. работ >1 тогда добавляем еще 2 строки, одна у нас уже есть ПроцентПервойРаботы = Сумма1Работы/СуммаВсехРабот; ПроцентВторойРботы = Сумма2Работы/СуммаВсехРабот; ПроцентТретьейРботы = Сумма3Работы/СуммаВсехРабот; и тут же условие Сумма1Работы = Сумма1Работы* ПроцентПервойРаботы ну что-то в этом роде
(10) Что типа такого, если я правильно понял задачу
Запрос = Новый Запрос; Справочник.СоставРабот.Сотрудники
Запрос.Текст = "ВЫБРАТЬ
| ТзРабота.Работа КАК Работа,
| ТзРабота.СуммаРаботы КАК СуммаРаботы
|ПОМЕСТИТЬ ВтРабота
|ИЗ
| &ТзРабота КАК ТзРабота
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ТзЗар.Сотрудник КАК Сотрудник
|ПОМЕСТИТЬ ВтЗар
|ИЗ
| &ТзЗар КАК ТзЗар
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВтРабота.Работа КАК Работа,
| ВтРабота.СуммаРаботы КАК СуммаРаботы,
| СоставРабот.Сотрудник КАК Сотрудник,
| СоставРабот.Роль КАК Роль
|ПОМЕСТИТЬ ВтРаботаСотрудники
|ИЗ
| ВтРабота КАК ВтРабота
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СоставРабот.Сотрудники КАК СоставРабот
| ПО ВтРабота.Работа = СоставРабот.Ссылка.Работа
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВтЗар.Сотрудник КАК Сотрудник,
| ВтРаботаСотрудники.Работа КАК Работа,
| ВтРаботаСотрудники.Роль КАК Роль,
| ЕСТЬNULL(ВтРаботаСотрудники.СуммаРаботы, 0) КАК СуммаРаботы
|ИЗ
| ВтЗар КАК ВтЗар
| ЛЕВОЕ СОЕДИНЕНИЕ ВтРаботаСотрудники КАК ВтРаботаСотрудники
| ПО ВтЗар.Сотрудник = ВтРаботаСотрудники.Сотрудник
|ИТОГИ
| Сотрудник,
| Работа
|ПО
| СУММА(СуммаРаботы)";
Запрос.УстановитьПараметр("ТзРабота", Работа.Выгрузить());
Запрос.УстановитьПараметр("ТзЗар", ТЗ_ЗАР);
ВыборкаСотрудник = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСотрудник.Следующий() Цикл
СуммаРаботПоСотруднику = ВыборкаСотрудник.СуммаРаботы;
ВыборкаРабота = ВыборкаСотрудник.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаРабота.Следующий() Цикл
СуммаРаботы = ВыборкаРабота.СуммаРаботы;
ВыборкаДетальный = ВыборкаРабота.Выбрать();
Пока ВыборкаДетальный.Следующий() Цикл
// Расчет по ролям
КонецЦикла;
КонецЦикла;
КонецЦикла;
Показать
(31) Надо прямо руками создавать таблицу, все колонки и строки
Да, кстати, в момент выполнения запроса документ записан?
Если да, то можно переделать запрос, чтобы не выгружать в таблицу значений
Да, кстати, в момент выполнения запроса документ записан?
Если да, то можно переделать запрос, чтобы не выгружать в таблицу значений
ВЫБРАТЬ
| ТзРабота.Работа КАК Работа,
| ТзРабота.СуммаРаботы КАК СуммаРаботы
|ПОМЕСТИТЬ ВтРабота
|ИЗ
| Документ.<ИмяДокумента>.<ИмяТаблицы> КАК ТзРабота
|ГДЕ ТзРабота.Ссылка = &Ссылка
|;
(33)связь вернул как было, теперь заполняется, только все данные задвоены т.е. Иванова должно быть 3
допустим
Иванов Работа 1 Руководитель 10000
Иванов Работа 2 Исполнитель 23493
Иванов работа 3 Исполнитель 93823,
так должно быть!!!
А у меня так
Иванов Работа 1 Руководитель 10000
Иванов Работа 1 10000
Иванов Работа 2 Исполнитель 23493
Иванов Работа 2 23493
Иванов работа 3 Исполнитель 93823,
Иванов работа 3 93823,
т.е. во втором дубле не указаны роли, если только сделать условие ГДЕ Перечисление не путсая Ссылка
допустим
Иванов Работа 1 Руководитель 10000
Иванов Работа 2 Исполнитель 23493
Иванов работа 3 Исполнитель 93823,
так должно быть!!!
А у меня так
Иванов Работа 1 Руководитель 10000
Иванов Работа 1 10000
Иванов Работа 2 Исполнитель 23493
Иванов Работа 2 23493
Иванов работа 3 Исполнитель 93823,
Иванов работа 3 93823,
т.е. во втором дубле не указаны роли, если только сделать условие ГДЕ Перечисление не путсая Ссылка
Еще один огромный совет!
старайтесь реквизиты с одинаковыми данными - называть одинаково!!
что бы не было такого
иначе замучаетесь потом ошибки искать!
и по задаче: А вообще что надо решить-то? Основная задача какая? Возможно все решается гораздо проще!
старайтесь реквизиты с одинаковыми данными - называть одинаково!!
что бы не было такого
Отбор.Роль = стрСотрудник.Сотрудник;
иначе замучаетесь потом ошибки искать!
и по задаче: А вообще что надо решить-то? Основная задача какая? Возможно все решается гораздо проще!
(8)Здравствуйте у меня в таблице ТЗ_ЗАР есть сотрудники, суммы начислений по этим сотрудникам и количество отработанных часов. За каждым сотрудником закреплена определенная работа, и в каждой работе у сотрудников свои роли. Дополнить эту таблицу ролями я не могу, потому что в этой таблице нет колонки с работой и один и тот же сотрудник, может быть в нескольких работах и в разной работе у него может быть разная роль. Весь этот код тоже в цикле (для каждой работы) Так вот если это работа №1 и роль у сотрудника "Руководитель" то применяется один расчет, если другая роль то второй, если третья роль то третий расчет, и так для каждой работы! То что запросы в цикле, я знаю что это не очень, но пока мне нужно решить и проверить как все это будет выглядеть, а потом уже буду оптимизировать, пока знаний не достаточно, чтобы сразу приводить оптимальный код!
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот