Имя: Пароль:
1C
 
запрос к табличной части документа
0 salikoff
 
27.12.10
01:07
здравствуйте. Подскажите, пожалуйста, почему я при запросе к табличной части документа получаю таблицу значений, а не обычный результат запроса (например, когда делаю запрос к справочнику)?
Как мне с этой таблицей значений работать в самом запросе (при составлении сложного запроса)? Например хочу делать JOIN к результату запроса из табличной части документа, но ничего не выходит, 1С "вылетает" с сообщением «Ошибка СУБД ....»
1 Garkin
 
27.12.10
01:13
(0) Это все потому что запрос ты делаешь не к табличной части документа.
2 Либерал
 
27.12.10
01:18
странный ты какой-то... и темный не начитаный, даж в типовые лень посмотреть...

ВЫБРАТЬ ДокТабЧасть.Ссылка.Номер,
ДокТабЧасть.СсылкаДата,
ДокТабЧасть.НомерСтроки
ИЗ Документ.МойЛокумент.ИмяТабЧасти КАК ДокТабЧасть


и ничего никуда не вылетает
3 shurik_klgd
 
27.12.10
01:27
(2) цитата из типовой?:)
4 salikoff
 
27.12.10
02:17
Я вижу, мой вопрос остался непонятым. Поясню на примере:

ВЫБРАТЬ Номенклатура.Артикул ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ  Номенклатура.Родитель.Наименование = "ЗАПЧАСТИ Volvo"
И    
   Номенклатура.Артикул НЕ В (ВЫБРАТЬ
   Инвентаризация.Товары.Номенклатура.Артикул
ИЗ
   Документ.Инвентаризация КАК Инвентаризация
ГДЕ
   Инвентаризация.Номер = "N000000012")

Я хочу в этом запросе получить список номенклатурных позиций в определенной группе справочника (запчасти VOLVO) при этом исключить из списка те позиции, которые имеются в табличной части определенного документа (инвентаризация).
В подзапросе результатом является таблица значений. В общем-то хрен с ней, с возвращаемым типом (пусть хоть это будет таблицей значений), мне хотелось бы чтобы запрос работал и задача была решена
5 Один С
 
27.12.10
02:24
Номенклатура НЕ В (ВЫБРАТЬ
    ИнвентаризацияТовары.Номенклатура
ИЗ
    Документ.Инвентаризация.Товары КАК ИнвентаризацияТовары
ГДЕ
    Инвентаризация.Номер = "N000000012"
6 shurik_klgd
 
27.12.10
02:35
ИЗ Справочник.Номенклатура как Номенлатура
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Инвентаризация Как Инвентаризация
ПО (Номенклатура = Инвентаризация.Номенклатура)
ГДЕ Инвентаризация.Номенклатура ЕСТЬ NULL)
...
както так
7 fadeik86
 
27.12.10
03:27
Не проще так сделать. Только здесь документ не Инвентаризация, а поступление (но переделать труда не составит). Всю номенклатуру в виртуальную таблицу, потом в запросе фильтруешь по конкретному документу.Проверил работает. И еще в первом запросе надо поставить родителя из какого ты хочешь выбирать, чтобы было только по конкретной папке.

Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
   МенеджерВТ = Запрос.МенеджерВременныхТаблиц;
   Запрос.Текст = "
   |ВЫБРАТЬ
   |    Номенклатура.Ссылка КАК Товар
   |ПОМЕСТИТЬ ТабТовар
   |ИЗ
   |    Справочник.Номенклатура КАК Номенклатура
   |СГРУППИРОВАТЬ ПО
   |   Номенклатура.Ссылка";
       
   Запрос.Выполнить();
   Список1 = Новый СписокЗначений;
   Для Каждого Элем Из Поступление.Товары цикл
       Список1.Добавить(Элем.Номенклатура.Ссылка);
   КонецЦикла;
       
   Запрос1 = Новый Запрос;
   Запрос1.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
   Запрос1.Текст = "
   |ВЫБРАТЬ
   |    ТабТовар.Товар
   |ИЗ
   |    ТабТовар КАК ТабТовар
   |ГДЕ
   |   (ТабТовар.Товар.ЭтоГруппа = Ложь) И (ТабТовар.Товар НЕ В (&СписокТоваров))  
   |СГРУППИРОВАТЬ ПО
   |    ТабТовар.Товар";
       
   Запрос1.МенеджерВременныхТаблиц = МенеджерВТ;
   Запрос1.УстановитьПараметр("СписокТоваров",Список1);
   Выборка = Запрос1.Выполнить().Выбрать();
   Пока Выборка.Следующий() цикл
        Сообщить(Выборка.Товар);
   КонецЦикла;
8 salikoff
 
27.12.10
03:57
(6) В том и дело, что я не могу воспользоваться соединением,
так как после предиката ПО я не могу ставить знак равенства.
Попробуйте сами в консоли запросов сделать запрос к табличной части любого документа. Результатом будет ТАБЛИЦА ЗНАЧЕНИЙ! То есть я не могу задать условие соединения, так как не могу сравнивать таблицу значений с конкретным значением.
(7) Как-то это чересчур громоздко получается! Некрасиво, что приходится в цикле формировать список значений, по которому потом нужно фильтровать в запросе. Хочется все сделать внутри запроса и выполнить в консоли запросов.
9 fadeik86
 
27.12.10
04:41
В одном запросе
   Запрос = Новый Запрос;
   Запрос.Текст = "
   |ВЫБРАТЬ
   |    Номенклатура.Ссылка КАК Товар
   |ИЗ
   |    Справочник.Номенклатура КАК Номенклатура
   |ГДЕ
   |   (Номенклатура.Ссылка.ЭтоГруппа = Ложь) И
   |   (Номенклатура.Ссылка НЕ В (
   |   ВЫБРАТЬ
   |   ПоступлениеТоваровУслугТовары.Номенклатура.Ссылка КАК Товар1
   |   ИЗ
   |   Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
   |   ГДЕ ПоступлениеТоваровУслугТовары.Ссылка = &ВыбДок    
   |   СГРУППИРОВАТЬ ПО
   |   ПоступлениеТоваровУслугТовары.Номенклатура))
   |   И (Номенклатура.Ссылка = &ВыбТовар)
   |СГРУППИРОВАТЬ ПО
   |   Номенклатура.Ссылка";
   
   Запрос.УстановитьПараметр("ВыбДок",Поступление);
   Запрос.УстановитьПараметр("ВыбТовар",ВыбНомен);
   Выборка = Запрос.Выполнить().Выбрать();
   Пока Выборка.Следующий() цикл
        Сообщить(Выборка.Товар);
   КонецЦикла;
10 fadeik86
 
27.12.10
06:03
Хотел спросить, это так действительно сделано или это просто для примера?
ВЫБРАТЬ Номенклатура.Артикул ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ  Номенклатура.Родитель.Наименование = "ЗАПЧАСТИ Volvo"
11 BadTouch
 
27.12.10
06:49
Странно вроде не пятница...
(8) Используй таблицу не "Документ.Инвентаризация", а "Документ.Инвентаризация.ТЧ" и будет тебе счастье...
12 salikoff
 
27.12.10
15:17
(11) Да, вроде заработало. Счастье обретено!
2 + 2 = 3.9999999999999999999999999999999...