Имя: Пароль:
1C
1С v8
Запрос с условием по нескольким комбинациям измерений регистра сведений
0 nikitaz
 
02.02.15
23:09
Есть регистр сведений ФотоотчетыЗначенияФильтров.
В нем есть три измерения: Фотоотчет, ФильтрФотоотчета, ЗначениеФильтра.
Мне нужно получить все фотоотчеты, в которых соблюдается условие:
ФильтрФотоотчета = "Раздел сайта", ЗначениеФильтра = "Брендирование интерьеров"
И
ФильтрФотоотчета = "Вид работ", ЗначениеФильтра = "Вывеска интерьерная"

Вот это, естественно, не работает. Помогите, завис.

ВЫБРАТЬ
    ФотоотчетыЗначенияФильтров.Фотоотчет
ИЗ
    РегистрСведений.ФотоотчетыЗначенияФильтров КАК ФотоотчетыЗначенияФильтров
ГДЕ
    ФотоотчетыЗначенияФильтров.ФильтрФотоотчета = "Раздел сайта"
    И ФотоотчетыЗначенияФильтров.ЗначениеФильтра = "Брендирование интерьеров"
    И ФотоотчетыЗначенияФильтров.ФильтрФотоотчета = "Вид работ"
    И ФотоотчетыЗначенияФильтров.ЗначениеФильтра = "Вывеска интерьерная"

СГРУППИРОВАТЬ ПО
    ФотоотчетыЗначенияФильтров.Фотоотчет
1 Крошка Ру
 
02.02.15
23:11
>>Мне нужно получить все фотоотчеты, в которых соблюдается условие:
ФильтрФотоотчета = "Раздел сайта", ЗначениеФильтра = "Брендирование интерьеров"
И
ФильтрФотоотчета = "Вид работ", ЗначениеФильтра = "Вывеска интерьерная"

Может все-таки ИЛИ? Не думаю, что измерение может принимать одновременно два значения...
2 nikitaz
 
02.02.15
23:13
(1) Нет, мне нужны фотоотчеты, в которых встречается и та, и та комбинация. Если поставить ИЛИ, то будут выведены фотоотчеты, в которых есть первая комбинация ИЛИ вторая комбинация.
3 Dmitrii
 
гуру
02.02.15
23:18
Какова структура регистра?
Как может один отчет иметь одновременно две комбинации фильтров?
4 Крошка Ру
 
02.02.15
23:20
(2) Ну так поподробней надо структуру РС описывать. И что у фотоотчета может быть несколько описаний фильтров. Хорошо ещё, что я свой telepat.dll пока не отключил.
Выбирай в одну ВТ с одной комбинацией, в другую - с другой, потом - внутренне соединение.
5 Dmitrii
 
гуру
02.02.15
23:20
ГДЕ (ФильтрФотоотчета = "Раздел сайта" ИЛИ ФильтрФотоотчета = "Вид работ") И (ЗначениеФильтра = "Брендирование интерьеров" ИЛИ ЗначениеФильтра = "Вывеска интерьерная")
6 Крошка Ру
 
02.02.15
23:23
(5) Неа. Надо, чтоб у одного и того же фильтра, в одной строке РС встречалась одна комбинация, а в другой - другая.
7 nikitaz
 
02.02.15
23:25
В регистре есть три измерения, больше ничего нет: Фотоотчет (документссылка), ФильтрФотоотчета (планвидовхарактеристик), ЗначениеФильтра (множество типов).  Один фототоотчет имеет много комбинаций фильтров и значений.
(4) Близко, спасибо. Вертелось в голове, не мог выразить человеческим языком. Может лучше сделать рекурсией? Вначале получаем ТЗ1, потом уходим в рекурсию с источником ТЗ1 и получаем ТЗ2?
(5) Не подходит. Крошка права.
8 nikitaz
 
02.02.15
23:26
Еще вариант - рекурсия с НайтиСтроки
9 Dmitrii
 
гуру
02.02.15
23:26
Сделать ТЗ из двух колонок и двух строк. ТЗ передать в запрос.

ВЫБРАТЬ
   ТаблицаЗначений.ФильтрОтчета,
   ТаблицаЗначений.ЗначениеФильтра
ИЗ
   &ТаблицаЗначений КАК ТаблицаЗначений
ПОМЕСТИТЬ ВремТЗ
;
ВЫБРАТЬ
   ФотоотчетыЗначенияФильтров.Фотоотчет
