Имя: Пароль:
1C
1C 7.7
v7: Перебрать строки табличной части документа. Реквизит строки с типом - Документ.
,
0 america2013
 
21.10.13
14:23
Приветствую Вас, участники форума!
Прошу помощи в таком вопросе: имею документ с табличной частью; в табличной части есть реквизит с типом Документ. Есть потребность перебрать так же строки этого документа из строки табличной части; выбрать строки документа проблем не вызывает, проблема выбрать строки из выбранной строки. Надеюсь описал доступно : ).

Структура:
Документ - Маршрутный лист.
Табличная часть:
Реквизит - РеализацияТоваров, типа Документ.РеализацияТоваров

Код:

Приветствую Вас, участники форума!
Прошу помощи в таком вопросе: имею документ с табличной частью; в табличной части есть реквизит с типом Документ. Есть потребность перебрать так же строки этого документа из строки табличной части; выбрать строки документа проблем не вызывает, проблема выбрать строки из выбранной строки. Надеюсь описал доступно : ). Код:

    Док = СоздатьОбъект("Документ.МаршрутныйЛист");
    
    Док.ВыбратьДокументы(ПерваяДата, ВтораяДата);
    
    Пока Док.ПолучитьДокумент() > 0 Цикл
        ТекДок = Док.ТекущийДокумент();
        
            
            ТекДок.ДокументРеализации.ВыбратьСтроки();
            Пока ТекДок.ДокументРеализации.ПолучитьСтроку() = 1 Цикл  

                СтрокаИзРеализации = ТекДок.ДокументРеализации.ТекущаяСтрока();
                
                Сообщить(СтрокаИзРеализации);
            КонецЦикла;
            
        
        
    КонецЦикла;
1 america2013
 
21.10.13
14:27
Поправочка:
Реквизит - ДокументРеализации, тип Документ.РеализацияТоваров
2 Shaman100M
 
21.10.13
14:27
А что за метод, ТекущаяСтрока() у документа?
Возможно, нужен номер строки.

ТекДок.ДокументРеализации.НомерСтроки;
3 eRik
 
21.10.13
14:39
Док = СоздатьОбъект("Документ.МаршрутныйЛист");
Док.ВыбратьДокументы(ПерваяДата, ВтораяДата);
    
Пока Док.ПолучитьДокумент() = 1 Цикл
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку() = 1 Цикл
        ТекДок = Док.РеализацияТоваров;
        ТекДок.ВыбратьСтроки();
        Пока ТекДок.ПолучитьСтроку() = 1 Цикл
            СтрокаИзРеализации = ТекДок.НомерСтроки;
            Сообщить(СтрокаИзРеализации);
        КонецЦикла;
    КонецЦикла;
КонецЦикла;
4 eRik
 
21.10.13
14:41
с учетом "поправочки"

ТекДок = ДокументРеализации;
5 eRik
 
21.10.13
14:41
ТекДок = Док.ДокументРеализации;
6 america2013
 
21.10.13
14:46
(3) Что это - .НомерСтроки? Нужно фактически указать номер конкретной строки для чтения? А как все строки выбрать? Ещё один цикл по количеству строк в документе?
7 palpetrovich
 
21.10.13
14:48
как-то так:
    "ВЫБРАТЬ
    |    МаршрутныйЛистРеализации.Ссылка КАК Ссылка,
    |    МаршрутныйЛистРеализации.Реализация КАК Реализация,
    |    РеализацияТоваровТовары.Номенклатура
    |ИЗ
    |    Документ.МаршрутныйЛист.Реализации КАК МаршрутныйЛистРеализации
    |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
    |        ПО МаршрутныйЛистРеализации.Реализация = РеализацияТоваровТовары.Ссылка
    |ИТОГИ ПО
    |    Ссылка,
    |    Реализация"
8 Rie
 
21.10.13
14:49
(6) ЧегоТоТам.ВыбратьСтроки() - прекрасно работает.
После этого обращаешься к реквизитам строк напрямую.
9 Rie
 
21.10.13
14:49
(7) Это - круто! Но это - для 8-ки :-(
10 palpetrovich
 
21.10.13
14:50
(9) аааааааа
11 Rie
 
21.10.13
14:51
+(8) Ну, естественно, не забывая ЧегоТоТам.ПолучитьСтроку().
12 america2013
 
21.10.13
14:56
(6) Это и работает в первом цикле. Но далее есть ещё один, в котором идет перебор строк документа из строки, где этот документ находится.

(11) Смотрю по отладке - после .ВыбратьСтроки() сразу переходит к конец, не проходя цикл .ПолучитьСтроку(). Хотя, строки в документе есть.
13 Mikeware
 
21.10.13
15:00
(9) вот для 7.7 :-)
ТекстЗапросаВеса="
|SELECT
|    ПутевойЛистСтроки.iddoc[ДокументПЛ]
|    , sum((1-isnull(Журн.ismark,0))*isnull($РеализацияСтроки.Коэффициент,0)*isnull($РеализацияСтроки.Количество,0)*$Единицы.Вес+isnull($ПеремещениеТМЦСтроки.Коэффициент,0)*isnull($ПеремещениеТМЦСтроки.Количество,0)*$Единицы.Вес) [Вес]
|    , sum((1-isnull(Журн.ismark,0))*case when (isnull($РеализацияСтроки.Количество,0)+isnull($ПеремещениеТМЦСтроки.Количество,0))>0 then 1 else 0 end) [КоличествоПозиций]
|    , sum((isnull(Журн.ismark,0))*isnull($РеализацияСтроки.Коэффициент,0)*isnull($РеализацияСтроки.Количество,0)*$Единицы.Вес+isnull($ПеремещениеТМЦСтроки.Коэффициент,0)*isnull($ПеремещениеТМЦСтроки.Количество,0)*$Единицы.Вес) [ВесНевывоза]
|    , sum((isnull(Журн.ismark,0))*case when (isnull($РеализацияСтроки.Количество,0)+isnull($ПеремещениеТМЦСтроки.Количество,0))>0 then 1 else 0 end) [КоличествоПозицийНевывоза]
|FROM $ДокументСтроки.ПутевойЛист AS ПутевойЛистСтроки With (NOLOCK)
|    LEFT JOIN $ДокументСтроки.Реализация AS РеализацияСтроки With (NOLOCK) ON right($ПутевойЛистСтроки.Документ,9) = РеализацияСтроки.IDDOC
|    LEFT JOIN $ДокументСтроки.ПеремещениеТМЦ AS ПеремещениеТМЦСтроки With (NOLOCK) ON right($ПутевойЛистСтроки.Документ,9) = ПеремещениеТМЦСтроки.IDDOC
|    INNER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON (($РеализацияСтроки.Номенклатура = Номенклатура.ID) OR ($ПеремещениеТМЦСтроки.Номенклатура = Номенклатура.ID))
|    INNER JOIN $Справочник.Единицы AS Единицы With (NOLOCK) ON Единицы.ID = $Номенклатура.БазоваяЕдиница
|left join _1sjourn Журн (nolock) on right($ПутевойЛистСтроки.Документ,9)=Журн.iddoc
|WHERE (ПутевойЛистСтроки.IDDOC =:ВыбДок)
|group by ПутевойЛистСтроки.iddoc
|";
14 Rie
 
21.10.13
15:01
(12) "Не верю!" (c) К.С.Станиславский
15 america2013
 
21.10.13
15:01
О_о
16 Rie
 
21.10.13
15:02
(13) Как минимум одну строку кода ты забыл :-)
17 yam
 
21.10.13
15:05
//Жжете, товарищи!  
Док = СоздатьОбъект("Документ.МаршрутныйЛист");

Док.ВыбратьДокументы(ПерваяДата, ВтораяДата);

Пока Док.ПолучитьДокумент() > 0 Цикл
    ТекДок = Док.ТекущийДокумент();
    
    ТекДок.ВыбратьСтроки();
    Пока ТекДок.ПолучитьСтроку() = 1 Цикл  
        
        ДокРеализации = ТекДок.ДокументРеализации;
        ДокРеализации.ВыбратьСтроки();
        Пока ДокРеализации.ПолучитьСтроку() = 1 Цикл
            
            Сообщить(ДокРеализации.НомерСтроки);
            
        КонецЦикла;
        
    КонецЦикла;
    
КонецЦикла;
18 Mikeware
 
21.10.13
15:06
(16) да вроде только заремленое убрал....
19 Rie
 
21.10.13
15:07
(18) Ту, в которой ЗагрузитьВнешнююКомпоненту() вызывается :-)
20 Mikeware
 
21.10.13
15:10
(19)а, ну это уже подразумевается....
21 Rie
 
21.10.13
15:12
(20) Но ТС об этом может и не знать. "Стаж: 10 дней".
22 america2013
 
21.10.13
15:14
(17) Ничего не сообщает.

Для меня странно то, что при отладке, когда получаю строку из МаршрутныйЛист
(первый цикл),
рассчитываю увидеть в табло реквизиты документа, номер, дата - есть, а напротив реквизита ДокументРеализации
(рассчитываю увидеть номер, дата и табличную часть) - пустота.
23 Rie
 
21.10.13
15:17
(22) ОК. Ну а так:
Реализации = СоздатьОбъект("Документ.РеализацияИлиКакТамОнНазывается");

В цикле:
Если Реализации.НайтиДокумент(ТекДок.ДокументРеализации)=1 Тогда
    Сообщить("Ура!");
Иначе
    Сообщить("Хрен вам, а не документ!");
КонецЕсли;

Видно чего?
24 america2013
 
21.10.13
15:20
(23)
Если Реализации.НайтиДокумент(ТекДок.ДокументРеализации)=1 Тогда
{C:\USERS\USER\DESKTOP\ПОГРУЗОЧНЫЙ ОТЧЕТ\ПОГРУЗОЧНЫЙ ОТЧЕТ V0.5.ERT(44)}: Недопустимая операция
25 america2013
 
21.10.13
15:23
ТекДок.ДокументРеализации -- пусто. Но реквизит в документе (видно на форме документа) заполнен.
26 Rie
 
21.10.13
15:23
(24) А какого типа реквизит ДокументРеализации?
(В (23) я имел в виду ТекДок из (17); впрочем, вместо ТекДок - прекрасно можно использовать Док).
27 america2013
 
21.10.13
15:24
(26) Реквизит - ДокументРеализации, тип Документ.РеализацияТоваров
28 Rie
 
21.10.13
15:29
(27) Если было написано
Реализации = СоздатьОбъект("Документ.РеализацияТоваров");
а ТекДок (или Док) взято внутри цикла
Пока Док.ПолучитьДокумент()=1
то
"Не верю!" (c) К.С.Станиславский
29 america2013
 
21.10.13
15:34
(28) Чему вы не верите?

Приведу код на данный момент, думаю, что именно он должен быть рабочим, но значение переменной - ДокРеализации - пусто(((((

    Док = СоздатьОбъект("Документ.МаршрутныйЛист");
    
    Док.ВыбратьДокументы(ПерваяДата, ВтораяДата);
    
    Пока Док.ПолучитьДокумент() > 0 Цикл
        ТекДок = Док.ТекущийДокумент();
        
            
            ДокРеализации = ТекДок.ДокументРеализации;
            ДокРеализации.ВыбратьСтроки();
            Пока ДокРеализации.ПолучитьСтроку() = 1 Цикл
                
                
                Сообщить(ДокРеализации.НомерСтроки);
            КонецЦикла;
            
    
    КонецЦикла;
30 Rie
 
21.10.13
15:36
(29) Если ДокРеализации пусто - значит, пустое значние имеет и Док.ДокументРеализации. Значит, соответствующий реквизит - попросту не заполнен.
31 america2013
 
21.10.13
15:44
(30) Но как это может быть, если я получаю МаршрутныйЛист (вижу его номер, дату...), открываю в базе - табличная часть заполнена, а при обращении программно к документу и его табличной части, выходит, что - не заполнено? (прям, мой 9 вагон пустой (с) М.Задорнов). Я уже было подумал, что там изврат какой-то, типа при открытии документа табличная часть заполняется каждый раз по-новой, но нет там такого к счастью.
32 Mikeware
 
21.10.13
15:47
(31) откройте для себя отладчик....
33 Rie
 
21.10.13
15:48
(31) Чудес не бывает.
Может, в форме документа Вы видите вычисляемую текстовую колонку с документом реализации. Может, ещё чего.
34 america2013
 
21.10.13
15:51
(32) именно так я и увидел, что там ничего не выводится, вообще табличная часть пустая.

(33) согласен, что не бывает... но реквизит на форме имеет тип - Документ.РеализацияТоваров.
35 abfm
 
21.10.13
15:53
Док = СоздатьОбъект("Документ.МаршрутныйЛист");
    
    Док.ВыбратьДокументы(ПерваяДата, ВтораяДата);
    
    Пока Док.ПолучитьДокумент() > 0 Цикл
        ТекДок = Док.ТекущийДокумент();
        
            
           Вот тут выбери и получи строку ТекДок

            ДокРеализации = ТекДок.ДокументРеализации;
            ДокРеализации.ВыбратьСтроки();
            Пока ДокРеализации.ПолучитьСтроку() = 1 Цикл
                
                
                Сообщить(ДокРеализации.НомерСтроки);
            КонецЦикла;
            
    
    КонецЦикла;
36 Rie
 
21.10.13
15:54
(34) А учитываете ли Вы, что Отладчик в 7-ке несколько своеобразно работает с внешними отчётами и обработками?
В частности, у него иногда хватает ума сохранить открытую для отладки обработку у себя, любимого - и показывать вовсе не те операторы, которые реально исполняются?
37 america2013
 
21.10.13
16:00
(35) так я вроде это и делаю....
38 abfm
 
21.10.13
16:02
ТекДок.ВыбратьСтроки();
Пока ТекДок.ПолучитьСтроку() = 1 Цикл
Где эти строки?
39 america2013
 
21.10.13
16:13
(38) Я ПОНЯЛ ВАС!!! Бесконечно благодарен!!!!!!

Суть дела оказалась в чем:

    Док = СоздатьОбъект("Документ.МаршрутныйЛист");
    
    Док.ВыбратьДокументы(ПерваяДата, ВтораяДата);
    
    Пока Док.ПолучитьДокумент() > 0 Цикл
        ТекДок = Док.ТекущийДокумент();
        
            ТекДок.ВыбратьСтроки();
            Пока ТекДок.ПолучитьСтроку() = 1 Цикл
                
                
                ДокРеализации = ТекДок.ДокументРеализации;
                ДокРеализации.ВыбратьСтроки();
                
                Пока ДокРеализации.ПолучитьСтроку() = 1 Цикл
                    
                    Сообщить(ДокРеализации.ТМЦ); //нужные реквизиты из табличной части
                КонецЦикла;
                
            КонецЦикла;

    КонецЦикла;
40 america2013
 
21.10.13
16:14
Благодарю всех участников за помощь!!!
41 1dvd
 
22.10.13
07:03
(40) О том, что ДокументРеализации находится в табличной части, надо было говорить заранее