Имя: Пароль:
1C
1С v8
запрос , нужна помощь
🠗 (Волшебник 05.09.2022 08:36)
,
0 Hach49
 
04.09.22
20:42
прохожу тест,Уважаемые Гуру помогите,наверное туплю..но..


Есть непериодический регистр сведений Тарифы с измерениями Должность, Проект, и ресурсом Тариф (число). В этом регистре можно задать тариф (часовой) по должности, а также тарифы по этой должности с уточнением до конкретного проекта. Т.е. по одной должности может быть несколько записей: с пустым проектом - это основной тариф, с заполненными проектами - это уточненные тарифы по конкретным проектам. На вход в запрос подается временная таблица Данные, в которой есть колонки: Должность, Проект, КоличествоЧасов.
Напишите текст запроса для расчета стоимостей по данным временной таблицы.
Пример:
Регистр сведений "Тарифы" (Должность, Проект, Тариф):
"Программист", <Пусто>, 100
"Ведущий программист", <Пусто>, 150
"Ведущий программист", "Фирма1", 200

Временная таблица "Данные" (Должность, Проект, КоличествоЧасов):
"Программист", "Фирма1", 5
"Программист", "Фирма2", 10
"Ведущий программист", "Фирма1", 2
"Ведущий программист", "Фирма2", 10

Нужно получить следующий результат (Должность, Проект, КоличествоЧасов, Стоимость):
"Программист", "Фирма1", 5, 500 (=5*100)
"Программист", "Фирма2", 10, 1000 (=10*100)
"Ведущий программист", "Фирма1", 2, 400 (=2*200)
"Ведущий программист", "Фирма2", 10, 1500 (=10*150)
1 Hach49
 
04.09.22
20:44
Помогите,плз..хотя я бы сам за такое заполнение регистров руки бы оторвал..или я не прав?
2 Hach49
 
04.09.22
20:48
скорее всего туплю,но помогите плз..если возможно
3 Vaderonk
 
04.09.22
20:50
(0) Добрый вечер, могу подсказать в сторону левого соединения. Мы можем сразу объединить записи сразу по должности + проект, итог получится
Итог
Программист Фирма1 5 200     (должность,проект, количествочасов, тарифцена)
Программист Фирма2 10 NULL
Следующее объединение требуется только в тех строках, где результат объединение будет NULL и нужно будет объединение делать по должности только (та как по проекту нет конкретной ставки). Ну и в результате колво часов*тариф цену как новую колонку
4 СеменовСемен
 
04.09.22
20:57
если иерархии проектов нет, то 2 соединение - по проекту и по пустому
5 Hach49
 
04.09.22
20:59
(3) Благодарю,я так уже пробовал сегодня..вот уже думаю - возможно ли это?и не засада ли от тестировщика?
просто вот это :
Регистр сведений "Тарифы" (Должность, Проект, Тариф):
"Программист", <Пусто>, 100
"Ведущий программист", <Пусто>, 150
"Ведущий программист", "Фирма1", 200
6 Hach49
 
04.09.22
20:59
(4) Нет,не получится..пробовал
7 СеменовСемен
 
04.09.22
21:01
(6) неправильно значит пробовал. покажи запрос
8 Hach49
 
04.09.22
21:02
(4) благодарю за участие,в том то и дело - засада какая  то(
9 Hach49
 
04.09.22
21:04
(7) ну вот,пакеты,классика

ВЫБРАТЬ
    ДанныеВТ.Должность КАК Должность,
    ДанныеВТ.Проект КАК Проект,
    ДанныеВТ.КоличествоЧасов КАК КоличествоЧасов
ПОМЕСТИТЬ ДанныеВТ
ИЗ
    РегистрСведений.ДанныеВТ КАК ДанныеВТ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Тарифы.Должность КАК Должность,
    Тарифы.Проект КАК Проект,
    Тарифы.Тариф КАК Тариф
ПОМЕСТИТЬ ТарифыВТ
ИЗ
    РегистрСведений.Тарифы КАК Тарифы
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДанныеВТ.Должность КАК Должность,
    ДанныеВТ.Проект КАК Проект,
    ДанныеВТ.КоличествоЧасов КАК КоличествоЧасов,
    ТарифыВТ.Тариф КАК Тариф
ИЗ
    ДанныеВТ КАК ДанныеВТ
        левое СОЕДИНЕНИЕ ТарифыВТ КАК ТарифыВТ
        ПО ДанныеВТ.Должность = ТарифыВТ.Должность
            И ДанныеВТ.Проект = ТарифыВТ.Проект
10 Hach49
 
04.09.22
21:12
последний вопрос остался,никак не решу..(
11 RomanYS
 
04.09.22
21:20
(10) Если тарифа по проекту нет, то должен использоваться базовый?
12 Hach49
 
04.09.22
21:21
(11) ..получается да,базовый,но он то - <Пусто>,этот базовый
13 Vaderonk
 
04.09.22
21:22
(10) могу еще подсказать что ты можешь сделать не только таблицу ТарифыВТ, но и сразу ТарифыВТБазовыйТариф где пустой проект и в итоговой таблице так же объединять с твоей таблице - для последующего расчета
14 RomanYS
 
04.09.22
21:26
(12) ...
    ЕСТЬNULL(ТарифПоПроекту.Тариф, ТарифБазовый.Тариф) КАК Тариф
ИЗ
    ДанныеВТ КАК ДанныеВТ
        ЛЕВОЕ СОЕДИНЕНИЕ ТарифыВТ КАК ТарифПоПроекту
        ПО ДанныеВТ.Должность = ТарифПоПроекту.Должность
            И ДанныеВТ.Проект = ТарифПоПроекту.Проект
        ЛЕВОЕ СОЕДИНЕНИЕ ТарифыВТ КАК ТарифБазовый
        ПО ДанныеВТ.Должность = ТарифБазовый.Должность
            И (&ПустойПроект = ТарифБазовый.Проект)
15 Hach49
 
04.09.22
21:30
(13) да,спасибо..попробую
16 Hach49
 
04.09.22
21:31
(14) &ПустойПроект,а вот это уже нельзя(
17 RomanYS
 
04.09.22
21:34
(16) Значение(Справочник.Проекты.ПустаяСсылка)
18 СеменовСемен
 
04.09.22
21:34
(16) с чего это вдруг?
19 RomanYS
 
04.09.22
21:36
(13) Это ты ему задачу дал))?
20 Vaderonk
 
04.09.22
21:45
(19) Думаю тратить не 5 минут на запрос, а 3-4ч это и есть то самое пресловутое самообучение.
21 Hach49
 
04.09.22
21:48
(20) да,я учусь,приведи пожалуйста ,запрос на этот тестовый вопрос?
22 RomanYS
 
04.09.22
21:50
(20) Это от человека сильно зависит, кому-то достаточно один раз показать и он поймет. А кто-то будет в муках рожать код, а через X дней придёт с таким же вопросом.
23 СеменовСемен
 
04.09.22
21:52
(21) значит не готов еще к таким задачам. нужно еще теорию поизучать
24 Dmitrii
 
гуру
05.09.22
00:00
(21) Тебе дали готовый ответ в (14) и поправкой в (17) с учетом (16).
Что тебе ещё надо?
Вариант из (13) ничем по сути отличается, только тем, что там предлагается нарисовать ещё одну ВТ, получить которую можно с использованием того же самого условия на пустой проект.
Других ответов всё равно не будет. Только варианты одного и того же решения, отличающиеся мелкими нюансами. Тебе ведь всё равно надо получить для каждой записи о должности и проекте соответствующую запись о тарифе либо для данного проекта, либо для пустого проекта (базовый тариф). А как ты получишь запись о тарифе для пустого проекта, если не проверишь, что проект пустой (хоть в условии ГДЕ, хоть в условии соединения)?

Если ты не можешь понять готового ответа, то см.(23).
25 Hach49
 
05.09.22
06:36
всем большое спасибо
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший