Книга знаний

1С:Предприятие / Приемы программирования / Обмен данными, УРБД

Перенос операций 7.7 -7.7

Долго искал, как переносить операции между базами 7.7.... никто не мог ответить... выкладываю... хоть не мое, но многим может пригодиться... на авторство не претендую. Респект Бояркину и Филатову)Автор статьи: MRAK | Редакторы:
Последняя редакция №2 от 15.10.08 | История
URL: http://kb.mista.ru/article.php?id=714

Ключевые слова: конвертация данных, КД, операция


Долго искал, как переносить операции между базами 7.7.... никто не мог ответить... выкладываю... хоть не мое, но многим может пригодиться...
на авторство не претендую. Респект Бояркину и Филатову)
не буду заниматься плагиатом, просто приведу код...

ПриВыгрузке

//Если Источник.СуществуетОперация() = 1 Тогда
УзелОперации = СоздатьУзел("Операция");
Операция = СоздатьОбъект("Операция");
Операция.НайтиОперацию(Источник);

УзелСвойства = СоздатьУзел("Свойство");
УстановитьАтрибут(УзелСвойства, "Имя", "Содержание");
УстановитьАтрибут(УзелСвойства, "Тип", "Строка");
ЗаписатьЭлемент(УзелСвойства, "Значение", Операция.Содержание);
ДобавитьПодчиненный(УзелОперации, УзелСвойства);

УзелСвойства = СоздатьУзел("Свойство");
УстановитьАтрибут(УзелСвойства, "Имя", "СуммаОперации");
УстановитьАтрибут(УзелСвойства, "Тип", "Число");
ЗаписатьЭлемент(УзелСвойства, "Значение", Операция.СуммаОперации);
ДобавитьПодчиненный(УзелОперации, УзелСвойства);

Если Операция.ВыбратьПроводки() = 1 Тогда
   Пока Операция.ПолучитьПроводку() = 1 Цикл
       УзелПроводки = СоздатьУзел("Проводка");
       
       УзелСвойства = СоздатьУзел("Свойство");
       УстановитьАтрибут(УзелСвойства, "Имя", "Сумма");
       УстановитьАтрибут(УзелСвойства, "Тип", "Число");
       ЗаписатьЭлемент(УзелСвойства, "Значение", Операция.Сумма);
       ДобавитьПодчиненный(УзелПроводки, УзелСвойства);
       
       УзелСвойства = СоздатьУзел("Свойство");
       УстановитьАтрибут(УзелСвойства, "Имя", "ВалСумма");
       УстановитьАтрибут(УзелСвойства, "Тип", "Число");
       ЗаписатьЭлемент(УзелСвойства, "Значение", Операция.ВалСумма);
       ДобавитьПодчиненный(УзелПроводки, УзелСвойства);
       
       УзелСвойства = СоздатьУзел("Свойство");
       УстановитьАтрибут(УзелСвойства, "Имя", "Количество");
       УстановитьАтрибут(УзелСвойства, "Тип", "Число");
       ЗаписатьЭлемент(УзелСвойства, "Значение", Операция.Количество);
       ДобавитьПодчиненный(УзелПроводки, УзелСвойства);
       
       УзелСвойства = СоздатьУзел("Свойство");
       УстановитьАтрибут(УзелСвойства, "Имя", "СодержаниеПроводки");
       УстановитьАтрибут(УзелСвойства, "Тип", "Строка");
       ЗаписатьЭлемент(УзелСвойства, "Значение", Операция.СодержаниеПроводки);
       ДобавитьПодчиненный(УзелПроводки, УзелСвойства);
       
       Если ПустоеЗначение(Операция.Валюта) = 0 Тогда
           УзелСвойства = СоздатьУзел("Свойство");
           УстановитьАтрибут(УзелСвойства, "Имя", "Валюта");
           УстановитьАтрибут(УзелСвойства, "Тип", "СправочникСсылка.Валюты");
           
           УзелСсылки    = ВыгрузитьПоПравилу(Операция.Валюта,, ,, "Валюты");
           ТипУзлаСсылки = ТипЗначенияСтр(УзелСсылки);
           Если УзелСсылки = мПустоеЗначение Тогда
           Иначе
               Если ТипУзлаСсылки = "Строка" Тогда
                   Если Найти(УзелСсылки, "</Ссылка>") > 0 Тогда
                       ДобавитьПодчиненный(УзелСвойства, УзелСсылки);
                   Иначе
                       ЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки);
                   КонецЕсли;
                   
               ИначеЕсли ТипУзлаСсылки = "Число" Тогда
                   ЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки);
               Иначе
                   ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1));
               КонецЕсли;
               ДобавитьПодчиненный(УзелПроводки, УзелСвойства);
           КонецЕсли;
       КонецЕсли;
       
       Если ПустоеЗначение(Операция.Дебет.Счет) = 0 Тогда
           УзелСвойства = СоздатьУзел("Свойство");
           УстановитьАтрибут(УзелСвойства, "Имя", "СчетДт");
           УстановитьАтрибут(УзелСвойства, "Тип", "ПланСчетовСсылка.Управленческий");
           
           УзелСсылки    = ВыгрузитьПоПравилу(Операция.Дебет.Счет,, ,, "Управленческий");
           ТипУзлаСсылки = ТипЗначенияСтр(УзелСсылки);
           Если УзелСсылки = мПустоеЗначение Тогда
           Иначе
               Если ТипУзлаСсылки = "Строка" Тогда
                   Если Найти(УзелСсылки, "</Ссылка>") > 0 Тогда
                       ДобавитьПодчиненный(УзелСвойства, УзелСсылки);
                   Иначе
                       ЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки);
                   КонецЕсли;
                   
               ИначеЕсли ТипУзлаСсылки = "Число" Тогда
                   ЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки);
               Иначе
                   ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1));
               КонецЕсли;
               ДобавитьПодчиненный(УзелПроводки, УзелСвойства);
           КонецЕсли;
       КонецЕсли;
       
       Если ПустоеЗначение(Операция.Кредит.Счет) = 0 Тогда
           УзелСвойства = СоздатьУзел("Свойство");
           УстановитьАтрибут(УзелСвойства, "Имя", "СчетКт");
           УстановитьАтрибут(УзелСвойства, "Тип", "ПланСчетовСсылка.Управленческий");
           
           УзелСсылки    = ВыгрузитьПоПравилу(Операция.Кредит.Счет,, ,, "Управленческий");
           ТипУзлаСсылки = ТипЗначенияСтр(УзелСсылки);
           Если УзелСсылки = мПустоеЗначение Тогда
           Иначе
               Если ТипУзлаСсылки = "Строка" Тогда
                   Если Найти(УзелСсылки, "</Ссылка>") > 0 Тогда
                       ДобавитьПодчиненный(УзелСвойства, УзелСсылки);
                   Иначе
                       ЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки);
                   КонецЕсли;
                   
               ИначеЕсли ТипУзлаСсылки = "Число" Тогда
                   ЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки);
               Иначе
                   ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1));
               КонецЕсли;
               ДобавитьПодчиненный(УзелПроводки, УзелСвойства);
           КонецЕсли;
       КонецЕсли;
       
       Для НомерСубконто = 1 По Операция.Дебет.Счет.КоличествоСубконто() Цикл
           ВидСубконто = Операция.Дебет.Счет.ВидСубконто(НомерСубконто);
           Субконто = Операция.Дебет.Субконто(НомерСубконто);
           
           
           Если ПустоеЗначение(Субконто) = 0 Тогда
               
               УзелСубконто = СоздатьУзел("СубконтоДт");
               
               // Ключ
               УзелСвойства = СоздатьУзел("Свойство");
               УстановитьАтрибут(УзелСвойства, "Имя", "Ключ");
               УстановитьАтрибут(УзелСвойства, "Тип", "ВидСубконто");
               
               УзелСсылки = ВыгрузитьПоПравилу(ВидСубконто,, ,, "ВидСубконто");
               ТипУзлаСсылки = ТипЗначенияСтр(УзелСсылки);
               Если УзелСсылки = мПустоеЗначение Тогда
                   Продолжить;
               ИначеЕсли ТипУзлаСсылки = "Строка" Тогда
                   Если Найти(УзелСсылки, "</Ссылка>") > 0 Тогда
                       ДобавитьПодчиненный(УзелСвойства, УзелСсылки);
                   Иначе
                       ЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки);
                   КонецЕсли;
               ИначеЕсли ТипУзлаСсылки = "Число" Тогда
                   ЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки);
               Иначе
                   ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1));
               КонецЕсли;
               ДобавитьПодчиненный(УзелСубконто, УзелСвойства);
               
               // Значение
               УзелСвойства = СоздатьУзел("Свойство");
               
               ИмяПКО = "";
               НомерПКОЗначение = НайтиПравило(Субконто, ИмяПКО);
               
               УстановитьАтрибут(УзелСвойства, "Имя", "Значение");
               УстановитьАтрибут(УзелСвойства, "Тип", мТаблицаПравилКонвертацииОбъектов.ПолучитьЗначение(НомерПКОЗначение, "Приемник"));
               
               УзелСсылки = ВыгрузитьПоПравилу(Субконто,, ,, ИмяПКО,, , НомерПКОЗначение);
               
               ТипУзлаСсылки = ТипЗначенияСтр(УзелСсылки);
               Если УзелСсылки = мПустоеЗначение Тогда
                   Продолжить;
               ИначеЕсли ТипУзлаСсылки = "Строка" Тогда
                   Если Найти(УзелСсылки, "</Ссылка>") > 0 Тогда
                       ДобавитьПодчиненный(УзелСвойства, УзелСсылки);
                   Иначе
                       ЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки);
                   КонецЕсли;
               ИначеЕсли ТипУзлаСсылки = "Число" Тогда
                   ЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки);
               Иначе
                   ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1));
               КонецЕсли;
               ДобавитьПодчиненный(УзелСубконто, УзелСвойства);
               
               ДобавитьПодчиненный(УзелПроводки, УзелСубконто);
               
           КонецЕсли;
           
       КонецЦикла;
       Для НомерСубконто = 1 По Операция.Кредит.Счет.КоличествоСубконто() Цикл

           ВидСубконто = Операция.Кредит.Счет.ВидСубконто(НомерСубконто);
           Субконто = Операция.Кредит.Субконто(НомерСубконто);
           
           
           Если ПустоеЗначение(Субконто) = 0 Тогда
               
               УзелСубконто = СоздатьУзел("СубконтоКт");
               
               // Ключ
               УзелСвойства = СоздатьУзел("Свойство");
               УстановитьАтрибут(УзелСвойства, "Имя", "Ключ");
               УстановитьАтрибут(УзелСвойства, "Тип", "ВидСубконто");
               
               УзелСсылки = ВыгрузитьПоПравилу(ВидСубконто,, ,, "ВидСубконто");
               ТипУзлаСсылки = ТипЗначенияСтр(УзелСсылки);
               Если УзелСсылки = мПустоеЗначение Тогда
                   Продолжить;
               ИначеЕсли ТипУзлаСсылки = "Строка" Тогда
                   Если Найти(УзелСсылки, "</Ссылка>") > 0 Тогда
                       ДобавитьПодчиненный(УзелСвойства, УзелСсылки);
                   Иначе
                       ЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки);
                   КонецЕсли;
               ИначеЕсли ТипУзлаСсылки = "Число" Тогда
                   ЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки);
               Иначе
                   ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1));
               КонецЕсли;
               ДобавитьПодчиненный(УзелСубконто, УзелСвойства);
               
               // Значение
               УзелСвойства = СоздатьУзел("Свойство");
               
               НомерПКОЗначение = НайтиПравило(Субконто, ИмяПКО);
               
               УстановитьАтрибут(УзелСвойства, "Имя", "Значение");
               УстановитьАтрибут(УзелСвойства, "Тип", мТаблицаПравилКонвертацииОбъектов.ПолучитьЗначение(НомерПКОЗначение, "Приемник"));
               
               УзелСсылки = ВыгрузитьПоПравилу(Субконто,, ,, ИмяПКО,, , НомерПКОЗначение);
               
               ТипУзлаСсылки = ТипЗначенияСтр(УзелСсылки);
               Если УзелСсылки = мПустоеЗначение Тогда
                   Продолжить;
               ИначеЕсли ТипУзлаСсылки = "Строка" Тогда
                   Если Найти(УзелСсылки, "</Ссылка>") > 0 Тогда
                       ДобавитьПодчиненный(УзелСвойства, УзелСсылки);
                   Иначе
                       ЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки);
                   КонецЕсли;
               ИначеЕсли ТипУзлаСсылки = "Число" Тогда
                   ЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки);
               Иначе
                   ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1));
               КонецЕсли;
               ДобавитьПодчиненный(УзелСубконто, УзелСвойства);
               
               ДобавитьПодчиненный(УзелПроводки, УзелСубконто);
               
           КонецЕсли;
           
       КонецЦикла;

       ДобавитьПодчиненный(УзелОперации , УзелПроводки);
   КонецЦикла;
КонецЕсли;
ДобавитьПодчиненный(Приемник , УзелОперации);
//КонецЕсли;

ПослеЗагрузки

Объект.Записать();
Операция = СоздатьОбъект("Операция");
Операция.НайтиОперацию(Объект);

//    Удаляем существующие проводки

Пока Операция.ВыбратьПроводки()    = 1 Цикл
   Операция.ПолучитьПроводку();
   Операция.УдалитьПроводку();
КонецЦикла;
//Операция.Записать();


УзелОперации = УзелОбъекта.ВыбратьУзел("Операция");            

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

И вот оно счастье.... не надо юзать OLE-загрузку.... или через текстовик... все стандартизировано....
Все просто...

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика