Имя: Пароль:
1C
 
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, НомерПринятого, НомерСообщения, Получатель");
        ЗаполнитьЗначенияСвойств(Контейнер_, Контейнер);
        Контейнер.ЗакончитьЗапись();  

и далее уже используется данные из неё при повторной выгрузке через "ПланыОбмена.ВыбратьИзменения(Контейнер.Получатель, Контейнер.НомерСообщения, ЭлементФильтр)"