Имя: Пароль:
1C
1C 7.7
v7: Перенос операции через OLE
,
0 alexio_alexio
 
22.03.12
15:18
Прошу помочь разобраться с проблемой переноса операций чере OLE, а именно перенос субконто, которое является перечислением. Поискал, почитал, но понять не могу в чем загвоздка. Привожу свой код:
Пока Опер.ПолучитьОперацию()=1 Цикл
   Если Опер.Документ.НомерДок="0000000425" Тогда
       НовыйДок=Приемник.CreateObject("Операция");
       НовыйДок.Новая();
       НовыйДок.ДатаОперации=Опер.ДатаОперации;
       НовыйДок.Содержание=Опер.Содержание;
       Опер.ВыбратьПроводки();
       Пока Опер.ПолучитьПроводку()=1 Цикл
           НовыйДок.НоваяПроводка();
           Счет.НайтиПоКоду(Строка(Опер.Кредит.Счет));
           НовыйДок.Кредит.Счет=Счет.ТекущийСчет();
           
           Для Инд = 1 По Счет.КоличествоСубконто() Цикл  
               Субк = Счет.ВидСубконто(Инд);
               Тип = Субк.ТипСубконто();
               Вид = Опер.Кредит.Счет.ВидСубконто(Инд);
               Идент = Субк.Идентификатор();
               
               Если Найти(Тип,"Перечисление")>0 Тогда
                   Номер = Опер.Кредит.Субконто(Инд).ПорядковыйНомер();      
                   ЗнСубк=Приемник.Перечисление.ПолучитьАтрибут(Вид).ЗначениеПоИдентификатору(Идент);
                   Опер.Кредит.Субконто(Инд,ЗнСубк);
               Иначе
                   ТипСубк = Приемник.CreateObject(Тип);  
                   Если ТипСубк.НайтиПоРеквизиту("IDD",Опер.Кредит.Субконто(Инд).IDD,1)=1 Тогда
                       НовыйДок.Кредит.Субконто(Инд,ТипСубк.ТекущийЭлемент());    
                   КонецЕсли;
               КонецЕсли;    
           КонецЦикла;
           
           НовыйДок.Количество=Опер.Количество;
           НовыйДок.Сумма=Опер.Сумма;
           НовыйДок.Содержание=Опер.Содержание;
           
           НовыйДок.ЗаписатьПроводки();
       КонецЦикла;
       НовыйДок.Записать();
   КонецЕсли;    
КонецЦикла;

Останавливается с ошибкой "Плохой тип" на строке:
ЗнСубк=Приемник.Перечисление.ПолучитьАтрибут(Вид).ЗначениеПоИдентификатору(Идент);

Как правильно тут написать?
1 alexio_alexio
 
22.03.12
15:20
Конечно же тут строка не нужна:
Номер = Опер.Кредит.Субконто(Инд).ПорядковыйНомер();
2 Ёпрст
 
22.03.12
15:21
Опер - это объект какой базы ?
3 miki
 
22.03.12
15:22
Получаешь ПорядковыйНомер, а ищешь по Идентификатру? Причем о идентификатору вида субконта, а не значения перечисления...
4 alexio_alexio
 
22.03.12
15:22
(2) Опер-объект базы-источника
5 Ёпрст
 
22.03.12
15:23
(4) ага зачет, а еще ему подсовываешь перечисления от другой базы
6 miki
 
22.03.12
15:23
да, и вместо Опер тебе нужен НовыйДок.
7 alexio_alexio
 
22.03.12
15:23
Строка Номер = Опер.Кредит.Субконто(Инд).ПорядковыйНомер(); тут не нужна
8 Ёпрст
 
22.03.12
15:24
есен пень ругается (а то что перечисление не найдено будет там, это пофик - тип то ОЛЕ-базы один хрен)
9 alexio_alexio
 
22.03.12
15:25
Да-да, ошибка нужно так:
Если Найти(Тип,"Перечисление")>0 Тогда
                   ЗнСубк=Приемник.Перечисление.ПолучитьАтрибут(Вид).ЗначениеПоИдентификатору(Идент);
                   НовыйДок.Кредит.Субконто(Инд,ЗнСубк);
               Иначе
                   ТипСубк = Приемник.CreateObject(Тип);  
                   Если ТипСубк.НайтиПоРеквизиту("IDD",Опер.Кредит.Субконто(Инд).IDD,1)=1 Тогда
                       НовыйДок.Кредит.Субконто(Инд,ТипСубк.ТекущийЭлемент());    
                   КонецЕсли;
               КонецЕсли;

Но где ошибка-то?
10 alexio_alexio
 
22.03.12
15:27
Можете написать правильный код?
11 alexio_alexio
 
22.03.12
16:17
В чем ошибка?
12 alexio_alexio
 
22.03.12
16:21
с (3) согласен, но что-то не пойму как правильно сделать, буду думать
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой