Перенос операций 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-загрузку.... или через текстовик... все стандартизировано....
 Все просто... |