Имя: Пароль:
1C
1С v8
v8: Как сделать проще (СКД + пользовательский отбор)
,
0 Fragster
 
гуру
25.07.13
19:55
РегистрСведений.ЦеновыеГруппы - для связи 2-х справочников много ко многим.

Ну а также если подскажете, как сделать то же самое, но не так... хм... странно, буду благодарен.

ВЫБРАТЬ
    ЦеновыеГруппы.Ссылка КАК ЦеноваяГруппа
ПОМЕСТИТЬ ЦеноваяГруппаИсключения
ИЗ
    Справочник.ЦеновыеГруппы КАК ЦеновыеГруппы
ГДЕ
    ЦеновыеГруппы.ДляКонтрагентов
{ГДЕ
    ЦеновыеГруппы.Ссылка.* КАК ЦеноваяГруппаИсключения}
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ИСТИНА КАК Исключать
ПОМЕСТИТЬ ПризнакИсключать
ИЗ
    Справочник.ЦеновыеГруппы КАК ЦеновыеГруппы
ГДЕ
    ЦеновыеГруппы.ДляКонтрагентов

ИМЕЮЩИЕ
    НЕ КОЛИЧЕСТВО(*) В
            (ВЫБРАТЬ
                КОЛИЧЕСТВО(*)
            ИЗ
                ЦеноваяГруппаИсключения)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВЫРАЗИТЬ(ЦеновыеГруппы.Объект КАК Справочник.Контрагенты) КАК Контрагент
ПОМЕСТИТЬ КонтрагентыИсключения
ИЗ
    РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦеноваяГруппаИсключения КАК ЦеноваяГруппаИсключения
        ПО ЦеновыеГруппы.ЦеноваяГруппа = ЦеноваяГруппаИсключения.ЦеноваяГруппа,
    ПризнакИсключать КАК ПризнакИсключать
ГДЕ
    ПризнакИсключать.Исключать = Истина
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Контрагенты.Ссылка КАК Контрагент
{ВЫБРАТЬ
    Контрагент.* КАК КонтрагентИсключения}
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ КонтрагентыИсключения КАК КонтрагентыИсключения
        ПО Контрагенты.Ссылка = КонтрагентыИсключения.Контрагент
ГДЕ
    КонтрагентыИсключения.Контрагент ЕСТЬ NULL
1 Beduin
 
25.07.13
20:04
Если есть хоть одна ценовая группа без признака не для контрагентов, то ты находишь контрагентов которые свободны для установки ценовых групп.
2 Fragster
 
гуру
25.07.13
20:05
(1) не угадал
3 Beduin
 
25.07.13
20:09
Мне во втором запросе условие не понятно. по идее там всегда ложь должна быть.
4 shuhard
 
25.07.13
20:20
(0) а ты убери {} и смысл запроса кристаллизуется
5 ИсчадиеADO
 
25.07.13
20:23
во второй ВТ разве сгруппировать по не нужно? на выходе сколько у нее строк: 1 или более?
6 Fragster
 
модератор
25.07.13
20:48
(4) в них вся фишка
7 Fragster
 
модератор
25.07.13
20:48
(3) 1 или 0
8 Fragster
 
модератор
25.07.13
20:49
(7) к (5)
9 shuhard
 
25.07.13
20:50
(6) форум должен угадать в какой среде будет выполнен запрос - построителе или СКД ?
10 МЮЛЛЕР
 
25.07.13
20:53
А что это такое и с чем его есть?

{ВЫБРАТЬ
    Контрагент.* КАК КонтрагентИсключения}
11 Fragster
 
модератор
25.07.13
20:55
(9) ИМХО без разницы. но в СКД, да.
12 Fragster
 
модератор
25.07.13
20:57
(10) когда автозаполнение убираешь, нужно, чтобы в поле появилось в полях на закладке "наборы данных" для СКД
13 МЮЛЛЕР
 
25.07.13
20:58
(12) спасибо
14 shuhard
 
25.07.13
21:11
(11) [ИМХО без разницы]
ИМХО есть разница
15 Fragster
 
модератор
26.07.13
07:48
(14) в данном случае?
16 Hmster
 
26.07.13
07:59
а каков смысл у третьего запроса? что делать с одним реквизитом типа булево?
17 Hmster
 
26.07.13
08:00
(16) второго
18 Fragster
 
модератор
26.07.13
08:08
(17) там либо ноль либо одна строка, результат используется в третьем запросе
19 Hmster
 
26.07.13
08:12
по моему не хватает слова ПЕРВЫЕ 1
20 Hmster
 
26.07.13
08:14
т.е.
если в первом запросе получаем все ценовые группы для контрагентов то 2,3 запросы пустые, а 4й выводит всех контрагентов.
21 Fragster
 
модератор
26.07.13
08:15
(19) в предпоследнем не хватает РАЗЛИЧНЫЕ - вот это - да.

(20) ага
22 Hmster
 
26.07.13
08:17
так же если выбраны не все группы, то мы получаем в итоге контрагентов у которых нет хотя бы одной ценовой группы из выбранных?
23 Hmster
 
26.07.13
08:18
(21) теоретически результат будет одинаковый - вопрос скорости исполнения
24 Fragster
 
модератор
26.07.13
08:19
(22) да. теперь на повестку дня выходит вторая часть - как сделать это более очевидно и просто.
25 Fragster
 
модератор
26.07.13
08:20
учитывая, что не все контрагенты в принципе входят в ценовые группы
26 Hmster
 
26.07.13
08:39
а второй запрос - это как бы оптимизация - вдруг не поставили отбор?
27 Hmster
 
26.07.13
08:40
в принципе первые 2 запроса можно убрать
28 Hmster
 
26.07.13
08:41
возможно если 1й оставить будет работать быстрее но не факт
29 Fragster
 
модератор
26.07.13
08:54
(26)(27) так ведь если не поставили отбор - то нужно вывести всех. а если поставили - то для ситуации
(контрагент:ценовая группа)

К1 ЦГ1
К1 ЦГ2
К2 --
К3 ЦГ2

при отборе "ценовая группа исключения = ЦГ1" надо вывести К2 и К3
30 Fragster
 
модератор
26.07.13
09:21
ап
31 mistеr
 
26.07.13
09:48
(0) Какой результат нужно получить? И что задает пользователь?
32 Fragster
 
гуру
26.07.13
10:19
(31) пользователь задает ценовые группы, контрагенты которых должны быть исключены из отчета. или не задает.
33 mistеr
 
26.07.13
10:30
(32) Связать К и ЦГ не в запросе, а в СКД. Обычные отборы по ценовым группам, объединенные в группу НЕ.
34 Fragster
 
гуру
26.07.13
10:31
(33) в таком случае в (29) К1 все равно попадает
35 Fragster
 
модератор
26.07.13
11:50
эх.
36 Hmster
 
26.07.13
12:23
А так не проще?
ВЫБРАТЬ
    ЦеновыеГруппы.Ссылка КАК ЦеноваяГруппа
ПОМЕСТИТЬ ЦеноваяГруппаИсключения
ИЗ
    Справочник.ЦеновыеГруппы КАК ЦеновыеГруппы
ГДЕ
    ЦеновыеГруппы.ДляКонтрагентов
{ГДЕ
    ЦеновыеГруппы.Ссылка.* КАК ЦеноваяГруппаИсключения}
;
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВЫРАЗИТЬ(ЦеновыеГруппы.Объект КАК Справочник.Контрагенты) КАК Контрагент
ПОМЕСТИТЬ КонтрагентыИсключения
ИЗ
    РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы
ГДЕ
    ЦеновыеГруппы.ЦеноваяГруппа В (ВЫБРАТЬ ЦеноваяГруппаИсключения.ЦеноваяГруппа ИЗ  ЦеноваяГруппаИсключения КАК ЦеноваяГруппаИсключения)
;
ВЫБРАТЬ
    Контрагенты.Ссылка КАК Контрагент
{ВЫБРАТЬ
    Контрагент.* КАК КонтрагентИсключения}
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    НЕ Контрагенты.Контрагент В (ВЫБРАТЬ КонтрагентыИсключения.Контрагент ИЗ КонтрагентыИсключения КАК КонтрагентыИсключения)
37 Fragster
 
модератор
26.07.13
12:42
(36) тогда если пользователь не установит отбор - то ему нифига не выведется.
38 Fragster
 
модератор
26.07.13
12:43
ну и "Не В" тормозит по сравнению с левым соединением и есть NULL
39 Hmster
 
26.07.13
13:03
даже если поля проиндексировать? этого кстати не хватает в запросе
это же запрос для отчета? тормозить вроде как не должен заметно для пользователя

вот заполненность на отбор - это конечно проблема

бывает еще хуже
40 Bober
 
26.07.13
17:42
(0) что-то запрос слишком сложный для такой простой задачи, тем более если решение будет на СКД.
41 Fragster
 
модератор
26.07.13
17:43
(40) давай решение проще
42 Bober
 
26.07.13
18:04
(41) ты прям как маленький, кто ж тебе просто так выложит решение.
43 Fragster
 
модератор
26.07.13
18:06
(42) т.е. ты не знаешь, как сделать
44 Bober
 
26.07.13
18:07
(42) мелкий трололо.
Подкормлю тебя немного -)
конфигуратор - справка - содержание справки - СКД - язык выражений СКД - операции сравнения
в 8.2.17.169 восьмой пункт сверху
45 Fragster
 
модератор
26.07.13
18:16
(44) и как же тут применить?
46 Fragster
 
модератор
26.07.13
18:18
данные для примера - в (29)
47 Bober
 
26.07.13
18:29
(45) ладно, вот тебе решение

ВЫБРАТЬ
    Спр.Ссылка КАК Контрагент
ИЗ
    Справочник.Контрагенты КАК Спр
        {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы
        ПО (ЦеновыеГруппы.Объект = Спр.Ссылка)}
{ГДЕ
    (ЕСТЬNULL(ЦеновыеГруппы.ЦеноваяГруппа, ЗНАЧЕНИЕ(Справочник.ЦеновыеГруппы.ПустаяСсылка))).* КАК ЦеноваяГруппа}
48 Bober
 
26.07.13
18:32
(45) просто так, чтобы ты лишний раз справку почитал
49 Fragster
 
модератор
26.07.13
18:37
(47) не работает. соединение только когда есть условие - да, работает. а вот при выборе "ЦеноваяГруппа <> ЦГ1" контрагент К1 все равно попадает в  отчет
50 Bober
 
26.07.13
18:39
(49) все работает. раз есть условие на поле, то и соединение будет
51 Bober
 
26.07.13
18:42
(49) ага, вижу...
52 Bober
 
26.07.13
18:45
(49) а тебе нужно через отбор или через параметр задавать группы исключения?
53 Fragster
 
модератор
26.07.13
18:48
(52) через отбор
54 Bober
 
26.07.13
18:50
решение через параметр, который можно сделать в списке.
ВЫБРАТЬ
    Спр.Ссылка КАК Контрагент
ИЗ
    Справочник.Контрагенты КАК Спр
{ГДЕ
    (НЕ Спр.Ссылка В
                (ВЫБРАТЬ
                    ЦеновыеГруппы.Объект
                ИЗ
                    РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы
                ГДЕ
                    ЦеновыеГруппы.ЦеноваяГруппа = &ЦеноваяГруппа))}
55 Fragster
 
модератор
26.07.13
18:54
(54) оно очевидно, но требует параметра, который может быть универсальным - типа в списке, в иерархии, все, кроме (не в для исключаемых групп) и т.п.
56 Fragster
 
модератор
26.07.13
18:55
не может быть
57 Bober
 
26.07.13
19:53
с отбором

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВЫРАЗИТЬ(РС.Объект КАК Справочник.Контрганеты) КАК Контрагент
ПОМЕСТИТЬ Контрагенты
ИЗ
    РегистрСведений.ЦеновыеГруппы КАК РС
ГДЕ
    ЛОЖЬ
{ГДЕ РС.ЦеноваяГруппа.* КАК ЦеноваяГруппа}
;

ВЫБРАТЬ
    Спр.Ссылка КАК Контрагент
ИЗ
    Справочник.Контрагенты КАК Спр
        ЛЕВОЕ СОЕДИНЕНИЕ Контрагенты КАК Контрагенты
        ПО (Контрагенты.Объект = Спр.Ссылка)
ГДЕ
    Контрагенты.Объект ЕСТЬ NULL


но написать несколько строк кода в модуле объекта, перед компоновкой нужно убрать условие в первом запросе Ложь.
58 Bober
 
26.07.13
20:01
либо для надежности в первом запросе написать
"ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 0"
а в модуле объекта Если Найти(Запрос, "РС.ЦеноваяГруппа") > 0 Тогда
  Запрос = СтрЗаменить(Запрос, "ПЕРВЫЕ 0", "");
КонецЕсли;
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.