Имя: Пароль:
1C
1С v8
Запрос в динамическом списке справочника управляемой формы
0 dimm7310
 
18.04.12
18:42
УТ11
В справочнике номенклатура есть табличная часть Модели (содержит список моделей автомобилей)

Нужно в форме списка сделать фильтр по модели (список значений).

запрос:

ВЫБРАТЬ
   СпрНоменклатура.Ссылка КАК Ссылка,
   СпрНоменклатура.Код КАК Код,
   СпрНоменклатура.Наименование КАК Наименование,
   СпрНоменклатура.Артикул КАК Артикул,
   СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
   СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
   СпрНоменклатура.СтавкаНДС КАК СтавкаНДС
ИЗ
   Справочник.Номенклатура КАК СпрНоменклатура
   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.Модели КАК НоменклатураМодели
   ПО СпрНоменклатура.Ссылка = НоменклатураМодели.Ссылка

ГДЕ
   НЕ СпрНоменклатура.ЭтоГруппа
    И ВЫБОР
           КОГДА &МоделиКоличество <> 0
               ТОГДА (НоменклатураМодели.Модель В (&СписокМоделей))
           ИНАЧЕ 1 = 1
       КОНЕЦ

где параметры
МоделиКоличество - размер списка моделей
СписокМоделей - список моделей

в форме списка при переходе на группу товаров где есть элементы  заполненными моделями выскакивает ошибка "Обнаружено дублирование ключевых значений в колонке ссылка"

По идее если список фильтра моделей пустой , то и соединение делать не надо, пытался записать через "Выбор"

   ВЫБОР
   КОГДА (&МоделиКоличество <> 0)
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.Модели КАК НоменклатураМодели
       ПО СпрНоменклатура.Ссылка = НоменклатураМодели.Ссылка
   КОНЕЦ

выходит ошибка "синтаксиеская ошибка Выбор"

Пожалуйста подскажите
1 Нуф-Нуф
 
18.04.12
18:43
ужаснах
2 dimm7310
 
18.04.12
18:47
поскольку если список фильтра не пустой, то и ошибки нет
3 dimm7310
 
18.04.12
18:47
(1) подскажи как правильно сделать, я только недавно начал работать с УФ
4 vmv
 
18.04.12
18:50
(3) при чем тут УФ?

подумай над фильтром соединения
5 Nesh
 
18.04.12
19:02
а еще лучше - сделать через отбор, наверное
6 dimm7310
 
18.04.12
23:13
(5) на сколько я понимаю, что бы работал отбор нужно что бы готовые данные были в запросе (ИМХО), но в данном случае значений моделей может быть несколько для каждой номенклатуры
7 dimm7310
 
18.04.12
23:57
я пробовал и так

ВЫБРАТЬ
   СпрНоменклатура.Ссылка КАК Ссылка,
   СпрНоменклатура.Код КАК Код,
   СпрНоменклатура.Наименование КАК Наименование,
   СпрНоменклатура.Артикул КАК Артикул,
   СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
   СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
   СпрНоменклатура.СтавкаНДС КАК СтавкаНДС
ИЗ
   Справочник.Номенклатура КАК СпрНоменклатура
       Левое СОЕДИНЕНИЕ Справочник.Номенклатура.Модели КАК НоменклатураМодели
       ПО СпрНоменклатура.Ссылка = НоменклатураМодели.Ссылка  И ВЫБОР
           КОГДА &МоделиКоличество <> 0
               ТОГДА (НоменклатураМодели.Модель В (&СписокМоделей)) Или (НоменклатураМодели.Ссылка ЕСТЬ NULL)
           ИНАЧЕ 1 = 1
       КОНЕЦ
ГДЕ
   НЕ СпрНоменклатура.ЭтоГруппа

- то же самое
8 alexhtn
 
19.04.12
07:46
ВНУТРЕННЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ РАЗЛИЧНЫЕ
Ссылка ИЗ Справочник.Номенклатура.Модели
ГДЕ
Модель В (&СписокМоделей))КАК НоменклатураМодели
       ПО СпрНоменклатура.Ссылка = НоменклатураМодели.Ссылка
9 dimm7310
 
