|
1C 8.3 Управляемый XML обмен через план обмена | ☑ | ||
---|---|---|---|---|
0
Darklight
18.11.15
✎
13:32
|
Возникла потребность выгружать данные в XML файл обмена через функцию "ПланыОбмена.ВыбратьИзменения" (ниже пример из справки):
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); Запись = Новый ЗаписьXML; Запись.ОткрытьФайл(ИмяФайла); ЗаписьСообщения.НачатьЗапись(Запись, Узел); Выб = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения); Пока Выб.Следующий() Цикл Объект = Выб.Получить(); ЗаписатьXML(Запись, Объект); КонецЦикла; ЗаписьСообщения.ЗакончитьЗапись(); Запись.Закрыть(); Но в этом случае в файл XML не попадает секция "<v8de:Changes>" Соответственно такой файл нельзя загрузить через "ПланыОбмена.ПрочитатьИзменения" А так же нет возможности передавать изменённую конфигурацию. Можно ли как-то получить эту секцию "<v8de:Changes>" в результирующем XML файле обмена? |
|||
1
VikingKosmo
18.11.15
✎
13:37
|
РИБ не предлагать?
|
|||
2
Darklight
18.11.15
✎
13:39
|
(1)Что Вы имеете в виду упоминая Распределённые Информационные Базы?
P.S. конфигурация самописная |
|||
3
VikingKosmo
18.11.15
✎
13:40
|
я имею ввиду свойство "Распределенная ИБ" у плана обмена
|
|||
4
Быдло замкадное
18.11.15
✎
13:42
|
сложные методы вы ищете. Лучше стандартный обмен + правила КД, в которых все особенности прописать
|
|||
5
VikingKosmo
18.11.15
✎
13:45
|
(4) он же хочет еще конфигурацию передавать...
|
|||
6
Darklight
18.11.15
✎
13:48
|
(3)Галочка установлена (но в упор не помню за что она отвечает)
(4) Что Вы имеете в виду. Написал же в (2) что конфигурация самописаная Проблема возникла в том, что нужен определённый порядок выгрузки видов объектов. Сейчас одно 1С известным способом вызов "ПланыОбмена.ЗаписатьИзменения" записывает изменённые объекты полностью хаотично. Перемешивая регистры и справочники. А нужно - в определённом порядке (он будет важен при загрузке, в которой идёт обработка загружаемых данных). Использование "ПланыОбмена.ВыбратьИзменения" с фильтром позволяет получить нужный порядок, но не позволяет получить секцию <v8de:Changes>, особенно подсекцию "<v8de:Config xmlns:v8md="http://v8.1c.ru/metadata/2005/08">" |
|||
7
Darklight
18.11.15
✎
13:53
|
Может, если я сделаю фиктивный узел, у которого не будет зарпегистрированных изменений. Тогда я смогу через "ПланыОбмена.ЗаписатьИзменения" выгрузить все заголовки (включая "<v8de:Config xmlns:v8md="http://v8.1c.ru/metadata/2005/08">";) А потом средствами XML выдернуть нужную мне секцию с конфигурацией.
Но... это может прокатить если обмен идёт лишь между двумя узлами А если избудет больше - то принятые изменения конфигураций для них будут различные. |
|||
8
Darklight
18.11.15
✎
13:58
|
Получается, придётся сначала всё выгрузить как обычно через "ПланыОбмена.ВыбратьИзменения" (со всеми хаотичными данными). Из файла выдернуть секцию "<v8de:Config xmlns:v8md="http://v8.1c.ru/metadata/2005/08">", затем уже повторно выгрузить через "ПланыОбмена.ВыбратьИзменения", вручную создав секцию <v8de:Changes>, подсекцию <v8de:Nodes> (и т.п.) вставив секцию "<v8de:Config xmlns:v8md="http://v8.1c.ru/metadata/2005/08">"
Но так получается двойная выгрузка - двойная нагрузка и время. В общем для меня не критично, но всё равно - не красиво... |
|||
9
Darklight
18.11.15
✎
14:00
|
(8) опечатлася в строке "как обычно через "ПланыОбмена.ВыбратьИзменения"" имелось в виду "ПланыОбмена.ЗаписатьИзменения"
|
|||
10
Darklight
18.11.15
✎
14:03
|
Иной вариант - это xsl преобразование уже выгруженного через "ПланыОбмена.ЗаписатьИзменения" файла xml с целью переупорядочивания его данных. Но для меня это не простое решение. Хотя оно и относительно красивое.
|
|||
11
Живой Ископаемый
18.11.15
✎
14:03
|
"Сейчас одно 1С известным способом вызов "ПланыОбмена.ЗаписатьИзменения" записывает изменённые объекты полностью хаотично. Перемешивая регистры и справочники. А нужно - в определённом порядке (он будет важен при загрузке, в которой идёт обработка загружаемых данных). "
Почему это будет важно? |
|||
12
Darklight
18.11.15
✎
15:09
|
(11)Важен, т.к. есть непрямые (не ссылочные) связи и при загрузке объекты и связи могут изменяться/подменяться/отправляться назад (изменённые/удалённые-отклонённые).
Альтернативой является лишь ввод специального регистра сведений, в который буду помещаться ссылки на все загруженные объекты (тут есть сложности, т.к. есть ещё и наборы записей регистров). И, тогда сначала проводить всю загрузку целиком как есть (с заполнением регистра), а лишь потом упорядоченную их обработку из этого регистра, изменяя объекты и после уже выгружая изменения назад. |
|||
13
Darklight
18.11.15
✎
18:42
|
Попробовал XSL преобразования - намаялся - ничего не заработало.... этот вариант бросил...
|
|||
14
denfil
18.11.15
✎
19:27
|
1. Включить РИБ
2. Отключить авторегистрацию у объектов. 3. Подписаться на событие передзаписью у плана обмена. Регистрировать что нужно и не регистрировать чего не нужно. Образцов в типовых тьма. |
|||
15
Darklight
19.11.15
✎
10:16
|
(14)
1. Включено 2. Отключено 3. Регистрируется Вы о чём? |
|||
16
Darklight
19.11.15
✎
11:53
|
В общем реализовал с двойной выгрузкой
Сначала функцией "ПланыОбмена.ЗаписатьИзменения" выгружаю как есть (во временный файл; до узла "v8de:Data") Затем функцией функция ПеренестиXMLДоУзла(ЧтениеXML, ЗаписьXML, Узел) экспорт ф = Ложь; Пока ЧтениеXML.Прочитать() Цикл Если ЧтениеXML.Имя = Узел Тогда ф = Истина; прервать; КонецЕсли; ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); КонецЦикла; возврат ф; КонецФункции переношу заглавную часть стандартной выгрузки в другой файл (без изменённых объектов данных) затем в него же повторно выгружаю изменённые объекты данных (секция "v8de:Data") функция ПланОбменаЗаписатьИзмененияВКонтейнер(Контейнер, Фильтр) экспорт Для каждого ЭлементФильтр из Фильтр Цикл Выборка = ПланыОбмена.ВыбратьИзменения(Контейнер.Получатель, Контейнер.НомерСообщения, ЭлементФильтр); Пока Выборка.Следующий() Цикл Объект = Выборка.Получить(); ЗаписатьXML(Контейнер.ЗаписьXML, Объект); КонецЦикла; КонецЦикла; КонецФункции здесь Фильтр - это подготовленный массив объектов метаданных (или самих объектов данных) для выгрузки изменений (упорядоченный нужным образом) и закрываю запись xml ЗаписьXML.ЗаписатьКонецЭлемента(); //v8de:Data ЗаписьXML.ЗаписатьКонецЭлемента(); //v8de:Changes ЗаписьXML.ЗаписатьКонецЭлемента(); //v8msg:Body ЗаписьXML.ЗаписатьКонецЭлемента(); //v8msg:Message ЗаписьXML.Закрыть(); Вроде как работает ;) |
|||
17
Darklight
19.11.15
✎
11:58
|
Добавлю лишь то, что выше Контейнер -
получен из ПланыОбмена.СоздатьЗаписьСообщения() После основной выгрузки он зкарывается (но перед этим его параметры сохраняются в структуру): ПланыОбмена.ЗаписатьИзменения(Контейнер); Контейнер_ = Новый Структура("ЗаписьXML, НомерПринятого, НомерСообщения, Получатель"); ЗаполнитьЗначенияСвойств(Контейнер_, Контейнер); Контейнер.ЗакончитьЗапись(); и далее уже используется данные из неё при повторной выгрузке через "ПланыОбмена.ВыбратьИзменения(Контейнер.Получатель, Контейнер.НомерСообщения, ЭлементФильтр)" |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |