Имя: Пароль:
1C
1C 7.7
v7: Обработка результата запроса
0 Patrio_
O_Muerte
 
11.05.13
13:26
Есть запрос, по справочнику подчиненному главному справочнику "Акции". Пытаюсь получить всю номенклатуру в соответствие с условиями. Запрос получается, нужный результат вижу в таблице значений, куда я выгружаю результат таблицы - то есть все акции и товары принадлежащие этим акциям.
Проблема заключается в обходе результата запроса по групировкам - отладчик корректно обрабатывает только одну акцию пока не понял какую - последнюю чтоли...
Если точнее, то в первую группировку отладчик входит и обходит все полученные акции, а вот во вторую группировку я вхожу только по одной акции, хотя в ТЗ я вижу что есть товары и по другим акциям и их тоже надо проверить на актуальность.


Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Обрабатывать НеПомеченныеНаУдаление;
|Номенклатура = Справочник._ИсходнаяНоменклатура.Номенклатура;
|Владелец = Справочник._ИсходнаяНоменклатура.Владелец;
|Количество = Справочник._ИсходнаяНоменклатура.Количество;
|ЕИ = Справочник._ИсходнаяНоменклатура.ЕИ;
|ТипВхождения = Справочник._ИсходнаяНоменклатура.ТипВхождения;
|Сумма = Справочник._ИсходнаяНоменклатура.Сумма;
|Группировка Владелец без групп;
|Группировка Номенклатура без групп;
|Условие(Владелец.Активно.Получить(ТекущаяДата()) = 1);
|Условие(Владелец в СЗАкций);
|"//}}ЗАПРОС
;
               
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
   Возврат;
КонецЕсли;
               
Запрос.Выгрузить(ТЗИсхНом);
ТЗИсхНом.Выгрузить(СЗИсхНом,,,"Номенклатура");
       
СПАктуальныхАкций = СоздатьОбъект("СписокЗначений");
               
ТЗНом = СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТЗНом);
               
Пока Запрос.Группировка(1) = 1 Цикл
//сюда входим нормально
   Акц = Запрос.Владелец;
               
   Если Акц.Тип = 1 Тогда
   
       Пока Запрос.Группировка(2) = 1 Цикл
//сюда входим только по одной акции        
       КонецЦикла;
   ИначеЕсли Акц.Тип = 2 Тогда
           
       Пока Запрос.Группировка(2) = 1 Цикл

       Конеццикла;
   ИначеЕсли Акц.Тип = 3 Тогда
       Пока Запрос.Группировка(2) = 1 Цикл

       Конеццикла;
   ИначеЕсли Акц.Тип = 4 Тогда
       Пока Запрос.Группировка(2) = 1 Цикл

       КонецЦикла;
   КонецЕсли;
КонецЦикла;

Подскажите, как победить проблему?
1 Злопчинский
 
11.05.13
13:34
|Условие(Владелец.Активно.Получить(ТекущаяДата()) = 1);
наверное можно убрать, написав простое обращение к реквизиту - периодику возьмет на конец даты запроса
2 Cthulhu
 
11.05.13
13:34
При использовании в запросе периодического реквизита - получается его значение на конец периода.
Установи период, добавь переменную - периодический реквизит (прямо-тупо) и поставь услове по прямому равенству этой переменной.
И - так, на всякий случай - добавь функцию (если ничего не надо - хотя бы Счётчик)
3 Cthulhu
 
11.05.13
13:34
(1): у дур... эээ, дворников мысли сходятся?.. ))
4 Злопчинский
 
11.05.13
13:35
Если Акц.Тип = 1 Тогда
   
       Пока Запрос.Группировка(2) = 1 Цикл
//сюда входим только по одной акции
.
а почему должно быть на 100% иначе - если вверху у тебя стоит ограничение по типу = 1?
5 Злопчинский
 
11.05.13
13:35
(3) угу...
6 Злопчинский
 
11.05.13
13:36
(3) уже не первый раз.
тут как-то раз на мисте писал ответ на вопрос - практически одновременно с кем-то - так ответы пор коду почти на 100% сошлись.. ;_)
7 Patrio_
O_Muerte
 
11.05.13
13:40
(4)Наверное не совсем понятно - во вторую группировку входит только один раз вне зависимости от того, сколько акций и с какими типами у меня есть.
Вернее надо было написать так

Пока Запрос.Группировка(2) = 1 Цикл
//входит во вторую группировку только один раз вне зависимости от любых условий (типов).
8 Злопчинский
 
11.05.13
13:43
используй систему разработки "сверху вниз". пиши крупными блоками. потом постепенно детализируй.
.
убери на! все лишнее!!! все условниые операторы и прочую логику.
.
для начала добейся простого обхода двух вложенных группировок.
Пока Запрос.Группировка(1) = 1 Цикл
//сюда входим нормально
//вывести группировку1
   Пока Запрос.Группировка(2) = 1 Цикл
//вывести группировку2
.
результат - в студжию!!
9 Patrio_
O_Muerte
 
11.05.13
13:52
(8)В простом варианте обход результата корректный.
10 Patrio_
O_Muerte
 
11.05.13
13:53
+(9)Получил все акции и товары по акциям и вывел в строку сообщений.
11 Злопчинский
 
11.05.13
13:58
(9) дальше помочь или сам справишься? ;-)
12 Злопчинский
 
11.05.13
14:00
дальше делай так:
Пока Запрос.Группировка(2) = 1 Цикл
 если Акц.Тип=1
 тогда
    //1
 иначеесли Акц.Тип=2
 тогда
    //2
 ...
 КонецЕсли;
Конеццикла;
13 Patrio_
O_Muerte
 
11.05.13
14:00
Лучше ткни носом где я неправ, а то чет торможу.
14 Patrio_
O_Muerte
 
11.05.13
14:01
(12)Бл*, именно от этого я и хотел избавиться :)
Но видимо не судьба..
15 Злопчинский
 
11.05.13
14:02
а то ты если положил на верхний уровень
и вторая группировка у тебя отрабатывает как минимум один раз в каком то условии - ПРИЧЕМ ПО ПОЛНОМУ ЦИКЛУ ОБХОДА.
.
а при другом значении типа - ты же НЕ ПОЗИЦИОНИРУЕШЬСЯ В НАЧАЛО второй группировки
16 Patrio_
O_Muerte
 
11.05.13
14:06
(15)Ну так яж вторую группировку обхожу именно в пределах одной акции а не всю целиком, поэтому я полагаю, что вторая группировка должна стартовать с самого начала каждой группировки второго уровня.
А тут получается фуй.
17 Злопчинский
 
11.05.13
14:08
(16) надо подумать, возможно туплю
18 Злопчинский
 
11.05.13
14:10
Все равно в (0) херня написана.
независимо от типа акции ты ВСЕ РАВНО обходишь вторую группировку. всегда.
.
поэтому в (12) более адекватный вариант
19 Patrio_
O_Muerte
 
11.05.13
14:12
(18)Не ну я согласен, что в (12) код более корректен, но бл*ха муха придется попотеть, чтобы привести к такому варианту..
Кстати а метод ВНачалоВыборки() не поможет?
20 Cthulhu
 
11.05.13
14:13
(0):
и эцсамое. тест не полностью виден - поэтому фигзнает, возможно у тебя в каком-то внутреннем цикле обхода по внутренней группировке есть "Прервать"?.. Так вот, ЕСЛИ ЕСТЬ - то это охренительная ошибка, результатом которой является полный улёт позиционирования обхода группировки. и в результате слетание всего обхода результата запроса.
21 Cthulhu
 
11.05.13
14:14
(19): а толку?
22 Злопчинский
 
11.05.13
14:16
(19) мозг включи.
в твоем коде для текущего значения первой группировки ты обходишь вторую группировку. всегда. независимо от типа первой группировки.
ну так и напиши именно так.
.
а во второй группировке по типу первой делай что надо.
23 Злопчинский
 
11.05.13
14:17
(20) присоединяюсь к мнению.
24 Patrio_
O_Muerte
 
11.05.13
14:22
(20)Есть такая вещь - Прервать присутствует.
Будем починять, благодарю за подсказку
25 Cthulhu
 
11.05.13
14:32
(24): "спасибо" не капает, ВМ в профиле.
26 Злопчинский
 
11.05.13
14:36
(25) возьми еще участок в придачу! ;-) и не трогай жителей ;-)
27 Cthulhu
 
11.05.13
14:49
(26): это я от Ёпрст-а научился.
а чо, пусть себе висит. жрать не просит, и ничего никто не требует. кто посчитает нужным - тот сколько посчитает нужным копеек и кинет, а нет - так нет. )))