ИЗ
   РегистрСведений.ФотоотчетыЗначенияФильтров КАК ФотоотчетыЗначенияФильтров
ГДЕ
   (ФотоотчетыЗначенияФильтров.ФильтрФотоотчета, ФотоотчетыЗначенияФильтров.ЗначениеФильтра) В (ВЫБРАТЬ
   ВремТЗ.ФильтрОтчета,
   ВремТЗ.ЗначениеФильтра
ИЗ
   ВремТЗ КАК ВремТЗ)

Что-то типо этого. Набирал вручную, синтаксис может хромать.
10 Dmitrii
 
гуру
02.02.15
23:28
+ к (9) преимущество в том, что будут искаться именно комбинации пар.
11 nikitaz
 
02.02.15
23:28
(9) Да, только мне нужно запрос формировать на лету. Количество комбинаций фильтр - значение может меняться. Видимо, рекурсия меня спасет.
12 Dmitrii
 
гуру
02.02.15
23:31
(11) >> Количество комбинаций фильтр - значение может меняться.

Ну и заполняй ТЗ, которая передается в качестве параметра запроса теми комбинациями ,которые тебе нужны. Не понял проблемы...

А вообще неплохо бы видеть всю задачу.
13 nikitaz
 
02.02.15
23:38
Есть куча документов "Фотоотчет", в каждой из которых есть табличная часть "Фильтры". В табличной части "Фильтры" есть такие реквизиты - ФильтрФотоотчета и ЗначениеФильтра.
Имеем фотоотчет #1 ("Вывеска Адидас"). В нем в тч Фильтры 2 строки:
1. ФильтрФотоотчета = "Раздел сайта", ЗначениеФильтра = "Брендирование интерьеров"
2. ФильтрФотоотчета = "Вид работ", ЗначениеФильтра = "Вывеска интерьерная"
При проведении это все записыватся в регистр сведений с тремя измерениями: Фотоотчет, ФильтрФотоотчета, ЗначениеФильтра.

Имеем фотоотчет #2 ("Табличка Сони"). тч Фильтры:
1. 1. ФильтрФотоотчета = "Раздел сайта", ЗначениеФильтра = "Брендирование интерьеров"
2. ФильтрФотоотчета = "Вид работ", ЗначениеФильтра = "Табличка"
3. ФильтрФотоотчета = "Материал изготовления", ЗначениеФильтра = "Пластик"
И т.д.
Мне нужно написать обработку, которая ищет по списку комбинаций фильтр - значение фильтра необходимые фотоотчеты.
14 ktvladimir
 
02.02.15
23:38
а кто мешает сделать условие
ГДЕ (ФотоотчетыЗначенияФильтров.ФильтрФотоотчета = "Раздел сайта"
    И ФотоотчетыЗначенияФильтров.ЗначениеФильтра = "Брендирование интерьеров")
    ИЛИ (ФотоотчетыЗначенияФильтров.ФильтрФотоотчета = "Вид работ"
    И ФотоотчетыЗначенияФильтров.ЗначениеФильтра = "Вывеска интерьерная")

всего лишь скобки а как влияет на приоритет условия
15 nikitaz
 
02.02.15
23:39
(14) Будут найдены фотоотчеты, которые имеют или первую или вторую комбинацию. А мне нужны фотоотчеты, в которых встречаются обе комбинации, а не одна из них.
16 Escander
 
02.02.15
23:44
(0) Налицо ошибка проектирования! При нормальном проектировании выбирают не измерения а ресурсы.
17 ktvladimir
 
02.02.15
23:46
(15) ну тогда
ВЫБРАТЬ
   ФотоотчетыЗначенияФильтров.Фотоотчет
ИЗ
   (ВЫБРАТЬ
      ФотоотчетыЗначенияФильтров.Фотоотчет,
      1 КАК Вариант
    ИЗ
      РегистрСведений.ФотоотчетыЗначенияФильтров КАК ФотоотчетыЗначенияФильтров
    ГДЕ
      ФотоотчетыЗначенияФильтров.ФильтрФотоотчета = "Раздел сайта"
      И ФотоотчетыЗначенияФильтров.ЗначениеФильтра = "Брендирование интерьеров"

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
      ФотоотчетыЗначенияФильтров.Фотоотчет,
      2
    ИЗ
      РегистрСведений.ФотоотчетыЗначенияФильтров КАК ФотоотчетыЗначенияФильтров
    ГДЕ
      ФотоотчетыЗначенияФильтров.ФильтрФотоотчета = "Вид работ"
      И ФотоотчетыЗначенияФильтров.ЗначениеФильтра = "Вывеска интерьерная") КАК ФотоотчетыЗначенияФильтров.Фотоотчет
СГРУППИРОВАТЬ ПО
  ФотоотчетыЗначенияФильтров.Фотоотчет
ИМЕЮЩИЕ

  Сумма(Вариант) = 3

ну так к примеру
18 Крошка Ру
 
02.02.15
23:47
(14) Вот не поверишь... В данном случае - ну никак не влияют.
19 Крошка Ру
 
02.02.15
23:48
(16) Это ты разработчикам типовых скажи, у которых настройки пользователя именно так устроены
20 ktvladimir
 
02.02.15
23:48
или так
(15) ну тогда
ВЫБРАТЬ
   ФотоотчетыЗначенияФильтров.Фотоотчет
ИЗ
   (ВЫБРАТЬ
      ФотоотчетыЗначенияФильтров.Фотоотчет
    ИЗ
      РегистрСведений.ФотоотчетыЗначенияФильтров КАК ФотоотчетыЗначенияФильтров
    ГДЕ
      ФотоотчетыЗначенияФильтров.ФильтрФотоотчета = "Раздел сайта"
      И ФотоотчетыЗначенияФильтров.ЗначениеФильтра = "Брендирование интерьеров") КАК ФотоотчетыЗначенияФильтров

   ВНУТРЕННЕЕ СОЕДИНЕНИЕ

      (ВЫБРАТЬ
         ФотоотчетыЗначенияФильтров.Фотоотчет
       ИЗ
         РегистрСведений.ФотоотчетыЗначенияФильтров КАК ФотоотчетыЗначенияФильтров
       ГДЕ
         ФотоотчетыЗначенияФильтров.ФильтрФотоотчета = "Вид работ"
         И ФотоотчетыЗначенияФильтров.ЗначениеФильтра = "Вывеска интерьерная") КАК ФотоотчетыЗначенияФильтров2
   ПО ФотоотчетыЗначенияФильтров.Фотоотчет = ФотоотчетыЗначенияФильтров2.Фотоотчет
21 ktvladimir
 
02.02.15
23:50
(18) не поверю по сравнение с (0) у меня выдаст варианты где либо й набор либо второй в случае с (0) ничего не выдаст
22 nikitaz
 
02.02.15
23:51
(17) (20) А если элегантней, чтобы запрос красиво формировать на лету или еще как? ))) Циклом обходить все комбинации фильтр - значение и из ТЗ выбирать ТЗ?

(21) Мой вариант нифига не выдает. Это правда. Само условие бредовое.
23 ktvladimir
 
02.02.15
23:56
а если элегантней чтоб из тз ок
ВЫБРАТЬ
  ФильтрФотоотчета,
  ЗначениеФильтра
ПОМЕСТИТЬ ТЗВРем
из ТЗВрем
;
ВЫБРАТЬ
  Фотоотчет
ИЗ
  РС.ФотоотчетыЗначенияФильтров КАК Фотоотчеты,
  СУММА(1)
ГДЕ
  (ФильтрФотоотчета, ЗначениеФильтра) В (ВЫБРАТЬ ФильтрФотоотчета,
  ЗначениеФильтра ИЗ ТЗВРем)
СГРУППИРОВАТЬ ПО
  Фотоотчет
ИМЕЮЩИЕ
  СУММА(1) = &КолЗаписейИЗТЧ
24 ktvladimir
 
02.02.15
23:57
на синтаксиси мне пофиг) идею я толкнул реализация твоя. мне влом 1с открывать чтоб рисовать красиво
25 Крошка Ру
 
02.02.15
23:57
(21) У условия И приоритет выше, чем у ИЛИ, так что скобки в (14) ни на что не влияют. А про сравнение с (0) никто и не говорил.
26 ktvladimir
 
02.02.15
23:58
че правда? а я думал у скобок высший приоритет
и будет выполнено условие И в первых скобках, условие И во вторых скобках а потом уже результаты соединяться по ИЛИ

иди учи матчасть
27 ktvladimir
 
03.02.15
00:01
программисты...
28 nikitaz
 
03.02.15
00:03
(23) Курю, не понимаю полностью. Сильно мудрёный... Если не сложно, объясните, плиз, логику.
29 ktvladimir
 
03.02.15
00:08
(28) ну первый пакет это просто я тз загоняю во временную таблицу
второй когдла я с регистра выбираю все записи удовлетворяющие данным из тз в данном случае такое условие двойное это когда оба реквизита соответсвуют записи ис тз

ну и последнее свертка количество таких записей должно быть равным количеству строк в тз, то есть фотоотчет соответсвует ВСЕМ условиям из тз
30 ktvladimir
 
03.02.15
00:09
ВЫБРАТЬ
  Фотоотчеты.Фотоотчет
ИЗ
  РС.ФотоотчетыЗначенияФильтров КАК Фотоотчеты,
  СУММА(1)
ГДЕ
  (Фотоотчеты.ФильтрФотоотчета, Фотоотчеты.ЗначениеФильтра) В (ВЫБРАТЬ ТЗВРем.ФильтрФотоотчета,
  ТЗВРем.ЗначениеФильтра ИЗ ТЗВРем)
так немножко понятнее чтоб не путаться
31 Escander
 
03.02.15
00:15
(19) там другой случай и там есть допиндексы, мне что-то подсказывает что допиндексов тут нет
32 nikitaz
 
03.02.15
00:18
(30) Спасибо, пока вкуриваю с большим скрипом.
33 ktvladimir
 
03.02.15
00:27
просто по кускам делайте сперва без
СГРУППИРОВАТЬ ПО
  Фотоотчет
ИМЕЮЩИЕ
  СУММА(1) = &КолЗаписейИЗТЧ
и
СУММА(1)


посмотрите что будет выбрано из регистра по такому условию
далее добавьте группировку
СУММА(1) И
СГРУППИРОВАТЬ ПО
  Фотоотчеты.Фотоотчет

ну и окончательно условие
ИМЕЮЩИЕ
  СУММА(1) = &КолЗаписейИЗТЧ
34 nikitaz
 
03.02.15
00:48
(33) Извините меня извращенца и спасибо за идею. Сделал циклом.
1. Первый проход - формируем ТЗ 1 из всего регистра по первой связке "фильтр - значение"
2. Второй проход - формируем ТЗ 2 по второй связке "фильтр - значение" из ТЗ 1
3. Третий проходе - ТЗ 3 из ТЗ 2
Ну и т.е., пока не кончатся искомые связки "фильтр-значение"
35 Escander
 
03.02.15
00:57
(34) вам-бы про запросы чего почитать...
1.загружаем переданную параметром ТЗ во временную таблицу.
там правда ошибка и вместо
из ТЗВрем
должно быть
из &ТЗВрем
2.собираем все записи из РС у которых ключевые измерения из набора и считаем сколько раз Фотоотчеты.Фотоотчет там встречается....
но опять ошибка, в предложеном варианте отберёт Фотоотчеты.Фотоотчет только 1 раз, тут нужно не ГДЕ
  (Фотоотчеты.ФильтрФотоотчета, Фотоотчеты.ЗначениеФильтра) В
а внутреннее соединение и уже результат группировать.
3.Финальное условие ИМЕЮЩИЕ отрабатывает на то, что было уже получено после выполнения группировки (а не до как это с ГДЕ).

PS конструкция вида
ИЗ РС.ФотоотчетыЗначенияФильтров КАК Фотоотчеты, СУММА(1)
выглядит забавно но вполне может нормально отработать - нужно проверить
36 ktvladimir
 
03.02.15
07:18
(25) Приношу свои извинения таки да скобки в принципе лишние, видимо перед сном уже плохо думалось
(35) ну про синтаксис я сразу предупреждал что ошибки имеют место быть) так как пишу от руки, по сути это алгоритм а не решение проблемы
насчет неправильности где НЕ согласен. отберутся ВСЕ записи удовлетворяющие условию
признака выбирать различные нет
те до использовани ИМЕЮЩИЕСЯ будет табличка типа
фотоочет 1
фотоочет 1
фотоочет2 1
итд
37 nikitaz
 
03.02.15
08:13
Спасибо! Начинаю стремительно въезжать. Heaving (имеющие)  рулит. Я не профессиональный программист, просто хобби такое странное. Книжку по sql бросил на середине - времени не было ))
Сегодня попробую, отпишусь.
38 nikitaz
 
03.02.15
09:54
ТЗВрем в первом пакете - это таблица значений с комбинациями "ФильтрФотоотчета - ЗначениеФильтра"?
39 nikitaz
 
03.02.15
09:58
КолЗаписейИЗТЧ - количество записей в ТЗВрем?
40 nikitaz
 
03.02.15
10:01
Что такое "ИЗ СУММА(1)"?

ИЗ
  РС.ФотоотчетыЗначенияФильтров КАК Фотоотчеты,
  СУММА(1)
41 nikitaz
 
03.02.15
10:19
Так, накалякал я запрос по вашим подсказкам. В результат попадают фотоотчеты, в которых есть одна (любая) из связок "фильтр - значение". А мне нужно обе. Не могу разобраться с СУММА(1) (((

ВЫБРАТЬ
    ТЗВрем.ФильтрФотоотчета,
    ТЗВрем.ЗначениеФильтра
ПОМЕСТИТЬ ТЗВрем
ИЗ
    &ТЗВрем КАК ТЗВрем
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Фотоотчеты.Фотоотчет
ИЗ
    РегистрСведений.ФотоотчетыЗначенияФильтров КАК Фотоотчеты
ГДЕ
    (Фотоотчеты.ФильтрФотоотчета, Фотоотчеты.ЗначениеФильтра) В
            (ВЫБРАТЬ
                ТЗВрем.ФильтрФотоотчета,
                ТЗВрем.ЗначениеФильтра
            ИЗ
                ТЗВрем)

СГРУППИРОВАТЬ ПО
    Фотоотчеты.Фотоотчет
42 nikitaz
 
03.02.15
10:26
Офигеть. Работает. Спасибо всем!

ВЫБРАТЬ
    ТЗВрем.ФильтрФотоотчета,
    ТЗВрем.ЗначениеФильтра
ПОМЕСТИТЬ ТЗВрем
ИЗ
    &ТЗВрем КАК ТЗВрем
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Фотоотчеты.Фотоотчет,
    1 КАК Поле1
ИЗ
    РегистрСведений.ФотоотчетыЗначенияФильтров КАК Фотоотчеты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗВрем КАК ТЗВрем
        ПО Фотоотчеты.ФильтрФотоотчета = ТЗВрем.ФильтрФотоотчета
            И Фотоотчеты.ЗначениеФильтра = ТЗВрем.ЗначениеФильтра

СГРУППИРОВАТЬ ПО
    Фотоотчеты.Фотоотчет

ИМЕЮЩИЕ
    СУММА(1) = &КолЗаписейИЗТЗ
43 nikitaz
 
03.02.15
11:01
Мне кажется вариант с ГДЕ более правильным. Т.к. в этом случае можно проверять один и тот же фильтр на несколько значений. Т.е. если в фотоотчете допускается повторение фильтра. Например: "Материал изготовления = Пластик" или "Материал изготовления = Металл".

Теперь думаю, что делать с условиями больше и меньше. Т.е. проверять не только равенство, но и больше/меньше
44 ktvladimir
 
03.02.15
11:59
(43) а чтоб исключить повторы фильтров нужно предварительно сделать выборку по таблице РС с условие РАЗЛИЧНЫЕ к примеру
ВЫБРАТЬ
    Фотоотчеты.Фотоотчет,
    1 КАК Поле1
ИЗ
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
        Фотоотчеты.Фотоотчет,
        Фотоотчеты.ФильтрФотоотчета,
        Фотоотчеты.ЗначениеФильтра
     ИЗ РегистрСведений.ФотоотчетыЗначенияФильтров КАК Фотоотчеты) КАК Фотоотчеты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗВрем КАК ТЗВрем
        ПО Фотоотчеты.ФильтрФотоотчета = ТЗВрем.ФильтрФотоотчета
            И Фотоотчеты.ЗначениеФильтра = ТЗВрем.ЗначениеФильтра

СГРУППИРОВАТЬ ПО
    Фотоотчеты.Фотоотчет

ИМЕЮЩИЕ
    СУММА(1) = &КолЗаписейИЗТЗ
45 ktvladimir
 
03.02.15
12:01
вру в подзапросе Различные нельзя делать. вывести подзапрос во временную таблицу

по поводу меньше больше, а какая в принципе разница?
ИМЕЮЩИЕ
    СУММА(1) > 2 те все фотоочеты имеющие более 2 фильтров