|
Как произвести обмен с удаленными данными | ☑ | ||
---|---|---|---|---|
0
1cker
05.05.21
✎
11:34
|
Добрый день, Ребята!
Есть несколько баз с разными конфигурациями (Источник) и Центральная база (Приемник). Есть односторонний обмен который 1 раз в сутки выгружает документы за указанный в Приемник. Проблема: при удалении данных в Источнике, Приемник об этом не знает, следовательно обороты неправильные в Приемнике. Вопрос: Как можно настроить односторонний обмен не использую РИБ? |
|||
1
Волшебник
05.05.21
✎
11:35
|
Нужно создать план обмена без флага "Распределённая база" и выгружать изменения по нему
|
|||
2
Василий Алибабаевич
05.05.21
✎
11:39
|
Или запилить свою службу регистрации. И с ее помощью регистрировать событие "удаление данных" и передавать его в приемник. И уже в приемнике удалять те же данные.
|
|||
3
ДенисЧ
05.05.21
✎
11:39
|
А как выгружаешь? Если по правилам обмена - там есть специальная штука - удаление объекта.
Если по своим механизмам - предусмотри этот вариант |
|||
4
Bigbro
05.05.21
✎
11:47
|
если в приемнике меняются данные и нужно чтобы Источник об этом знал - то этот обмен односторонним уже никак не будет являться.
грузите в обратку информацию об удалении/изменениях. |
|||
5
fisher
05.05.21
✎
11:59
|
(0) Проще всего проблема решается так, как обычно ее и решают: просто не делают физическое удаление данных. Делают пометку на удаление. А периодически если сильная нужда - делают удаление старых помеченных.
|
|||
6
mistеr
05.05.21
✎
14:27
|
(4) Читай вопрос внимательно
|
|||
7
mistеr
05.05.21
✎
14:32
|
(0) Что вы такого удаляете, что меняет обороты? И с какой целью?
|
|||
8
Aleksey
05.05.21
✎
14:37
|
Выгружать за период, предварительно перед загрузкой снимая документы с проведения, (ну или делать это в памяти, т.е. перед загрузкой сохраняем список документов за период, при загрузки удаляем те что прилетели из приемника, а что осталось - значит жуно грохнуть)
|
|||
9
Aleksey
05.05.21
✎
14:38
|
(7) Ну к примеру "задублили" в источнике
|
|||
10
Bigbro
06.05.21
✎
07:05
|
(6) прочитал, и?
у меня абсолютно такая же история - разные базы, обмен (в основном) в одну сторону, однако.. приходится перечитывать объекты получателя и искать их в источнике, чтобы отловить удаления как минимум. все работает. что я должен был прочитать еще? |
|||
11
Aleksey
06.05.21
✎
07:58
|
(10) У него в приемнике ничего не меняется. Это центральная база в которой собираются данные из всех баз. Но иногда бывает что в источнике помечают объект на удаления и удаляют физически. И это происходит между сеансами обмена. Т.е. данные об удалении не успевают уйти в приемник. И получается расхождения между отчетами в источнике и приемнике.
Ты же пишешь об изменения в приемнике. И вот скажи, в чем она "абсолютно такая же история", если "грузите в обратку информацию об удалении/изменениях." ничего не надо? Нужно только в приемнике удалить данные которые физически были грохнуты в источнике между сеансами обмена. |
|||
12
Bigbro
06.05.21
✎
08:09
|
ну и как ты их удалишь если не знаешь что удалять?
у меня подключение к 2м базам, прошелся по объектам в одной - изменил данные во второй. прошелся по объектам во второй - удалил те что не найдены в первой, все. тут оффлайн обмен, но схема та же - нужно выгружать всю информацию об объектах, затем где есть расхождения - вносим изменения, где объект отсутствует в выгрузке - удаляем в приемнике. проблема конечно что выгружать ВСЮ информацию может быть затратно. но тогда надо отлавливать события удаления и писать отдельный датафайл, который обрабатывать. |
|||
13
ДенисЧ
06.05.21
✎
08:11
|
О.Фи.Геть.
На что только люди не пойдут, чтобы не передавать уид удалённого объекта... |
|||
14
Aleksey
06.05.21
✎
08:50
|
(13) Его не всегда можно отловить
|
|||
15
ДенисЧ
06.05.21
✎
09:04
|
(14) Кто-то запрещает?
ДокументОбъект.<Имя документа> (DocumentObject.<Document name>) ПередУдалением (BeforeDelete) Синтаксис: ПередУдалением(<Отказ>) Параметры: <Отказ> Тип: Булево. Признак удаления документа. Если в теле процедуры-обработчика установить данному параметру значение Истина, то удаление документа выполнено не будет. Значение по умолчанию: Ложь. Описание: Возникает в транзакции удаления перед непосредственным удалением объекта из базы данных. |
|||
16
Bigbro
06.05.21
✎
09:08
|
(15) а для распределенных баз оно отрабатывает?
|
|||
17
ДенисЧ
06.05.21
✎
09:10
|
(16) Оно отрабатывает для объекта в этой базе.
|
|||
18
Bigbro
06.05.21
✎
09:14
|
(17) я имел в виду что если с обменом прилетела регистрация удаленных объектов что на объект больше ссылок нет и он собственно при обмене должен удалиться.
отработает? я не уверен. |
|||
19
ДенисЧ
06.05.21
✎
09:18
|
(18) Удаление объекта-то произойдёт. Попробуй, повтори...
|
|||
20
Bigbro
06.05.21
✎
09:29
|
https://its.1c.ru/db/v8std#content:752:hdoc
"2. Все действия в процедуре-обработчике события ПередУдалением должны выполняться после проверки на ОбменДанными.Загрузка. Т. е. они не должны выполняться перед удалением объекта через механизм обмена данными, так как это может привести к ошибкам. Примером таких ошибок является обращение к предопределенным объектам после очистки области данных." тут написано что нет. |
|||
21
ДенисЧ
06.05.21
✎
09:35
|
(20) Если ты уже пришёл в ПередУдалением - значит, оно сработало.
В чём проблема? |
|||
22
Bigbro
06.05.21
✎
09:39
|
проблема в том что ты туда не придешь, если у тебя распределенная база и произошел обмен.
при обмене объект просто будет похоронен и ты не сможешь отловить событие. |
|||
23
GANR
06.05.21
✎
09:40
|
(0) В двух словах - через жопу. Типовая методика официально гласит, что передача сообщений об удалении не предусмотрена в КД и в подсистеме обмен данными. Это на самом деле сложный вопрос - ведь в базе-приемнике по удаленному в источнике документу могла цепочка документов пойти. Что делать в такой ситуации? Вопрос даже не как а ЧТО.
|
|||
24
Василий Алибабаевич
06.05.21
✎
09:42
|
(22) Событие будешь ловить там, где будешь удалять. То есть ДО всяких обменов.
|
|||
25
GANR
06.05.21
✎
09:43
|
Остается поймать (15) в базе-источнике и по этому событию в базе-премнике пометить объект на удаление (способ полно). Фоновое задание по удалению помеченных, если настроено отработает и если ничего на этот документ в приемнике не ссылается он удалится.
|
|||
26
ДенисЧ
06.05.21
✎
09:43
|
(22) Ты проверил?
|
|||
27
GANR
06.05.21
✎
09:45
|
(26) Читал документацию по КД2 и БСП. На самом деле удаление объектов в базе-приемнике нетривиальная задачка. Так что следовало ожидать, что они это не сделают.
|
|||
28
Василий Алибабаевич
06.05.21
✎
09:48
|
(25) Для обхода вот этого вот : "и если ничего на этот документ в приемнике не ссылается" и предусмотрена фишка ОбменДанными.Загрузка.
Ибо то на что ссылается объект может также удалиться по сообщению "УдалениеДанных" прям в этих же данных обмена, но только "ниже по тексту". Таким образом при установленной фишке ОбменДанными.Загрузка допустимо удалять не проверяя. |
|||
29
ДенисЧ
06.05.21
✎
09:49
|
(27) Причём тут база-приёмник?
Мы ловим в источнике событие удаления. Имеем гуид. И передаём событие УдалениеОбъекта. Как его обрабатывать будет принимающая сторона - это уже другой вопрос. Может пометить, может сразу удалить. |
|||
30
Bigbro
06.05.21
✎
09:52
|
(29) ты кажется запутался.
я рассматриваю ситуацию когда Источник - распределенная база. и удаление в ней объекта происходит в момент обмена, когда во всех узлах не осталось на него ссылок. тогда в Источнике объект будет удален, а событие перед удалением не отработает, и ты не сможешь ничего передать приемнику. |
|||
31
GANR
06.05.21
✎
09:52
|
(28)(29) [не проверяя] Это-то легко, вопрос в том база битыми ссылками точно не покроется?
|
|||
32
ДенисЧ
06.05.21
✎
09:55
|
(30) А зачем приёмнику передавать информацию о том, что что-то удалилось при обмене? Он сам об этом знает, в нём же это и удалялось
|
|||
33
Василий Алибабаевич
06.05.21
✎
09:58
|
(31) Все проверки должны быть выполнены перед удалением в источнике. После выполнения проверок в источнике считается что в приемнике эти же проверки дадут тот же результат и уже не требуются.
По крайней мере в РИБ это точно так. Ибо базы идентичны вплоть до УИД объектов. В базах произвольной структуры решение должен принимать архитектор. Если допустимо наличие производных объектов в приемнике без наличия ведущих - тогда все нормально. Если нет - нефик ничего и удалять. |
|||
34
fisher
06.05.21
✎
10:00
|
Физическое удаление объекта в распределенной да еще и гетерогенной среде - вопрос достаточно тонкий. И дешевле всего он решается отказом от физического удаления.
|
|||
35
Bigbro
06.05.21
✎
10:06
|
(32) он не знает. Приемник в данном случае - другая база, не часть распределенного источника. совсем другая конфигурация, возможно тоже распределенная, как у меня например.
|
|||
36
Василий Алибабаевич
06.05.21
✎
10:06
|
(34) В мобильных приложениях приходится физически удалять объекты в периферийных базах. Просто потому что оно не компьютер. И не только по емкости хранилищ. Но и по быстродействию.
Например более эффективно один раз удалить объект из базы, чем каждый раз фильтровать при построение списков. |
|||
37
Василий Алибабаевич
06.05.21
✎
10:07
|
+ (36) При этом оставляя объекты "живыми" в центральной.
|
|||
38
ДенисЧ
06.05.21
✎
10:10
|
(35) Если в приемник прилетает удаление, значит в источнике его удалили. А раз прилетает - значит, это событие поймали.
А дальше см (29), последние два предложения. |
|||
39
Bigbro
06.05.21
✎
10:13
|
(38) перечитай 30 и 35.
|
|||
40
Василий Алибабаевич
06.05.21
✎
10:14
|
(35) Птля... Осознай последовательность событий :
1. В "источнике" удаляется объект и его уид регистрируется в службе регистрации. (пока еще нет никакого обмена). !!!Это и есть место для ПередУдалением(). 2. Формируется сообщение обмена и в него включается сообщение УдалениеОбъекта с параметрами зарегаными в шаге "1". 3. Сообщение передается в приемник. При этом в источнике объект удален. Приемник об этом пока не знает. 4. В приемнике обрабатывается сообщение обмена и Объект удаляется из приемника. Никому ничего никто сообщать больше не должен. !!! Никаких обработок в ПередУдалением() делать не нужно если ОбменДанными.Загрузка |
|||
41
fisher
06.05.21
✎
10:14
|
(36) Ну, я говорил про самый дешевый универсальный вариант. Если удалять нужно - тогда отрабатываются частные случаи.
|
|||
42
Василий Алибабаевич
06.05.21
✎
10:17
|
+ (40) Уточню : п.1 выполняется в базе-источник. п. 4 - в базе-приемник.
|
|||
43
Василий Алибабаевич
06.05.21
✎
10:18
|
(41) ГЫ. Понятьно что "нифига не делать" есть вариант наиболее дешевый и наиболее универсальный))).
|
|||
44
Bigbro
06.05.21
✎
10:19
|
(40) извините если вы не можете прочесть и осознать достаточно простую мысль которую я сформулировал в 35, то пожалуй я закончу на этом с вами общение.
|
|||
45
ДенисЧ
06.05.21
✎
10:20
|
(44) Давно пора. Иди выпей кофе и выспись. Ты путаешься
|
|||
46
Aleksey
06.05.21
✎
11:20
|
(15) У меня в 7-ке такого нету
|
|||
47
ДенисЧ
06.05.21
✎
11:23
|
(46) Тема в разделе в8. Причём тут 7ка?
|
|||
48
Bigbro
06.05.21
✎
11:28
|
(46) это не принципиально, общая схема и проблема в (12).
для нераспределенных баз решается отлавливанием событий ПередУдалением, ПриУдалении для обмена между РАЗНЫМИ распределенками - отлов не подходит, это не смог донести до некоторых оппонентов. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |