Книга знаний

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

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

Долго искал, как переносить операции между базами 7.7.... никто не мог ответить... выкладываю... хоть не мое, но многим может пригодиться...Автор статьи:
Последняя редакция №1 от 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

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