Имя: Пароль:
1C
 
Пособите с переводом Запроса 7.7 на прямой запрос
0 Бертыш
 
06.04.26
17:31
В унаследованном коде есть запрос к данным

Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса="//{{Запрос(СформироватьПоГрафику)
|ЭлементГрафика = Справочник.Графики.ТекущийЭлемент;
|Сотрудник = Справочник.Графики.Владелец;
|Подразделение = Справочник.Графики.Подразделение;
|Отделение = Справочник.Графики.Отделение;
|ДатаРаб = Справочник.Графики.ДатаРаб;
|ВремяРаб = Справочник.Графики.Время;
|Группировка Сотрудник;
|Группировка ЭлементГрафика;
|Группировка ДатаРаб;
|Группировка ВремяРаб;
|Условие(Подразделение в спПодразделение);
|Условие(Отделение в _Отделение);
|Условие(Сотрудник в спСотрудник);
|Условие(ДатаРаб >= _ДатаНач);
|Условие(ДатаРаб <= _ДатаКон);
|"//}}ЗАПРОС
;
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
         Возврат;
КонецЕсли;

и далее обход группировок Запроса
Пока Запрос.Группировка(1)=1 Цикл
           n_Сотрудник = Запрос.Сотрудник;
          Пока Запрос.Группировка(2)=1 Цикл

Как то в оны времена практически прошли мимо меня прямые запросы на 7.7. Простенькие запросы писать доводилось, но тут что то я туплю
По части перевода самого запроса понятно до группировки. Так думаю что вместо группировки я должен задать итоги а-ля запросы 1С 8, но далее мне как то непонятно как эти итоги обходить. Может подскажет кто из коллег как перевести такой код 7.7 на прямой запрос? Я кажется с 2005 го года практически не сталкивался с 7.7 перейдя на восьмёрку. В общем не знал, да ещё и забыл :)
1 Злопчинский
 
06.04.26
18:23
Я когда не знаю/туплю - пишу просто.
напиши простой линейный запрос без группировок
выгрузи в индексированную таблицу и сгруппируй уже ИТЗ
2 Злопчинский
 
06.04.26
18:25
База скульная или файловая?
3 Злопчинский
 
06.04.26
18:30
Меня группировка по ВремяРаб сильно смущает...
Время раб - это количество времени, поработанное в ДатуРаб?
Или отметка времени?
4 АгентБезопасной Нацио
 
06.04.26
19:08
скажи человечьим языком, что ты хочешь получить...
5 Бертыш
 
06.04.26
19:11
(2) Скульная.
(4) Там далее есть унаследованный код обработки по выборке из родного запроса. Вот и хочу с минимальными изменениями чтобы он отрабатывал при прямом запросе как и при Запросе обычном
6 Бертыш
 
06.04.26
19:13
(3) Количество времени которое должно быть отработанно в дату
7 Наивный
 
06.04.26
19:29
А что функций нет - так задумано?
8 АгентБезопасной Нацио
 
06.04.26
19:35
(5) я за 15 лет таки  не изчил черные запросы.
Но будет что-то типа
|select
|ЭлементГрафика = Графики.id [ТекущийЭлемент $Справочник.Графики],
|Графики.ParentId [Сотрудник $Справочник.Графики],
|$Графики.ПодразделениеПодразделение [Подразделение $Справочник.Подразделения],
|$Графики.Отделение [Отделение $Справочник.Отделения ],
|$Графики.ДатаРаб [ДатаРаб $Дата ],
|$Графики.Время [ВремяРаб ]
| from $Справочник.Графики как Графики
|where
| $Графики.Подразделение  in (select id from #tab_podr)
|and $Графики.ДатаРаб > :ДатаНач

в параметрах
УложитьСписокОбъектов(#tab_podr, спПодразделение)
и типа того
затем
ИТЗ = ВыполнитьЗапрос(ТекстЗапроса)
Ну и в конце
ИТЗ.Сгруппировать("Сотрудник, ЭлементГрафика, ДатаРаб, ВремяРаб")
9 Бертыш
 
06.04.26
20:59
Спасибо
10 Злопчинский
 
06.04.26
22:09
(7) для выборок по справочникам наличие Функций не обязательно.
11 Злопчинский
 
06.04.26
22:19
(6) |Группировка ВремяРаб;
- при таком пояснении - еще подозрительнее выглядит.
Это имеет смысл если в результате надо получить типа
07.04.26 отработать 20 мин "хз где" (какое-то подразделение, какое-то отделение - но какое именно подразделение и отделение - хз)
07.04.26 отработать 40 мин "хз где" (какое-то подразделение, какое-то отделение, но какое именно подразделение и отделение - хз)
что скорее всего бессмысленно само по себе, максимум что можно сказать: что есть отработка 20 мин где-то и отработка 40 мин где-то
12 Злопчинский
 
06.04.26
22:24
(6) Если нужно ПОСЧИТАТЬ количество времени, которое должно быть отработано в дату, то
|Группировка ВремяРаб; - выкинуть нафиг

Добавить
|Функция НадоОтработать = Сумма(ВремяРаб);

При этом времяРаб - должно быть задано числом (= времени отработки, в секундах или минутах иди часах)

.
А группировка по ВремяРаб может быть оправдана только если время раб задано типа 01:30:50 - тогда напрямую просуммировать не получится и тогда суммировать при обходе результатов - и даже здесь эта группировка лишняя (если по уму), ибо ибо перечень количеств времени внутри даты (для разных подразделение и отделений) получается при обходе группировки ДатаРаб
13 Злопчинский
 
06.04.26
22:27
"А группировка по ВремяРаб может быть оправдана только если время раб задано типа 01:30:50 - тогда напрямую просуммировать не получится "
- и даже здесь можно попробовать
|Функция НадоОтработать = Сумма(МояФункция(ВремяРаб));
где МояФункция(ВремяСтрокой) на выходе выдает нужное количество секунд или минут или часов
14 Злопчинский
 
06.04.26
22:29
(9) все что выше сказано - соответственно транслируется в код АБН с поправками группировок ИТЗ, типа
ИТЗ.Сгруппировать("Сотрудник, ЭлементГрафика, ДатаРаб", "ВремяРаб") если ВремяРаб задано числом
15 АгентБезопасной Нацио
 
07.04.26
10:43
(9) дык чо? запрос хотя бы отработал?
16 Наивный
 
07.04.26
11:07
(14) не Сгруппировать, а Гркппировать
17 Наивный
 
07.04.26
11:07
То есть Группировать ))
18 АгентБезопасной Нацио
 
07.04.26
12:11
(17) Ну и еще имя индекса надо указать. Но это после - для начала хотя бы запрос бы выполнил...
19 АгентБезопасной Нацио
 
07.04.26
12:18
В (8) ошибся - должно быть что-то типа

|Графики.ParentExt [Сотрудник $Справочник.Сотрудники],
20 Бертыш
 
08.04.26
23:25
(15) Неа. Ругается на колонку Подразделение
21 Злопчинский
 
09.04.26
02:06
(20)
1. полный код запроса в студию и копипаст ругательства
2. в метаданных Справочник.Графики.Подразделение - Подразделение какой тип и вид задан
22 Наивный
 
09.04.26
05:23
(20) Там АБН писал
|$Графики.ПодразделениеПодразделение [Подразделение $Справочник.Подразделения],
"ПодразделениеПодразделение" ошибочка дважды скопипастил. может и ты скопипастил не задумываясь
23 Бертыш
 
09.04.26
08:44
Я там по сравнению с предложенным коллегой нафантазировал немного

