Имя: Пароль:
1C
1C 7.7
v7: 1С++ прямые
,
0 Эльниньо
 
13.11.14
16:31
RS.УложитьСписокОбъектов(СпКл, "#Клиенты", "Контрагенты");
        ТекстЗапроса = "
        |SELECT
        |Рег.Товар as [Товар $Справочник.Номенклатура],
        |Рег.Покупатель as [Клиент $Справочник.Контрагенты],        
        |Рег.АдресГр as [ГрузоПол $Справочник.АдресаГрузополучателей],        
        //|Рег.Бонус as Бонус,
        |Рег.СуммаПродажиОборот СуммаПрод,
        |Рег.СуммаЗакупкиОборот СуммаЗак,
        |Рег.СуммаБазНовОборот СуммаБаз,
        |Рег.КолвоБазОборот Количество,
        |Рег.Период День
        |FROM $РегистрОбороты.Продажи(:НачДата,:КонДата, День) as Рег
        |WHERE
        |Рег.Покупатель IN (SELECT Val FROM #Клиенты)";


СпКл - СписокЗначений, в нём список групп Спр.Контрагенты

Какого рожна в запрос все контрагенты попадают?
Что не так в запросе?
1 olegves
 
13.11.14
16:37
Уложить список разворачивает группы до вложенных элементов
2 Эльниньо
 
13.11.14
16:39
Насколько я понимаю - в #Клиенты попадают все элементы из групп в списке.
Или при списке групп происходит затык и надо искать другой вариант?
3 Chai Nic
 
13.11.14
16:40
А попробуй глянуть что там уложилось в SELECT Val FROM #Клиенты
4 Эльниньо
 
13.11.14
16:49
(3) Как? Это же ВТ
5 mehfk
 
13.11.14
16:50
оставить только SELECT Val FROM #Клиенты и посмотреть полученную тз
6 Эльниньо
 
13.11.14
16:51
(5) Спс
7 Эльниньо
 
13.11.14
17:01
Нет времени хорошенько прямыми заняться.
Где бы найти хорошего прямозапросечника
8 Эльниньо
 
14.11.14
09:13
Вопрос к гуру 1С++:
Нужен мегаотчёт с кучей группировок, параметров, условий.
Средствами 1С запрос написать не проблема. Прямыми пока никак. Не хватает понимания логики построения скулёвых запросов.
А вот если скинуть всё (1 - 2 сек) в ИТЗ, а потом крути-верти как хочешь?
9 trad
 
14.11.14
09:22
(8) "А вот если скинуть всё (1 - 2 сек) в ИТЗ, а потом крути-верти как хочешь?"
Так и делаю. Только зачем все, только согласно фильтрам заданным в отчете.
Потом результат в ИТЗ и группируешь как надо и выводишь.
10 Эльниньо
 
14.11.14
09:34
(9) Ну судя по сабжу, так и пытаюсь сделать
11 antoneus
 
14.11.14
09:38
(4) ВТ, емнип, если их руками не дропать, хранятся до окончания сеанса 1С.
12 dk
 
14.11.14
09:40
ну и для скорости желательно фильтровать в параметрах вирт. таблицы оборотов, а не после
----

SELECT ПродажиОбороты.Клиент [Клиент $Справочник.Контрагенты]
    , ПродажиОбороты.СуммаОборот
FROM $РегистрОбороты.Продажи(:НачДата,
        :КонДата,,,
        (Клиент IN (SELECT Val FROM #Клиенты)),
        Клиент,
        Сумма) AS ПродажиОбороты
13 Salimbek
 
14.11.14
09:58
(3) Смотреть желательно не ID-шники т.е. SELECT Val [Контр $Справочник.Контрагенты] from #Клиенты

(10) Для быстрого задания условий - добавляешь в условиях "SELECT ... FROM ... WHERE (1=1) "+Фильтр1;
или, для Виртуальных таблиц,
"SELECT ... FROM $РегистрОстатки.<ИмяРегистра>(,,,,"(1=1)"+Фильтр2+")";

И дальше в зависимости от заданных тебе параметров формируешь этот Фильтр
ФильтрNN = "";
Для ...
  ФильтрNN = ФильтрNN+" AND "+ПолеФильтра + ВидСравнения + ЗначениеФильтра;
КонецЦикла

По группировкам - там много всего бывает, да еще и с иерархиями, так что, чаще всего, я тоже закидывал результат в Индексированную таблицу. Отдельно лишь замечу, что если нужно использовать Иерархию, то добавление колонок по последнему абзацу из раздела документации: http://www.1cpp.ru/docum/icpp/html/IndexedTable.html#group очень хорошо влияет на производительность.
14 Эльниньо
 
14.11.14
10:24
(13) Это давно пользую.
Там тоже вопрос.
Скажем у меня в фильтре были группы 3,4
Группировка раскидает вплоть до самого верхнего уровня - 1,2,3,4
Приходится избавляться от уровней 1,2 ИТЗ
15 Salimbek
 
14.11.14
11:26
(14) Не понял, если ты хочешь вывести отчет с иерархией, то выводить надо всю иерархию. Если же запрос строится целенаправленно по определенной узкой выборке и выводить надо только эту узкую, то значит и группы надо получать в качестве полей запроса, типа:
Select группа3.id, группа4.id, Номенклатура.id FROM Справочник.Номенклатура как Группа3 INNER JOIN Справочник.Номенклатура как Группа4 ON Группа3.ID=Группа4.ParentID INNER JOIN Справочник.Номенклатура как Номенклатура ON ...
16 КонецЦикла
 
14.11.14
11:31
Смотри параметры уложить, там есть насчет иерархии
17 КонецЦикла
 
14.11.14
11:33
(7) С какой целью интересуетесь?
Почта в личке :)
18 Skom
 
14.11.14
11:53
а укладываешь список контрагентов, ты его откуда берешь?
19 Skom
 
14.11.14
11:57
из формы?
20 Salimbek
 
14.11.14
12:11
(19) А хоть откуда можно брать этот список, хоть из формы, хоть из какой другой выборки.
21 Эльниньо
 
14.11.14
12:11
(17) Мне на постоянку нужно
22 Эльниньо
 
14.11.14
12:11
(19) Список на морде
23 Эльниньо
 
14.11.14
12:31
Тут мысля пришла.
ИТЗ.ДобавитьИндекс() занимает время.
Если сначала ДобавитьКолонку индекса, добавить индекс, а потом загрузить туда данные.
По идее нехилый выигрыш во времени.
Ща попробую
24 Skom
 
14.11.14
12:35
(22) а сам запрос покажи
25 Salimbek
 
14.11.14
12:36
(23) Ты глубоко ошибаешься, Добавить индекс куда как быстрее, чем добавлять записи, которые потом должны еще и в индексе перестроиться.
26 Skom
 
14.11.14
12:39
(24) ахахаха вот тупанул))) в (0) же есть.
Вопрос только такой, рабочий запрос как в (0) или с дополнениями?
27 Skom
 
14.11.14
12:45
А в группах, которые указаны в списке значений, подгруппы есть? или там только элементы?
28 Skom
 
14.11.14
12:46
А контрагенты с пустыми оборотами нужны?
29 Skom
 
14.11.14
12:53
Скоро раб. день закончится. Уйду ведь))
30 Эльниньо
 
14.11.14
12:56
Проблему сабжа уже решил.
Буду дальше вас терзать по мере появления неясностей.
Или не буду, если быстро прямозапросечник с резюме нарисуется
31 Skom
 
14.11.14
12:57
через ИТЗ? или прямыми?
Не интересно, как на прямых решить?
32 Skom
 
14.11.14
13:00
в общем, ждем от тебя новых интересных задач))
33 Эльниньо
 
14.11.14
13:21
Нехрена не решил, мля.
Оставил в списке одну группу. В ней есть подгруппы.
Вытаскивает обороты по всем
34 DrZombi
 
гуру
14.11.14
13:39
(33) Дак оно так и работает.
Если нужно только этот уровень получить по группе, так и пиши соответствующее условие запроса.

Если нужно по элементно, так помести в список не группу, а элементы :)
35 DrZombi
 
гуру
14.11.14
13:44
+(33) Когда ты укладываешь командой список, С параметром "Контрагенты".
RS.УложитьСписокОбъектов(СпКл, "#Клиенты", "Контрагенты");

А в списке есть группа.
То он заполнят временную таблицу всеми элементами этой группы.

Если нужно заполнить чисто элементами из списка, то не указывай "Контрагенты""
36 Эльниньо
 
14.11.14
14:01
Всё норм. Запрос с вхере отработал за секунду.
Теперь тоскливо жду, когда 165000 строк в печатную форму выведет
37 Salimbek
 
14.11.14
14:02
+(35) А если нужно заполнить только элементами этой подгруппы, без вложенных, то:
Номенклатура in (select id from $Справочник.Номенклатура where parentid=:ТвояГруппа)
38 Эльниньо
 
14.11.14
14:46
Сейчас подобный фильтр по товарам прикручиваю
39 Ёпрст
 
14.11.14
14:51
вывод в печ форму тоже можно(и нужно) оптимизировать
40 dk
 
14.11.14
14:55
еще 1с++ сильно тупит на
as [бла-бла $Справочник.зю-зю]
если больше 1000 элементов, то весьма ощутимо
поэтому если ссылка не нужна, то лучше descr возвращать вместо ссылки
41 Эльниньо
 
14.11.14
14:58
Второе условие кушать не хочет:

    ТекстЗапроса = "
    |SELECT
    |Рег.Товар as [Товар $Справочник.Номенклатура],
    |Рег.Покупатель as [Клиент $Справочник.Контрагенты],        
    |Рег.АдресГр as [ГрузоПол $Справочник.АдресаГрузополучателей],        
    |Рег.СуммаПродажиОборот СуммаПрод,
    |Рег.СуммаЗакупкиОборот СуммаЗак,
    |Рег.СуммаБазНовОборот СуммаБаз,
    |Рег.КолвоБазОборот Количество,
    |Рег.Период День
    |FROM $РегистрОбороты.Продажи(:НачДата,:КонДата, День) as Рег
    |WHERE 1=1";
    Если СпКл.РазмерСписка() > 0 Тогда
        RS.УложитьСписокОбъектов(СпКл, "#Клиенты", "Контрагенты");
        ТекстЗапроса = ТекстЗапроса + "
        |Рег.Покупатель IN (SELECT Val FROM #Клиенты)";
    КонецЕсли;
    Если ВыбТовары.РазмерСписка() > 0 Тогда
        RS.УложитьСписокОбъектов(ВыбТовары, "#Товары", "Номенклатура");
        ТекстЗапроса = ТекстЗапроса + "
        |Рег.Товар IN (SELECT Val FROM #Товары)";
    КонецЕсли;

Тзап = RS.ВыполнитьИнструкцию(ТекстЗапроса);
{\\FILES2\BASES\ERT\ПЛОСКАЯМАТРИЦАПРОДАЖ.ERT(58)}: State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'Рег'.
42 trad
 
14.11.14
15:00
and забыл
43 Ёпрст
 
14.11.14
15:01
(41) ну ясен пень.. надо либо
and Рег.Покупатель ..
and Рег.Товар ...

делать, либо в тексте запроса СтрЗаменить(ТекстЗапроса,"1=1","Рег in ...,блаблабла");
СтрЗаменить(ТекстЗапроса,"2=2","Рег in ...,блаблабла");
44 trad
 
14.11.14
15:03
(43) оригинальный подход
45 Ёпрст
 
14.11.14
15:07
(44) :)
с тобой на бентли не заработаешь..

ЗЫ: на счет стрЗаменить - иногда удобно, если необходимо в разных местах воткнуть одинаковое условие, например, в юнионе, или еще где, где просто динамическое собирание..проблематично
46 Эльниньо
 
14.11.14
15:10
(45) Спс, сенсэй. Сработало.
Я так понимаю "1=1 И 2=2" не катит
Прокатило 1=1 аnd 2=2
47 Ёпрст
 
14.11.14
15:11
Это, такие конструкции в снеговике в полный рост использовались раньше в универсальном отчете, там правда через комменты в тексте запроса было оформлено всё..
и потом замена на условия, поля запроса, группировки и т.д
48 Эльниньо
 
14.11.14
15:11
Самое лёгкое разрулил. Дальше ямы поглубже будут
49 КонецЦикла
 
14.11.14
15:12
Я всегда пишу (1 = 1)
Далее, динамически формируя условия - просто and ...
50 trad
 
14.11.14
15:18
(45) я не про стрЗаменить, сам делаю через замену (не люблю склеивать запрос из кусочков).

я про 1=1 and 2=2 and 3=3
51 Ёпрст
 
14.11.14
16:17
(50) ну.. по всякому же можно :)
52 Эльниньо
 
14.11.14
16:18
Кстати отдельные простые и гениальные решения вызывают поначалу отторжение даже у опытных прогов.
Например: Флаг = 1 - Флаг
или
Замена Если на Пока в алгоритме удаления "лишних" строк в ТЗ
53 Chai Nic
 
14.11.14
16:29
(52) Нафиг нафиг эти ваши гениальные решения.. не надо из кода делать ребус.
54 МаякНаКазачке
 
14.11.14
16:38
а вот и я
(43) подстрока рулит
давайте ещё
55 Эльниньо
 
14.11.14
16:40
(53) Ну можно и так:

Флаг = 1 - Флаг // не пугайся. Вот смотри: Флаг=1. 1 - 1 скока буит? Теперь Флаг=0. 1-0 скока буит? Вот то-то же
56 МаякНаКазачке
 
14.11.14
16:40
57 МаякНаКазачке
 
14.11.14
16:47
(49) православный восьмёроШник не похвалит и напишет Истина = &ПараметрИстина
58 Целина
 
14.11.14
16:52
(52)особенно помогает в отладке конструкция типа на восьмерке
Выполнить(Подсказка)
кулаки аж трещат.
59 Целина
 
14.11.14
16:55
вообще 1С так работает что любая нетривиальность в условиях без скобок сглючивает, просто с разной частотой
60 Эльниньо
 
14.11.14
17:43
(59) Спс. Учту
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший