|
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) не нравится - сделай свой
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |