Имя: Пароль:
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
НаборЗаписей = РегистрыСведений.КатегорииАВСНоменклатуры.СоздатьНаборЗаписей();
   НаборЗаписей.Отбор.Склад.Установить(СкладОтбора);
   НаборЗаписей.Прочитать();
В таком случае я отбираю все записи с данным складом. Получается, я не могу просто добавить записи, так как в случае существования записи с одинаковой номенклатурой он ругается, в то же время не могу задать отбор по списку номенклатуры. Получается нужно отбирать для каждой строки из результирующей таблицы?