текстЗапроса = "
|select
|ЭлементГрафика [ТекущийЭлемент $Справочник.Графики],
|Графики.Подразделение [Подразделение $Справочник.Подразделения],
|Графики.ParentExt [Сотрудник $Справочник.Сотрудники],
|Графики.ДатаРаб [ДатаРаб $Дата],
|Графики.ParentExt.ФИОЗУП
|from $Справочник.Графики as Графики (nolock)
|where
| (isMark=0)
|and
| (Подразделение in (select id from #tab_podr))
|and
| (ДатаРаб BETWEEN :абНачДата AND :абКонДата~)
";

А ругается
State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]lnvalid column name 'Подразделение'

Ладно бы ругался на нафантазированное какое ФИОЗУП, а то на Подразделение
Тип реквизита Подразделение Справочник.Подразделения
24 АгентБезопасной Нацио
 
09.04.26
08:45
(23) Ну там же английским-по-белому: $Графики.Подразделение
25 АгентБезопасной Нацио
 
09.04.26
08:46
И никакого ЭлементГрафика не существует. Есть Графики.id
26 Бертыш
 
09.04.26
08:48
(25) меня смутило =
Сейчас откорректирую
27 АгентБезопасной Нацио
 
09.04.26
08:52
|select
|Графики.id [ТекущийЭлемент $Справочник.Графики],
|Графики.ParentExt [Сотрудник $Справочник.Сотрудники],
|$Графики.Подразделение [Подразделение $Справочник.Подразделения],
|$Графики.Отделение [Отделение $Справочник.Отделения],
|$Графики.ДатаРаб [ДатаРаб $Дата],
|$Графики.Время [ВремяРаб]
| from $Справочник.Графики as Графики (nolock)
|where
| $Графики.Подразделение  in (select id from #tab_podr)
|and $Графики.ДатаРаб > :ДатаНач
|and Графики.isMark = 0
28 Наивный
 
09.04.26
08:53
(27)  (select id from #tab_podr)
Ошибочка. надо
(select Val from #tab_podr)
29 АгентБезопасной Нацио
 
09.04.26
09:01
(28) Возможно. Лет 10 уже клюшками не пользуюсь..
30 Бертыш
 
09.04.26
09:06
Теперь ругается на
invalid object name #tab_podr
который я пытаюсь передать через конструкцию
абЗапрос.УложитьСписокОбъектов(списПодразделения,"tab_podr","Подразделения");
31 Бертыш
 
09.04.26
09:09
Что с id что с  Val ругается на tab_podr
32 Наивный
 
09.04.26
09:15
Попробуй [##Tab_Podr]
33 АгентБезопасной Нацио
 
09.04.26
09:31
(30) абЗапрос.УложитьСписокОбъектов(списПодразделения,"#tab_podr","Подразделения");
34 АгентБезопасной Нацио
 
09.04.26
09:33
+(33) Если списПодразделения - СЗ с элементами одинакового типа, то тип справочника можно и не указывать
35 Наивный
 
09.04.26
09:36
(34) А если в списке есть группы - надо указывать. проще указать
36 АгентБезопасной Нацио
 
09.04.26
09:38
(35) Если "по иерархии" - то да, надо.
37 Бертыш
 
09.04.26
09:52
Я так ещё смекаю что я напрямую из Сотрудников реквизит ФИОЗУП не получу и надо будет соединение делать.
38 АгентБезопасной Нацио
 
09.04.26
09:58
(37) Ну сделай соединение. Но для начала хоть что-нибудь сделай, чтоб работало
39 Наивный
 
09.04.26
09:59
(37) Ну если ТЗ по капле выдавать будешь ...
А ты его потом при обходе таблицы считай
40 Злопчинский
 
09.04.26
10:14
А что обозначает   $ в $графики.Подразделение

?
41 АгентБезопасной Нацио
 
09.04.26
10:17
(40) То, что поле Подразделение в таблице Графики нужно разыменовывать в то поле, которое реально в таблице (какое-то там SP****)
42 Злопчинский
 
09.04.26
10:23
(41) понятно
43 АгентБезопасной Нацио
 
09.04.26
11:09
(42) точно так же, как таблица $Справочник.Графики разыменовывается в таблицу SC***.
Аналогично поля Отделение, ДатаРаб  - тоже надо разыменовывать. Ну а поля Графики.id, Графики.ParentExt, Графики.isMark  - разыменовывать не надо, они такие и есть в таблицах.
44 Злопчинский
 
09.04.26
11:22
(43) это понятно было по вышеприведенному ответу