Имя: Пароль:
1C
1C 7.7
v7: Запрос в 7.7 по 2-м складам
0 ShadowMind
 
01.11.11
10:58
Помогите разобраться с запросом в 7.7. Задача - получить список номенклатуры, по которой есть остатки по 2-м складам.
1 ShadowMind
 
01.11.11
11:01
код такой

           ТекстЗапросаОстатков = "
       |Номенклатура    = Регистр.ОстаткиТМЦ.Номенклатура;
       |Количество        = Регистр.ОстаткиТМЦ.Количество;
       |Скл = Регистр.ОстаткиТМЦ.Склад;
       |СклТип = Регистр.ОстаткиТМЦ.Склад.Тип;
       |Функция КоличествоКонОст = КонОст(Количество);
       |Группировка Скл;
       |
       |Группировка Номенклатура без групп;
               |Условие(Скл = Склад);";

   ЗапросПоОстаткам = СоздатьОбъект("Запрос");  
   Если ЗапросПоОстаткам.Выполнить(ТекстЗапросаОстатков) = 0 Тогда
       Возврат;
   КонецЕсли;

   СписокНоменклатуры = СоздатьОбъект("СписокЗначений");
   Пока ЗапросПоОстаткам.Группировка(1) = 1 Цикл
       Пока ЗапросПоОстаткам.Группировка(2) = 1 Цикл
           Если ЗапросПоОстаткам.КоличествоКонОст > 0 Тогда
               СписокНоменклатуры.ДобавитьЗначение(ЗапросПоОстаткам.Номенклатура);
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;
2 ShadowMind
 
01.11.11
11:03
Проблема состоит в том, что когда я пытаюсь добавить в условие "Условие((Скл = Склад1) Или (Скл = Склад2));" у меня выдается пустой результат запроса.

Что я делаю не так?
3 ShturmanJorj
 
01.11.11
11:05
А почему не создать списокЗначений Склады, куда поместить Склад1 и склад2 и условие(Склад в Склады)
4 FN
 
01.11.11
11:06
склады в список
Условие(Скл в списокскладов)
5 1Сергей
 
01.11.11
11:06
список значений ещё не предлагали?
6 ShadowMind
 
01.11.11
11:10
Список значений тоже пробовал, вот так:

   Склад1 = СоздатьОбъект("Справочник.Склады");
   Склад1.ВыбратьЭлементы();
   Склад1.НайтиПоКоду(" 5",0);
   Склад2 = СоздатьОбъект("Справочник.Склады");
   Склад2.ВыбратьЭлементы();
   Склад2.НайтиПоКоду(" 1",0);    
   Склады = СоздатьОбъект("СписокЗначений");
   Склады.ДобавитьЗначение(Склад1);
   Склады.ДобавитьЗначение(Склад2);
   
   ТекстЗапросаОстатков=ТекстЗапросаОстатков + "Условие(Скл В Склады);";

Может я неправильно значения передаю?...
7 ЧеловекДуши
 
01.11.11
11:12
Однозначно автору за книги :)
Поди на 8-ке так же пишет :DDDD
8 ДенисЧ
 
01.11.11
11:13
Склады.ДобавитьЗначение(Склад1.ТекущийЭлемент());
Склады.ДобавитьЗначение(Склад2.ТекущийЭлемент());

это как минимум
9 Ёпрст
 
01.11.11
11:13
(6)
 Склад = СоздатьОбъект("Справочник.Склады");
 Если  Склад.НайтиПоКоду("5",0)=1 Тогда
   Склады.ДобавитьЗначение(Склад.ТекущийЭлемент());
 КонецЕсли;
 Если  Склад.НайтиПоКоду("1",0)=1 Тогда
   Склады.ДобавитьЗначение(Склад.ТекущийЭлемент());
 КонецЕсли;
10 ShadowMind
 
01.11.11
11:14
(7) На семерке не писал до этого, поэтому использую схемы, которые увидел в тексте... на восьмерке я вообще такими схемами не пользуюсь...
11 ЧеловекДуши
 
01.11.11
11:14
Склады = СоздатьОбъект("СписокЗначений");

 Склад1 = СоздатьОбъект("Справочник.Склады");

  Склад1.НайтиПоКоду("5");
   Склады.ДобавитьЗначение(Склад1.ТекущийЭлемент());

   Склад2.НайтиПоКоду("1");    
Склады.ДобавитьЗначение(Склад1.ТекущийЭлемент());

Вот так
12 ЧеловекДуши
 
01.11.11
11:15
(10)8-ка вообще это выходец из 7-ки, нечего изобретать.
13 ЧеловекДуши
 
01.11.11
11:15
+(11) Склад2 замени на Склад1
14 ЧеловекДуши
 
01.11.11
11:16
+(10)Ты в 8-ке тоже объекты добавляешь?
15 ShadowMind
 
01.11.11
12:40
Спасибо, что показали как список передавать, теперь у меня на строку
Пока ЗапросПоОстаткам.Группировка(2) = 1 Цикл
ошибка вылетает: "Не было обращения к старшим уровням выборки."
кто расскажет о чем это? ну и как исправить...
16 ShadowMind
 
01.11.11
12:43
(14) На восьмерке я бы написал такой код:
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ТоварыНаСкладахОстатки.Номенклатура,
   |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток
   |ИЗ
   |    РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад В (&Склады)) КАК ТоварыНаСкладахОстатки
   |
   |СГРУППИРОВАТЬ ПО
   |    ТоварыНаСкладахОстатки.Номенклатура";
   
   Запрос.УстановитьПараметр("Склады", мСклады);
   мСклады = Новый СписокЗначений;
   мСклады.Добавить(Справочники.Склады.НайтиПоКоду(" 5");
   мСклады.Добавить(Справочники.Склады.НайтиПоКоду(" 1");
   Результат = Запрос.Выполнить();
   Выборка = Результат.Выбрать();
   
   СписокНоменклатуры = Новый СписокЗначений;
   Пока Выборка.Следующий() Цикл
       Если Выборка.КоличествоОстаток > 0 Тогда
           СписокНоменклатуры.Добавить(Выборка.Номенклатура);
       КонецЕсли;
   КонецЦикла;

И в восьмерке я в список передаю ссылки на найденные объекты. Что в семерке конструкция НайтиПоКоду("5") получает объект мне невдомек, так как в 8-ке это ссылка...
17 Ёпрст
 
01.11.11
12:54
(15) а что не понятно в фразе "Не было обращения к старшим уровням выборки."

ты же первую группировку не обходишь, а пытаешься поиметь значения вложенной.
18 ShadowMind
 
01.11.11
13:51
(17) Скажем так... Я понимаю смысл ошибки, вот только что она значит в контексте 1С7.7, мне не совсем понятно... Я привык работать с восьмеркой, и там я группировки обхожу только при использовании итогов, но вот как делается обход результата запроса в 7.7 мне не понято...
Поэтому вопрос еще открыт: Что у меня в коде делается неправильно, что надо исправить?
Знакомых "семерошников" у меня нет, поэтому вся надежда на Вас, дорогие форумчане...
19 Ёпрст
 
01.11.11
13:53
(18) обойти вышестоящую группировку вестимо, там же по-русски ошибку тебе пишет 1с-ина.
20 Ёпрст
 
01.11.11
13:54
21 ShadowMind
 
01.11.11
13:57
(19)(20) То есть нужно просто обратиться к 1-й группировке?
22 Ёпрст
 
01.11.11
13:58
(21) какой догадливый
23 ShadowMind
 
01.11.11
13:58
Тогда почему в случае |Условие(Скл = Склад); 1с-ина мне ошибку не выдает?
24 1Сергей
 
01.11.11
14:03
(23) а почему должна выдавать?
25 Ёпрст
 
01.11.11
14:03
(23) и на основании чего должна быть ошибка ?
26 ShadowMind
 
01.11.11
14:41
(24)(25) А почему бы и нет?
27 ShadowMind
 
01.11.11
14:43
Проблему решил радикально... убрал в запросе группировку по складам, ну и соответственно в самом коде 2-ю группировку...
28 Ёпрст
 
01.11.11
14:43
(26)пора бы тебе уже наконец читать ЖКК.
29 ShadowMind
 
01.11.11
14:43
Спасибо всем, кто помогал...
30 ShadowMind
 
01.11.11
14:44
(28) ЖКК уже позапрошлый век, если 8.2 считать текущим...
Ошибка? Это не ошибка, это системная функция.