Имя: Пароль:
1C
1С v8
Помогите разобраться с соединением в запросе
0 Конфигуратор1с
 
27.09.11
16:02
Есть Регистр сведений - измерение Склад и номенклатура, ресурс - статус(перечисление). Есть такая таблица значений с такой же структурой. В пакетном запросе выбираю все записи из таблицы значений, далее мне нужно получить все записи из таблицы у которых отличны значения статуса от  регистра или такой записи в регистре нет. Написал такой текст - выводит все записи из таблицы.

Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
   Запрос.УстановитьПараметр("Склад",СкладОтбора);
   Запрос.УстановитьПараметр("ВнешнийИсточник",ТаблицаДляЗапроса);
   Запрос.Текст = "ВЫБРАТЬ
                  |    ВнешнийИсточник.Номенклатура,
                  |    ВнешнийИсточник.КатегорияАВС,
                  |    ВнешнийИсточник.Склад
                  |ПОМЕСТИТЬ ВТ
                  |ИЗ
                  |    &ВнешнийИсточник КАК ВнешнийИсточник";
                  //|ГДЕ
                  //|    ВнешнийИсточник.Номенклатура.ЭтоГруппа = ЛОЖЬ
                  //|    И ВнешнийИсточник.КатегорияАВС <> ЗНАЧЕНИЕ(Перечисление.КатегорииАВС.ПустаяСсылка)";
   Запрос.Выполнить();
   Запрос.Текст = "ВЫБРАТЬ
                  |    ВТ.КатегорияАВС,
                  |    ВТ.Номенклатура
                  |ИЗ
                  |    ВТ КАК ВТ
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КатегорииАВСНоменклатуры КАК КатегорииАВСНоменклатуры
                  |        ПО ВТ.Номенклатура = КатегорииАВСНоменклатуры.Номенклатура
                  |            И ВТ.Склад = КатегорииАВСНоменклатуры.Склад
                  |            И ВТ.КатегорияАВС <> КатегорииАВСНоменклатуры.КатегорияАВС";
1 shuhard
 
27.09.11
16:02
(0)ЛЕВОЕ СОЕДИНЕНИЕ
не а,
зачем левое
2 butterbean
 
27.09.11
16:04
И ВТ.КатегорияАВС = КатегорииАВСНоменклатуры.КатегорияАВС
ГДЕ
  КатегорииАВСНоменклатуры.Номенклатура ЕСТЬ NULL
3 catena
 
27.09.11
16:07
(2)Ему ж надо где не равно и где пусто.
(0)Регистр не периодический случайно?
4 Конфигуратор1с
 
27.09.11
16:13
(3) нет. Независимый, непериодический
5 Жан Пердежон
 
27.09.11
16:14
(0) так левое соединение для того и предназначено, чтобы выбрать все записи из одной таблицы+некоторые из другой
6 Конфигуратор1с
 
27.09.11
16:14
(5) хорошо, какое тогда?
7 Жан Пердежон
 
27.09.11
16:17
полное и условия в где
8 butterbean
 
27.09.11
16:17
(6) ты сделал как в (2)??
9 Конфигуратор1с
 
27.09.11
16:18
(8) мне нужно где не равны категории и пустые значения
10 butterbean
 
27.09.11
16:18
(9) это как раз (2)
11 Жан Пердежон
 
27.09.11
16:20
кстати, (2) тоже вроде подойдет
12 Конфигуратор1с
 
27.09.11
16:26
ВЫБРАТЬ
                  |    ВТ.КатегорияАВС,
                  |    ВТ.Номенклатура
                  |ИЗ
                  |    ВТ КАК ВТ
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КатегорииАВСНоменклатуры КАК КатегорииАВСНоменклатуры
                  |        ПО ВТ.Номенклатура = КатегорииАВСНоменклатуры.Номенклатура
                  |            И ВТ.Склад = КатегорииАВСНоменклатуры.Склад
                  |            И ВТ.КатегорияАВС = КатегорииАВСНоменклатуры.КатегорияАВС  ГДЕ
 КатегорииАВСНоменклатуры.Номенклатура ЕСТЬ NULL ===так?
13 butterbean
 
27.09.11
16:27
да, проверил бы уже давно
14 Конфигуратор1с
 
27.09.11
16:29
так проверил - вытягивает все записи таблицы
15 Конфигуратор1с
 
27.09.11
16:31
точнее через раз - первый раз формирую - пустой. второй раз формирую - все записи
16 Конфигуратор1с
 
27.09.11
16:34
Я выбираю записи запросом вывожу в таблицу. Дальше пользователи их правят, Сравнить какие изменились и только их записать в регистр. Не получается отобрать измененные(((
17 Конфигуратор1с
 
27.09.11
17:14
получилось так
   Запрос.Текст = "ВЫБРАТЬ
                  |    Вложенный.Номенклатура,
                  |    Вложенный.КатегорияАВС,
                  |    Вложенный.Склад,
                  |    Вложенный.КатегорияАВС1
                  |ИЗ
                  |    (ВЫБРАТЬ
                  |        ВТ.КатегорияАВС КАК КатегорияАВС,
                  |        ВТ.Номенклатура КАК Номенклатура,
                  |        ЕСТЬNULL(КатегорииАВСНоменклатуры.КатегорияАВС, ЗНАЧЕНИЕ(Перечисление.КатегорииАВС.ПУстаяССылка)) КАК КатегорияАВС1,
                  |        ВТ.Склад КАК Склад
                  |    ИЗ
                  |        ВТ КАК ВТ
                  |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КатегорииАВСНоменклатуры КАК КатегорииАВСНоменклатуры
                  |            ПО ВТ.Номенклатура = КатегорииАВСНоменклатуры.Номенклатура
                  |                И ВТ.Склад = КатегорииАВСНоменклатуры.Склад) КАК Вложенный
                  |ГДЕ
                  |    Вложенный.КатегорияАВС <> Вложенный.КатегорияАВС1";
18 Жан Пердежон
 
27.09.11
17:22
(16) а просто набор записей регистра с отбором вывести не судьба?
19 Конфигуратор1с
 
27.09.11
17:26
нет. Так как я категорию вывожу запросом по алгоритму в зависимости от объема продаж. Далее пользователи корректируют ее, в случае необходимости и записываем в регистр сведений для текущей работы с документами.
20 Конфигуратор1с
 
27.09.11
17:26
Теперь как это все в регистр впихнуть красиво?
21 БибиГон
 
27.09.11
17:32
(20) Впихнул в регистр? Тоже интересно.
22 Конфигуратор1с
 
27.09.11
17:39
НаборЗаписей = РегистрыСведений.КатегорииАВСНоменклатуры.СоздатьНаборЗаписей();
   НаборЗаписей.Отбор.Склад.Установить(СкладОтбора);
   НаборЗаписей.Прочитать();
В таком случае я отбираю все записи с данным складом. Получается, я не могу просто добавить записи, так как в случае существования записи с одинаковой номенклатурой он ругается, в то же время не могу задать отбор по списку номенклатуры. Получается нужно отбирать для каждой строки из результирующей таблицы?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан