Имя: Пароль:
1C
1C 7.7
v7: Почему из документа исчезает операция?
,
0 САГвиник
 
26.12.11
13:18
Нужно выбрать документы с определенными счетами, а затем выбрать из полученного набора те документы, в которых встречаются заданные проводки. Но ни черта не выходит, бо после записи документов в таблицу значений атрибут "операция" в этих документах почему-то становится неагрегатным и никакие ухищрения, вроде представленных ниже, не помогают.

ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Документ","Документ");
ТЗ.НоваяКолонка("Операция","Операция");

Ит=СоздатьОбъект("БухгалтерскиеИтоги");
   Если Ит.ВыполнитьЗапрос(Дата1, Дата2, "10.3.1,10.6",,,, "Проводка") = 0 Тогда
       Возврат;
   КонецЕсли;

   Докт=СоздатьОбъект("Документ");
   Ит.ВыбратьПериоды();
   Пока Ит.ПолучитьПериод() = 1 Цикл
       Опер = Ит.Операция;
       Док= Опер.Документ;
       Докт.НайтиДокумент(Док);
       ТЗ.НоваяСтрока();
       ТЗ.Документ=Докт.ТекущийДокумент();
       ТЗ.Операция=Докт.Операция;
       ТЗ.Счета="10.3.1,10.6";
   КонецЦикла;

Судя по отладчику, в ТЗ записывается агрегатная операция, но
дальше при попытке обратиться к записанным данным (см.ниже) 1С-ка милостиво сообщает об ошибке: "Значение не представляет агрегатный объект (ВыбратьПроводки)":

ТЗ.Операция.ВыбратьПроводки();

Не катит и такой вариант:

ТЗ.Документ.Операция.ВыбратьПроводки();

Со списком значений такая же фигня. Что не так и как выкрутиться?
1 GLazNik
 
26.12.11
13:25
А конечная то цель какая?
Не проще ли:

Опер = СоздатьОбъект("Операция");
Опер.НайтиОперацию(ТЗ.Документ);
Опер.ВыбратьПроводки();

Как-то так... заполнение ТЗ тоже оставляет вопросы... периодичность "Проводка", а если в документе несколько проводок?
2 Андрей_Андреич
 
naïve
26.12.11
13:26
Опера=СоздатьОбъект("Операция");
Опера.НайтиОперацию(ТЗ.Документ.Операция);
Опера.ВыбратьПроводки();
3 САГвиник
 
26.12.11
13:28
Конечная цель - удалить лишнее :)
4 Эльниньо
 
26.12.11
13:30
(3) Что удалить? Проводки дока?
5 Андрей_Андреич
 
naïve
26.12.11
13:30
(3) Вам к раввину
6 GLazNik
 
26.12.11
13:31
(3) тогда код в одну строку:

ТЗ.УдалитьСтроки();
7 САГвиник
 
26.12.11
13:31
Не, доки с некоторыми проводками
8 GLazNik
 
26.12.11
13:33
(7) а зачем тогда проводки? ВыбратьПроводки? Нужны только документы. Разве нет?
9 САГвиник
 
26.12.11
13:36
Да, документы, но только работающие с определенными счетами. А затем из выбранных нужно удалить те, которые имеют определенные проводки. Но для последнего нужно залезть в операцию, а ее нет
10 viktor_vv
 
26.12.11
13:41
Так ты сразу в запросе наложи условия на корреспонденции.

   ТЗ = СоздатьОбъект("ТаблицаЗначений") ;
   ТЗ.НоваяКолонка("Документ","Документ");
   ТЗ.НоваяКолонка("Операция","Операция");
   
   БИ = СоздатьОбъект("БухгалтерскиеИтоги");
   БИ.ВыполнитьЗапрос(фдДатаНач,фдДатаКон,"10.3.1,10.6","Перечень счетов кредита",,2,"Проводка");
   БИ.ВыбратьПериоды();
   Пока БИ.ПолучитьПериод() = 1 Цикл
           ТЗ.НоваяСтрока();
           ТЗ.Документ = БИ.Операция.Документ;
           ТЗ.Операция = БИ.Операция;
   КонецЦикла;
   
//    ТЗ.ВыбратьСтроку();    
   
   Док = СоздатьОбъект("Документ")
   ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку() = 1 Цикл
       Если Док.НайтиДокумент(ТЗ.Документ) = 1 Тогда
           Док.Удалить(0);
       КонецЕсли ;    

   КонецЦикла;
11 САГвиник
 
26.12.11
13:41
(5) А раввин знает?
12 GLazNik
 
26.12.11
13:41
(9) Видишь суслика? А он есть!
13 Vladal
 
26.12.11
13:42
(11) в (5) таки про обрезание в (3) "удалите всё лишнее"
14 Vladal
 
26.12.11
13:44
(12) и (9) - а операция включена или нет? Может, её в ЖО отключили?
15 GLazNik
 
26.12.11
13:45
(10) а почему собственно только кредита ("Перечень счетов кредита")? Выборка даст обороты между счетами, но они могут быть как дебетовые так и кредитовые. Но если добавить условие на ДО() > 0, то можно использовать.
16 viktor_vv
 
26.12.11
13:47
(15) Да я примерно написал, я ж не знаю какие условия там он хочет накладывать.

Если таки надо залезть в операции, то все там работает.

   Док = СоздатьОбъект("Документ")
   ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку() = 1 Цикл
       ТекОпер = ТЗ.Операция ;
       ТекОпер.ВыбратьПроводки();
       Пока ТекОпер.ПолучитьПроводку() = 1 Цикл
           Сообщить(""+ТекОпер.Операция+"  "+ТекОпер.Дебет.Счет) ;
           Если ТекОпер.Дебет.Счет = СчетПоКоду("79") Тогда
               
           КонецЕсли ;    
       КонецЦикла;            
       //Если Док.НайтиДокумент(ТЗ.Документ) = 1 Тогда
       //    Док.Удалить(0);
       //КонецЕсли ;    

   КонецЦикла;
17 САГвиник
 
26.12.11
13:48
(10) Не могу. Мне нужно указать конкретную проводку. А как ее выделить запросом?
18 GLazNik
 
26.12.11
13:48
(14) За доли секунды между запросом к БИ и циклом по ТЗ? Сомневаюсь
19 viktor_vv
 
26.12.11
13:49
(17) Я не помойму, что значит конкретную проводку. Как ты ее идентифицируешь ?
20 viktor_vv
 
26.12.11
13:49
(19)+ Смотри (16) это обход поводок по операциям в ТЗ.
21 Vladal
 
26.12.11
13:50
(18) Нет, в принципе - открыть проводки проблемного документа в ЖО и посмотреть - есть их там или нет, и активные или отключены.
22 GLazNik
 
26.12.11
13:51
(21) Как они могут быть выключенны если уже попали в Ит.ВыполнитьЗапрос?
23 САГвиник
 
26.12.11
13:52
(19) Счет дебета и счет кредита
24 САГвиник
 
26.12.11
13:53
(16) Согласен, работает, но... пока не сделаешь запрос
25 viktor_vv
 
26.12.11
13:55
(24) Чаво ? Какой запрос ? Ты (16) вставь в (10). У меня че-то все рабоает в таком варианте.
26 viktor_vv
 
26.12.11
14:00
Сорри, че-то у меня тоже не работает :).
27 САГвиник
 
26.12.11
14:07
Тогда че, и впрямь к раввину?
28 GLazNik
 
26.12.11
14:07
(26) Думается мне, что нужно заменить

ТекОпер = ТЗ.Операция ;

на

ТекОпер = СоздатьОбъект("Операция");
ТекОпер .НайтиОперацию(ТЗ.Документ);
29 viktor_vv
 
26.12.11
14:13
Там через точку он операцию не видит. Вот так работает.

   ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку() = 1 Цикл
       ТекДок = ТЗ.Документ;
       ТекОпер = ТекДок.Операция ;
       //Сообщить(""+ТЗ.Документ.Операция);
       ТекОпер.ВыбратьПроводки();
       Пока ТекОпер.ПолучитьПроводку() = 1 Цикл
           Сообщить(""+ТекОпер.Дебет.Счет) ;
           Если ТекОпер.Дебет.Счет = СчетПоКоду("79") Тогда
               
           КонецЕсли ;    
       КонецЦикла;            
       //Если Док.НайтиДокумент(ТЗ.Документ) = 1 Тогда
       //    Док.Удалить(0);
       //КонецЕсли ;    

   КонецЦикла;
30 viktor_vv
 
26.12.11
14:16
И в принципе в таком варианте периодичность в запросе можешь поставить "Операция", раз уж в запросе не можешь отсечь по проводкам.
31 GLazNik
 
26.12.11
14:21
(30) Я таки уверен что в запросе (+доп условие на сумму в цикле) можно отсечь проводки, но периодичность по проводкам в любом случае лишняя.
32 viktor_vv
 
26.12.11
14:24
Ну тут тоолько гадать можно, какие условия ему нужны. Может он хочет отобрать операции по одной корреспонденции, а потом по наличию дополнительных проводок в операции с другой корреспонденцией отсечь.
33 viktor_vv
 
26.12.11
14:25
(29)+ *через две точки.
34 САГвиник
 
26.12.11
14:32
(29)(32) Условия именно такие, но я не пойму, почему у тебя работает в (29). У меня во всех случаях сбой на

ТекОпер.ВыбратьПроводки();
35 САГвиник
 
26.12.11
14:32
(28) что-то не помогает таблетка
36 САГвиник
 
26.12.11
14:44
(28)Операцию находит, но сбоит на
Пока ТекОпер.ПолучитьПроводку=1

может я что не так пишу? :

Если ТЗ.Счета="10.3.1,10.6" Тогда
               
ТекОпер = СоздатьОбъект("Операция");
ТекОпер .НайтиОперацию(ТЗ.Документ);
ТекОпер.ВыбратьПроводки();
Пока ТекОпер.ПолучитьПроводку=1 Цикл
 Если (ТекОпер.Дебет.Счет=СчетПоКоду("77")) И ( ТекОпер.Кредит.Счет=СчетПоКоду("76.1")) Тогда
                        Прервать;
Иначе
Удалять=0;
КонецЕсли;
КонецЦикла;
   
КонецЕсли;
37 Андрей_Андреич
 
naïve
26.12.11
14:55
ПолучитьПроВодку() - скобки забыл
38 GLazNik
 
26.12.11
14:59
Хех. Ожидаю строку ТЗ.Документ.Удалить() ;)
39 САГвиник
 
26.12.11
15:05
Спасибо!!! ПроВодку() - это ты хорошо сказал. Че-то совсем башка не варит. Придумали ж сделать корпоратив на понедельник :(
Хорошо хоть в обед похмелиться дали :)

Вроде пошло...

Спасибо всем