19.04.12
08:42
(8) теперь при открытии формы список номенклатуры пустой. И при включении фильтра по иерархии номенклатуры вываливается ошибка {ОбщийМодуль.ОбщегоНазначения.Модуль(439)}: Значение не является значением объектного типа (Метаданные)
   Запрос = Новый Запрос(
10 dimm7310
 
19.04.12
09:51
куму интересно
вроде получилось в таком варианте (сейчас проверяю)


ВЫБРАТЬ
   СпрНоменклатура.Ссылка КАК Ссылка,
   СпрНоменклатура.Код КАК Код,
   СпрНоменклатура.Наименование КАК Наименование,
  СпрНоменклатура.Артикул КАК Артикул,
  СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
  СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
   СпрНоменклатура.СтавкаНДС КАК СтавкаНДС
ИЗ
   Справочник.Номенклатура КАК СпрНоменклатура
   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.Модели КАК НоменклатураМодели
   ПО СпрНоменклатура.Ссылка = НоменклатураМодели.Ссылка  И ВЫБОР
           КОГДА &МоделиКоличество <> 0
               ТОГДА (НоменклатураМодели.Модель В (&СписокМоделей))
           ИНАЧЕ 1 = 0
       КОНЕЦ

ГДЕ
   НЕ СпрНоменклатура.ЭтоГруппа
   И ВЫБОР
           КОГДА &МоделиКоличество <> 0
               ТОГДА (НоменклатураМодели.Модель В (&СписокМоделей))
           ИНАЧЕ 1 = 1
       КОНЕЦ
11 dimm7310
 
20.04.12
16:47
Нет, не все как надо
почему - то накладывается фильтр только по первому элементу СписокМоделей

СписокМоделей - список значений на форме передается через параметр

Почему так ?
12 dimm7310
 
20.04.12
16:48
как будто в списке только один элемент
13 dimm7310
 
20.04.12
17:07
может список значений нужно по другому передавать в запрос?
Я передавал так:

Список.Параметры.УстановитьЗначениеПараметра("СписокМоделей",СписокМоделей);
Список.Параметры.УстановитьЗначениеПараметра("МоделиКоличество",СписокМоделей.Количество());
14 SUA
 
20.04.12
17:12
ИНАЧЕ 1 = 1
клюшечник детектед
самый простой метод - ВЫБРАТЬ РАЗЛИЧНЫЕ
а дальше уже ловить ошибки в неправильной фильтрации
15 dimm7310
 
20.04.12
19:41
мне кажется дело не в этом

ради эксперимента сделал фильтр на реквизит шапки "ФормаОплаты " документа  ЗаказКлиента

так же передаю параметром список значений и снова тоже самое - фильтрует только по первому элементу списка

[code]
ВЫБРАТЬ
   ДокументЗаказКлиента.Ссылка,
   ДокументЗаказКлиента.ВерсияДанных,
   ДокументЗаказКлиента.ПометкаУдаления,
   ДокументЗаказКлиента.Номер,
   ДокументЗаказКлиента.Дата,
   ДокументЗаказКлиента.Проведен,
   ДокументЗаказКлиента.Партнер,
   ДокументЗаказКлиента.Контрагент,
   ДокументЗаказКлиента.Организация,
   ДокументЗаказКлиента.Соглашение,
   ДокументЗаказКлиента.Сделка,
   ДокументЗаказКлиента.Валюта,
   ДокументЗаказКлиента.СуммаДокумента,
   ДокументЗаказКлиента.ГрафикОплаты,
   ДокументЗаказКлиента.ЖелаемаяДатаОтгрузки,
   ДокументЗаказКлиента.Склад,
   ДокументЗаказКлиента.ЦенаВключаетНДС,
   ДокументЗаказКлиента.Менеджер,
   ДокументЗаказКлиента.ДополнительнаяИнформация,
   ДокументЗаказКлиента.ДокументОснование,
   ДокументЗаказКлиента.Приоритет,
   ДокументЗаказКлиента.НеОтгружатьЧастями,
   ДокументЗаказКлиента.Статус,
   ДокументЗаказКлиента.МаксимальныйКодСтроки,
   ДокументЗаказКлиента.ДатаСогласования,
   ДокументЗаказКлиента.Согласован,
   ДокументЗаказКлиента.ФормаОплаты,
   ДокументЗаказКлиента.БанковскийСчет,
   ДокументЗаказКлиента.БанковскийСчетКонтрагента,
   ДокументЗаказКлиента.Касса,
   ДокументЗаказКлиента.СуммаАвансаДоОбеспечения,
   ДокументЗаказКлиента.СуммаПредоплатыДоОтгрузки,
   ДокументЗаказКлиента.ДатаПервойОтгрузки,
   ДокументЗаказКлиента.АдресДоставки,
   ДокументЗаказКлиента.НалогообложениеНДС,
   ДокументЗаказКлиента.СкидкиРассчитаны,
   ДокументЗаказКлиента.ХозяйственнаяОперация,
   ДокументЗаказКлиента.Комментарий,
   ДокументЗаказКлиента.НомерПоДаннымКлиента,
   ДокументЗаказКлиента.ДатаПоДаннымКлиента,
   ДокументЗаказКлиента.Грузоотправитель,
   ДокументЗаказКлиента.Грузополучатель,
   ДокументЗаказКлиента.БанковскийСчетГрузоотправителя,
   ДокументЗаказКлиента.БанковскийСчетГрузополучателя,
   ДокументЗаказКлиента.ГруппаФинансовогоУчета,
   ДокументЗаказКлиента.КартаЛояльности,
   ДокументЗаказКлиента.Договор,
   ДокументЗаказКлиента.МодельАвтомобиля,
   ДокументЗаказКлиента.МоментВремени,
   ДокументЗаказКлиента.ВидДоставки
ИЗ
   Документ.ЗаказКлиента КАК ДокументЗаказКлиента
ГДЕ
ВЫБОР
           КОГДА &ВидыОплатКоличество <> 0
               ТОГДА ДокументЗаказКлиента.ФормаОплаты В (&ВидыОплат)
           Иначе Истина    
       КОНЕЦ
[/code]
16 dimm7310
 
20.04.12
20:29
с передачей параметра - подсказали, оказывается бестолку передавать список значений, только массив.

а вот запрос наверное действительно придется переделывать на "ВЫБРАТЬ РАЗЛИЧНЫЕ "

в моем последнем варианте снова вываливается ошибка дублирования ссылки
17 dimm7310
 
20.04.12
21:30
(8,14) Большое спасибо все получилось , просто в (9) я неправильно применил рекомендацию
18 dimm7310
 
21.04.12
08:15
черт еще всплыла ошибка - не попадают товары с пустым списком моделей (когда фильтр не задан)

[code]
ВЫБРАТЬ
   СпрНоменклатура.Ссылка КАК Ссылка,
   СпрНоменклатура.Код КАК Код,
   СпрНоменклатура.Наименование КАК Наименование,
   СпрНоменклатура.Артикул КАК Артикул,
   СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
   СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
   СпрНоменклатура.СтавкаНДС КАК СтавкаНДС
ИЗ
   Справочник.Номенклатура КАК СпрНоменклатура
   ВНУТРЕННЕЕ СОЕДИНЕНИЕ
   (ВЫБРАТЬ РАЗЛИЧНЫЕ
      Ссылка ИЗ Справочник.Номенклатура.Модели
      ГДЕ
       ВЫБОР
           КОГДА &МоделиКоличество <> 0
               ТОГДА Модель В (&СписокМоделей)
           ИНАЧЕ Истина
       КОНЕЦ
       ) КАК НоменклатураМодели
       ПО СпрНоменклатура.Ссылка = НоменклатураМодели.Ссылка
ГДЕ
   НЕ СпрНоменклатура.ЭтоГруппа
[/code]
19 dimm7310
 
21.04.12
09:01
если фильтр пустой , то и соединение делать не нужно

если попытаться использовать выбор перед соединением, выходит ошибка

[code]
   СпрНоменклатура.Ссылка КАК Ссылка,
   СпрНоменклатура.Код КАК Код,
   СпрНоменклатура.Наименование КАК Наименование,
   СпрНоменклатура.Артикул КАК Артикул,
   СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
   СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
   СпрНоменклатура.СтавкаНДС КАК СтавкаНДС
ИЗ
   Справочник.Номенклатура КАК СпрНоменклатура
   ВЫБОР
       КОГДА &МоделиКоличество <> 0
           Внутреннее СОЕДИНЕНИЕ
           (ВЫБРАТЬ РАЗЛИЧНЫЕ
             Ссылка ИЗ Справочник.Номенклатура.Модели
            ГДЕ
              ВЫБОР
                КОГДА &МоделиКоличество <> 0
                  ТОГДА Модель В (&СписокМоделей)
                ИНАЧЕ Истина
              КОНЕЦ
            ) КАК НоменклатураМодели
            ПО  (СпрНоменклатура.Ссылка = НоменклатураМодели.Ссылка)
       ИНАЧЕ Истина
   КОНЕЦ
ГДЕ
   НЕ СпрНоменклатура.ЭтоГруппа
[/code]
20 dimm7310
 
21.04.12
18:15
ругается на синтаксическую ошибку " ВЫБОР"

народ, подскажите
21 Кокос
 
21.04.12
18:44
если делаешь левое соединение как в (0) то по любому получишь дубли ключевых полей в результате. я в динамических списках соединяю не напрямую таблицы а делаю в скобках ВЫБРАТЬ ИЗ и там внутри делаешь группировку по ключевому полю чтобы в итоговой таблице была всего одна запись по каждому ключу. Ну и в твоем случае поле делаешь не логическое а числовое(0, >0) чтобы было что суммировать в группировка. а потом уже в конечной выборке делаешь ВЫБОР КОГДА блабла = 0 ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК БЛАБЛАБЛА
22 Кокос
 
21.04.12
18:46
допустими у тебя две таблицы
товар:

товар1

выборкасоединения:
товар1 истина
товар1 ложь


при соединении получишь две строки с ключевым полем.
23 Кокос
 
21.04.12
18:47
(19) ВЫБОР в условии ГДЕ вроде нельзя указывать.
24 Кокос
 
21.04.12
18:48
ГДЕ
              ВЫБОР
                КОГДА &МоделиКоличество <> 0
                  ТОГДА Модель В (&СписокМоделей)
                ИНАЧЕ Истина
              КОНЕЦ

нахрена тут выбор?

ГДЕ &МоделиКоличество = 0 ИЛИ Модель В (&СписокМоделей)
25 dimm7310
 
22.04.12
09:44
(23) Можно , как раз после "Где" Выбор работает нормально,
а синтаксическая ошибка выходит если я пробую ставить "Выбор" перед "Внутреннее СОЕДИНЕНИЕ"

(24) при открытии формы список фильтра еще пустой, для этого и Выбор перед "Внутреннее СОЕДИНЕНИЕ ", потому что если список фильтра еще пустой, то и соединение делать не надо - путь отображаются все элементы номенклатуры как есть

код в (19) в принципе рабочий (никаких ошибок не выскакивает), только из-за внутреннего соединения выпадают товары у которых таблица моделей пустая
26 dimm7310
 
22.04.12
11:31
может есть способ передать текст запроса как на вроде параметр?
27 dimm7310
 
22.04.12
11:43
"код в (19) в принципе рабочий (никаких ошибок не выскакивает), только из-за внутреннего соединения выпадают товары у которых таблица моделей пустая" -

имелся ввиду (18)
28 dimm7310
 
22.04.12
15:59
(21) не понял, если можно подробнее
29 dimm7310
 
23.04.12
10:41
?
30 alexhtn
 
23.04.12
11:42
Может тебе лучше использовать разные тексты запроса для случаев когда фильтр установлен и отключен?
31 dimm7310
 
23.04.12
11:45
(30) Так я про это и спрашиваю, как можно заменить текст запроса ? или вырезать из него кусок с внутренним соединением (если фильтр пустой)
32 alexhtn
 
23.04.12
11:47
У динамического списка есть свойство "ТекстЗапроса".
33 hhhh
 
23.04.12
11:49
(31) ну а так как вы делали: ИНАЧЕ 1 = 1
разве не прокатит?
34 MaxisUssr
 
23.04.12
12:01
ВЫБРАТЬ
  Номенклатура.Код,
  Номенклатура.Ссылка,
  ...
ИЗ
  Справочник.Номенклатура КАК Номенклатура

ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ
   НоменклатураТЧ.Ссылка
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   ВЫБОР КОГДА &ЕстьСписокМоделей
   ТОГДА НоменклатураТЧ.Модель В (&СписокМоделей) ИНАЧЕ ИСТИНА КОНЕЦ
СГРУППИРОВАТЬ ПО Номенклатура.Ссылка) КАК ВЗ

ПО Номенклатура.Ссылка = ВЗ.Ссылка

ГДЕ
НЕ ВЗ.Ссылка Есть NULL



Написал руками (кривовато), но суть постарался отразить
35 MaxisUssr
 
23.04.12
12:06
+(34)
в конце после ГДЕ

ГДЕ
ВЫБОР КОГДЕ &ЕстьСписокМоделей  ТОГДА
НЕ ВЗ.Ссылка Есть NULL ИНАЧЕ ИСТИНА КОНЕЦ
36 dimm7310
 
23.04.12
12:36
(32) Супер, все получилось
37 dimm7310
 
23.04.12
12:37
(35) спасибо, тоже попробую
38 Кокос
 
23.04.12
12:58
(32) а разве не через него он работал?:))
39 dimm7310
 
23.04.12
13:01
(38) нет, я не знал про это и писал непосредственно в окне запроса динамического списка
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс