Имя: Пароль:
1C
1C 7.7
v7: Перенос операций между 7.7 базами с помощью КД2
0 Цыпленок
 
17.09.12
09:12
Есть правила переноса уже написанные на КД2, затык только в переносе операций между двумя типовыми (почти бухиями. Есть у кого готовый пример?
1 Мимохожий Однако
 
17.09.12
09:14
Маловероятно угадать, что в твоих "почти бухиях". Сообщения об ошибках в студию и выкладывай правила. Как делал распиши.
2 Цыпленок
 
17.09.12
09:18
Пытался использовать пример из книги бояркина Филатова - не получилось. Какие ошибки были, чуть позже выложу, надо сначала вспомнить че делал в пятницу. )
3 dk
 
17.09.12
09:21
там основная проблема с субконтами наверно будет, т.к. они разного вида типа могут ссылки хранить
4 Сияющий Асинхраль
 
17.09.12
09:25
Проблема решиться переброской бух справками
5 Цыпленок
 
17.09.12
09:30
Перенос регулярный... Нужно именно выгрузить операции, и загрузить операции. Сейчас это делается обычным учойзе, предварительно загрузив всю базу целиком. Хотелось бы выгрузить в хмл и загрузить в хмл.
6 Мимохожий Однако
 
17.09.12
09:32
(5) см.(4). Бухгалтерские справки надежнее.
7 Цыпленок
 
17.09.12
10:07
С бухсправками к сожалению не вариант. Слишком много на них потом завязано...

Что я пытался сделать. Пытался использовать готовый пример из книги Бояркина Филатова. Насколько я понял, проблема в том, что операция не имеет табличных частей, и нужно переносить непосредственно движения документа, т.е. проводки. Для этого к узлу объекта добавляется хмл-узел Операция, в которой добавляется для каждой проводки узел Проводка. Информация о каждом реквизите операции или проводки помещается в хмл-узел свойство.
Для наборов субконто дебет и кредит создаются узлы с наименованиями субконто ДБ и Субконто КТ
8 Цыпленок
 
17.09.12
10:07
блин, отправилось быстро. ) щас остальное допишу. )
9 Цыпленок
 
17.09.12
10:14
Для наборов субконто дебет и кредит создаются узлы с наименованиями субконто ДБ и Субконто КТ, в которое помещается по 2 узела свойство, для вида субконто и для значения.
Информация о проводка считывается после загрузки объекта, т.к. когда объект операция уже создан или найден и его реквизиты загружены. Чтобы иметь возможность оперировать с проводками объекта, записывать его принудительно. Затем создается или меняются его проводки, записываются. После чего от повторной записи объекта отказываемся. В ПКО при Выгрузке для объекта операция пишем
//Если Источник.СуществуетОперация() = 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;
10 Цыпленок
 
17.09.12
10:16
Код вроде красивый, только не работает. В логе пишет

Ошибка исполнения обработчика:  ПКО_ПослеЗагрузки_Операция
 - Не указаны счета проводки!(проводка 1)
11 Сияющий Асинхраль
 
17.09.12
10:39
Чем по твоему бух справка от операции отличается? Только одним - бух справка это классический документ с табличной частью, все остальное фактически не отличается от типовой операции, более того бс имеет свою операцию с теми же проводками. Короче - хочешь гемора, развлекайся, а я бы перенес операции в бух справки
12 Цыпленок
 
17.09.12
10:49
Насчет бухсправки - подумаю, но хотелось бы попробовать все таки переносить операциями.
13 Цыпленок
 
17.09.12
13:05
В общем, разобрался, код абсолютно рабочий, просто название плана счетов отличалось от плана счетов из книжки, все операции норм переносятся. Следующий вопрос. Можно ли в КД2 сделать так, чтобы при загрузке загружаемый документ - проводился?
14 Цыпленок
 
17.09.12
14:28
По поводу проведения загружаемых документов - типа ап, актуально.
15 chief accountant
 
17.09.12
14:31
В обработке проводи
16 Цыпленок
 
17.09.12
14:42
Ну, можно по расписанию проводить через обработку ожидания, а прямо при переносе не получится? Имхо такая возможность должна быть.
17 chief accountant
 
17.09.12
14:54
(16) Ты чем в базу загружаешь???
18 Цыпленок
 
17.09.12
15:03
Хм, какой обработчик юзать? В простыне загрузочного модуля черт ногу сломит.
19 chief accountant
 
17.09.12
15:09
(18) не нравится - сделай свой