|
План обмена | ☑ | ||
---|---|---|---|---|
0
soleg78
21.11.12
✎
22:00
|
Помогите разобраться с планом обмена. Никогда не писал ещё. Интересует сам механизм.
Создал новый план обмена Обмен односторонний. Обмен не постоянный, по мере необходимости. в чем вопрос. Например Есть справочник ФЛ, им его изменения собираюсь выбирать Выборка = ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения); Выгружаю данные в XML файл(структура произвольная) Допустим выгрузилась одна строка(назовем её первая) Файл лежит выгруженный. В базе приемнике неизвестно когда его загрузят. Тем временем в базе источнике идут изменения в след элементах справочника ФЛ. Например произошли изменения еще в 3-х элементах. Тут происходит загрузка XML файла в базу приемник. таким образом при ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения); хочу что бы выблались последние 3 изменения, так как "первая" уже загружена в базу приемник. Но не могу понять как сообщить базе приемнику о загрузке "первой строчки". пытался удалить регистрацию ПланыОбмена.УдалитьРегистрациюИзменений(Узел,НомерСообщения);, но удаляет всё, т. е. ничего не выгружает при выгрузке. Заранее благодарен. |
|||
1
Naumov
21.11.12
✎
22:04
|
что мешает отдать все типовому механизму? делаешь двусторонний обмен, просто в ответ ничего не выгружаешь - только сообщение о приеме предыдущего пакета.
|
|||
2
soleg78
21.11.12
✎
22:08
|
как "отдать все типовому механизму", конфы у меня разные, + обмен по неким условиям, (базы наполнены ФизЛицами, я из обмениваю по коду ДРФО)
|
|||
3
EvgeniuXP
21.11.12
✎
22:10
|
(0) номер принятого сообщения прими.
|
|||
4
EvgeniuXP
21.11.12
✎
22:10
|
т.е. нужно получить подтверждение от второго узла и когда первый узнает об этом, он тебе будет выгружать следующие, иначе все старые изменения + новые изменения.
|
|||
5
servs
21.11.12
✎
22:11
|
(0) по-моему тебе без объекта ЧтениеСообщенияОбмена не обойтись, в СП:
При завершении чтения данный объект модифицирует значение реквизита НомерПринятого соответствующего узла плана обмена в соответствии с номером принятого сообщения. |
|||
6
soleg78
21.11.12
✎
22:11
|
(3)Ок, дальше что с ним делать?
|
|||
7
EvgeniuXP
21.11.12
✎
22:16
|
(6) курс "Обмен данными", автор Митичкин (Волшебник), там всё рассказано.
|
|||
8
soleg78
21.11.12
✎
22:20
|
(7) Спасибо, но не могли бы Вы мне сказть каким образом удалит регистрацию изменений по предыдущему сообщению?
пробывал ПланыОбмена.УдалитьРегистрациюИзменений(Узел,НомерСообщения); начинал НомерСообщения с нуля, 1, 2, - результат - удаляет все! |
|||
9
soleg78
21.11.12
✎
22:23
|
ПланыОбменаМенеджер (ExchangePlansManager)
УдалитьРегистрациюИзменений (DeleteChangeRecords) Синтаксис: УдалитьРегистрациюИзменений(<Узлы>, <Данные>) Параметры: <Узлы> (обязательный) Тип: ПланОбменаСсылка.<Имя плана обмена>; Массив. Одиночное значение типа ПланОбменаСсылка.<Имя плана обмена> или массив таких значений, показывающие для каких узлов удаляются записи регистрации изменений. <Данные> (необязательный) Тип: Метаданные, Неопределено; УдалениеОбъекта; Число; <Данные>. Значением данного параметра может быть объект метаданных, объект, представляющий данные, хранимые в базе данных, такой как документ, элемент справочника, счет бухгалтерского учета, менеджер записи константы, набор записей регистра и т. п., ссылка на объект базы данных, а также Неопределено. Если указан объект метаданных, то записи регистрации изменений будут удалены для всех элементов данных, относящихся к указанному объекту метаданных. Объект метаданных должен входить в состав планов обмена всех узлов, указанных в первом параметре. Если указан УдалениеОбъекта, то удаление записи регистрации изменений выполняется для объекта базы данных, на который "указывает" ссылка, содержащаяся в объекте УдалениеОбъекта. Если указан объект представляющий данные, хранимые в базе данных, или ссылка, то записи регистрации изменений будут удалены только для указанных данных. Объект метаданных, соответствующий данным должен входить в состав всех планов обмена всех узлов, указанных в первом параметре. Если указано Неопределено или не указан, то в качестве первого параметра может быть указан только одиночный узел. И в этом случае записи регистрации изменений будут удалены для всех объектов, метаданные которых входят в состав плана обмена, к которому относится узел, указанный в качестве первого параметра. Если в качестве первого параметра указан одиночный узел, то в параметре может быть указан номер сообщения. В этом случае метод УдалитьРегистрациюИзменений удаляет из всех таблиц регистрации изменений все записи относящиеся к указанному узлу, у которых номер сообщения меньше или равен значению второго параметра. Значение по умолчанию: Неопределено Описание: Удаляет записи регистрации изменений одного или группы элементов данных для одного или нескольких узлов планов обмена. Доступность: Сервер, толстый клиент, внешнее соединение. |
|||
10
soleg78
21.11.12
✎
22:26
|
или при выборке изменений, выбрать изменения про предыдущему сообщению и УдалитьРегистрациюИзменений(<Узлы>, <Данные>), а в <Данные> -вставить объект выборки предыдущей
|
|||
11
AlexNew
21.11.12
✎
22:27
|
Конфигурация типовая? Там есть на основе правил обмена. Велосипед зачем?
|
|||
12
sda553
21.11.12
✎
22:28
|
(8) Механизм следующий
план обмена помечает изменения номерами выгруженных сообщений номенклатура 1 сообщение ном.100 номенклатура 2 сообщение ном. 101 номенклатура 3 сообщение ном. null В сообщениях xml в заголовке автоинкрементный указывается номер сообщения, а также номер последнего принятого сооьщения из той базы. После выгрузки сообщения номер 102 вместо null у номенклатуры 3 встанет 102 Потом придет обратное сообщение из соседней базы, где будет указано что номер принятого 101. По этому признаку в ПО можно удалить все изменения с номером более или равным 101. В сообщении 103 выгрузится только номенклатура3 |
|||
13
soleg78
21.11.12
✎
22:34
|
(12) прочитал пару раз - не совсем понял
вот моя выгрузка Запись = Новый ЗаписьXML(); Запись.ОткрытьФайл(Путь + "выгрузкa.xml"); Узел = ПланыОбмена.ОбменФЛ_УТП.НайтиПоКоду("УТП"); ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗапСообщения.НачатьЗапись(Запись, Узел); Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения); Запись.ЗаписатьНачалоЭлемента("Obmen"); Запись.ЗаписатьАтрибут("НомерСообщения", Строка(ЗапСообщения.НомерСообщения)); Пока Выборка.Следующий() Цикл Данные = Выборка.Получить(); Если ТипЗнч(Данные) = Тип("РегистрСведенийНаборЗаписей.ФИОФизЛиц") Тогда Для Каждого СтрокаТЧ ИЗ Данные Цикл Если СтрДлина(СокрЛП(СтрокаТЧ.ФизЛицо.КодПоДРФО))>0 тогда Запись.ЗаписатьНачалоЭлемента("InformationRegisterRecordSet"); Запись.ЗаписатьАтрибут("Период", Строка(СтрокаТЧ.Период)); Запись.ЗаписатьАтрибут("КодДРФО", СтрокаТЧ.ФизЛицо.КодПоДРФО); Запись.ЗаписатьАтрибут("Фамилия", СтрокаТЧ.Фамилия); Запись.ЗаписатьАтрибут("Имя", СтрокаТЧ.Имя); Запись.ЗаписатьАтрибут("Отчество", СтрокаТЧ.Отчество); Запись.ЗаписатьТекст(Строка(СтрокаТЧ.ФизЛицо)); Запись.ЗаписатьКонецЭлемента(); КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Запись.ЗаписатьКонецЭлемента(); ЗапСообщения.ЗакончитьЗапись(); Запись.Закрыть(); |
|||
14
soleg78
21.11.12
✎
22:35
|
(12)где это? "план обмена помечает изменения номерами выгруженных сообщений"
|
|||
15
GenV
21.11.12
✎
22:38
|
(2) Это не проблема, если обе поддерживают обмен через обработку ОбменДаннымиXML. В одной создаешь план обмена с авторегистрацией и правилами. Во второй создаешь план обмена с таким же именем и без регистрации. Правила пусты в настройку загрузишь. Обмен будет автоматом.
|
|||
16
GenV
21.11.12
✎
22:40
|
15+ можно даже через COM-соединение обмениваться
|
|||
17
soleg78
21.11.12
✎
22:42
|
(16) неа, надо через файл
про (15) что-то не совчем понятно, обе типовые, УПП и УТП, обе поддерживают обмен через обработку ОбменДаннымиXML |
|||
18
servs
21.11.12
✎
22:44
|
(14) это происходит неявно, если стоит авторегистрация, или явно, если авторегистрация запрещена, для 2го случая смотри ЭтотОбъект.ОбменДанными.Получатели, события при записи или при удалении
|
|||
19
soleg78
21.11.12
✎
22:45
|
(18) стоит авторегистрация
|
|||
20
AlexNew
21.11.12
✎
22:47
|
(19) Я б сначала ИТС прочел, но это не для пацанов.
|
|||
21
servs
21.11.12
✎
22:47
|
(19) значит в коде нигде ты явно этого не найдешь. Нужно понимать что регистрация происходит при записи объекта или при удалении.
|
|||
22
servs
21.11.12
✎
22:49
|
(20) в ИТС много воды, что делает чтение неинтересным.
|
|||
23
soleg78
21.11.12
✎
22:49
|
(20)только юзеры читают Хелп!))))))))
|
|||
24
sda553
21.11.12
✎
22:50
|
(й
(14) У тебя это происходит вот здесь Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения); |
|||
25
servs
21.11.12
✎
22:51
|
(24) не п4345ди)))
|
|||
26
GenV
21.11.12
✎
22:52
|
(17) В типовых есть настройка произвольных обменов данных можно выбрать план , узел, и загрузить правила по которым будет происходить обмен.
|
|||
27
AlexNew
21.11.12
✎
22:53
|
(21) или не происходит. Читайте типовые.
|
|||
28
servs
21.11.12
✎
22:56
|
(27) да, Вы правы, ЭтотОбъект.ОбменДанными.Получатели при авторегистрации могут очищаться программно в событиях перед записью или удалением. Это не описывал, т.к. ТС спрашивал о том как присваивается номер сообщения, а не об отмене регистрации.
|
|||
29
sda553
21.11.12
✎
22:56
|
(25) Ты просто еще в 18 ом посте не понял о чем идет речь. Речь не о регистрации а о моменте когда в изменения ставятся номера сообщений. Так что перечитывай начиная с 14 снова и не груби старшим
|
|||
30
servs
21.11.12
✎
22:57
|
(27) Типовые читать - себя не уважать)))
|
|||
31
EvgeniuXP
21.11.12
✎
22:58
|
(8) мог бы, но все на работе, дома нет...
(11) велосипеда там нет, там все просто. |
|||
32
servs
21.11.12
✎
22:59
|
(29) ага, точно, извини.
ТС, в (24) эсдэапятпятьтри прав! |
|||
33
soleg78
21.11.12
✎
23:15
|
Пробую это делать через запрос, так там только 0 и 1 в НомерСообщения, а НоменОтправленных сообщений уже больше сотни, ...или это не оно?
|
|||
34
servs
21.11.12
✎
23:24
|
(33) [НомерОтправленных сообщений уже больше сотни] где этот номер смотришь?
|
|||
35
soleg78
21.11.12
✎
23:26
|
(34)ну в плане обмена
|
|||
36
servs
21.11.12
✎
23:30
|
а ты уверен что узел в запросе и в НомерОтправленных один и тот же? Для каждого узла своя нумерация, если я не ошибаюсь.
|
|||
37
soleg78
22.11.12
✎
00:54
|
(36) как проверить?
|
|||
38
soleg78
22.11.12
✎
01:16
|
http://soleg1978.narod.ru/obmen.jpg
НомерСообщения только 0 и 1, почему? |
|||
39
soleg78
22.11.12
✎
01:21
|
Выполняю этот код
Запись = Новый ЗаписьXML(); Запись.ОткрытьФайл(Путь + "выгрузкa.xml"); Узел = ПланыОбмена.ОбменФЛ_УТП.НайтиПоКоду("УТП"); ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗапСообщения.НачатьЗапись(Запись, Узел); Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения); Запись.ЗаписатьНачалоЭлемента("Obmen"); Запись.ЗаписатьАтрибут("НомерСообщения", Строка(ЗапСообщения.НомерСообщения)); Пока Выборка.Следующий() Цикл Данные = Выборка.Получить(); Если ТипЗнч(Данные) = Тип("РегистрСведенийНаборЗаписей.ФИОФизЛиц") Тогда Для Каждого СтрокаТЧ ИЗ Данные Цикл Если СтрДлина(СокрЛП(СтрокаТЧ.ФизЛицо.КодПоДРФО))>0 тогда Запись.ЗаписатьНачалоЭлемента("InformationRegisterRecordSet"); Запись.ЗаписатьАтрибут("Период", Строка(СтрокаТЧ.Период)); Запись.ЗаписатьАтрибут("КодДРФО", СтрокаТЧ.ФизЛицо.КодПоДРФО); Запись.ЗаписатьАтрибут("Фамилия", СтрокаТЧ.Фамилия); Запись.ЗаписатьАтрибут("Имя", СтрокаТЧ.Имя); Запись.ЗаписатьАтрибут("Отчество", СтрокаТЧ.Отчество); Запись.ЗаписатьТекст(Строка(СтрокаТЧ.ФизЛицо)); Запись.ЗаписатьКонецЭлемента(); КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Запись.ЗаписатьКонецЭлемента(); ЗапСообщения.ЗакончитьЗапись(); Запись.Закрыть(); и результат такой |
|||
40
soleg78
22.11.12
✎
01:22
|
||||
41
sda553
22.11.12
✎
01:44
|
Здесь номер сообщения, это конкретно номер сообщения из (12) т.е. в данном случае три записи регистра с test5 зарегистрировано изменение в узел УТП, которое было на момент отправки сообщения номер 1.
После этого было отправлено еще 12 сообщений в этот узел. Принято 2 сообщения из этого узла. Но видимо ни в одном из принятых сообщений нет подтверждения что тот узел прочитал хоть какое то из 13ти сообщений, поэтому эти записи с номером 1 еще не зачищены. Я понятно объяснил? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |