Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как произвести обмен с удаленными данными

Как произвести обмен с удаленными данными
Я
   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
А как выгружаешь? Если по правилам обмена - там есть специальная штука - удаление объекта.
Если по своим механизмам - предусмотри этот вариант
   Bigbro
 
4 - 05.05.21 - 11:47
если в приемнике меняются данные и нужно чтобы Источник об этом знал - то этот обмен односторонним уже никак не будет являться.
грузите в обратку информацию об удалении/изменениях.
   fisher
 
5 - 05.05.21 - 11:59
(0) Проще всего проблема решается так, как обычно ее и решают: просто не делают физическое удаление данных. Делают пометку на удаление. А периодически если сильная нужда - делают удаление старых помеченных.
   mistеr
 
6 - 05.05.21 - 14:27
(4) Читай вопрос внимательно
   mistеr
 
7 - 05.05.21 - 14:32
(0) Что вы такого удаляете, что меняет обороты? И с какой целью?
   Aleksey
 
8 - 05.05.21 - 14:37
Выгружать за период, предварительно перед загрузкой снимая документы с проведения, (ну или делать это в памяти, т.е. перед загрузкой сохраняем список документов за период, при загрузки удаляем те что прилетели из приемника, а что осталось - значит жуно грохнуть)
   Aleksey
 
9 - 05.05.21 - 14:38
(7) Ну к примеру "задублили" в источнике
   Bigbro
 
10 - 06.05.21 - 07:05
(6) прочитал, и?
у меня абсолютно такая же история - разные базы, обмен (в основном) в одну сторону, однако.. приходится перечитывать объекты получателя и искать их в источнике, чтобы отловить удаления как минимум. все работает.
что я должен был прочитать еще?
   Aleksey
 
11 - 06.05.21 - 07:58
(10) У него в приемнике ничего не меняется. Это центральная база в которой собираются данные из всех баз. Но иногда бывает что в источнике помечают объект на удаления и удаляют физически. И это происходит между сеансами обмена. Т.е. данные об удалении не успевают уйти в приемник. И получается расхождения между отчетами в источнике и приемнике.

Ты же пишешь об изменения в приемнике. И вот скажи, в чем она "абсолютно такая же история", если "грузите в обратку информацию об удалении/изменениях." ничего не надо? Нужно только в приемнике удалить данные которые физически были грохнуты в источнике между сеансами обмена.
   Bigbro
 
12 - 06.05.21 - 08:09
ну и как ты их удалишь если не знаешь что удалять?
у меня подключение к 2м базам, прошелся по объектам в одной - изменил данные во второй. прошелся по объектам во второй - удалил те что не найдены в первой, все.
тут оффлайн обмен, но схема та же - нужно выгружать всю информацию об объектах, затем где есть расхождения - вносим изменения, где объект отсутствует в выгрузке - удаляем в приемнике.
проблема конечно что выгружать ВСЮ информацию может быть затратно.
но тогда надо отлавливать события удаления и писать отдельный датафайл, который обрабатывать.
   ДенисЧ
 
13 - 06.05.21 - 08:11
О.Фи.Геть.
На что только люди не пойдут, чтобы не передавать уид удалённого объекта...
   Aleksey
 
14 - 06.05.21 - 08:50
(13) Его не всегда можно отловить
   ДенисЧ
 
15 - 06.05.21 - 09:04
(14) Кто-то запрещает?

ДокументОбъект.<Имя документа> (DocumentObject.<Document name>)
ПередУдалением (BeforeDelete)
Синтаксис:
ПередУдалением(<Отказ>)
Параметры:
<Отказ>
Тип: Булево.
Признак удаления документа. Если в теле процедуры-обработчика установить данному параметру значение Истина, то удаление документа выполнено не будет.
Значение по умолчанию: Ложь.
Описание:
Возникает в транзакции удаления перед непосредственным удалением объекта из базы данных.
   Bigbro
 
16 - 06.05.21 - 09:08
(15) а для распределенных баз оно отрабатывает?
   ДенисЧ
 
17 - 06.05.21 - 09:10
(16) Оно отрабатывает для объекта в этой базе.
   Bigbro
 
18 - 06.05.21 - 09:14
(17) я имел в виду что если с обменом прилетела регистрация удаленных объектов что на объект больше ссылок нет и он собственно при обмене должен удалиться.
отработает?
я не уверен.
   ДенисЧ
 
19 - 06.05.21 - 09:18
(18) Удаление объекта-то произойдёт. Попробуй, повтори...
   Bigbro
 
20 - 06.05.21 - 09:29
https://its.1c.ru/db/v8std#content:752:hdoc
"2. Все действия в процедуре-обработчике события ПередУдалением должны выполняться после проверки на ОбменДанными.Загрузка.

Т. е. они не должны выполняться перед удалением объекта через механизм обмена данными, так как это может привести к ошибкам. Примером таких ошибок является обращение к предопределенным объектам после очистки области данных."

тут написано что нет.
   ДенисЧ
 
21 - 06.05.21 - 09:35
(20) Если ты уже пришёл в ПередУдалением - значит, оно сработало.
В чём проблема?
   Bigbro
 
22 - 06.05.21 - 09:39
проблема в том что ты туда не придешь, если у тебя распределенная база и произошел обмен.
при обмене объект просто будет похоронен и ты не сможешь отловить событие.
   GANR
 
23 - 06.05.21 - 09:40
(0) В двух словах - через жопу. Типовая методика официально гласит, что передача сообщений об удалении не предусмотрена в КД и в подсистеме обмен данными. Это на самом деле сложный вопрос - ведь в базе-приемнике по удаленному в источнике документу могла цепочка документов пойти. Что делать в такой ситуации? Вопрос даже не как а ЧТО.
   Василий Алибабаевич
 
24 - 06.05.21 - 09:42
(22) Событие будешь ловить там, где будешь удалять. То есть ДО всяких обменов.
   GANR
 
25 - 06.05.21 - 09:43
Остается поймать (15) в базе-источнике и по этому событию в базе-премнике пометить объект на удаление (способ полно). Фоновое задание по удалению помеченных, если настроено отработает и если ничего на этот документ в приемнике не ссылается он удалится.
   ДенисЧ
 
26 - 06.05.21 - 09:43
(22) Ты проверил?
   GANR
 
27 - 06.05.21 - 09:45
(26) Читал документацию по КД2 и БСП. На самом деле удаление объектов в базе-приемнике нетривиальная задачка. Так что следовало ожидать, что они это не сделают.
   Василий Алибабаевич
 
28 - 06.05.21 - 09:48
(25) Для обхода вот этого вот : "и если ничего на этот документ в приемнике не ссылается" и предусмотрена фишка ОбменДанными.Загрузка.

Ибо то на что ссылается объект может также удалиться по сообщению "УдалениеДанных" прям в этих же данных обмена, но только "ниже по тексту". Таким образом при установленной фишке ОбменДанными.Загрузка допустимо удалять не проверяя.
   ДенисЧ
 
29 - 06.05.21 - 09:49
(27) Причём тут база-приёмник?
Мы ловим в источнике событие удаления. Имеем гуид. И передаём событие УдалениеОбъекта. Как его обрабатывать будет принимающая сторона - это уже другой вопрос. Может пометить, может сразу удалить.
   Bigbro
 
30 - 06.05.21 - 09:52
(29) ты кажется запутался.
я рассматриваю ситуацию когда Источник - распределенная база.
и удаление в ней объекта происходит в момент обмена, когда во всех узлах не осталось на него ссылок.
тогда в Источнике объект будет удален, а событие перед удалением не отработает, и ты не сможешь ничего передать приемнику.
 
 
   GANR
 
31 - 06.05.21 - 09:52
(28)(29) [не проверяя] Это-то легко, вопрос в том база битыми ссылками точно не покроется?
   ДенисЧ
 
32 - 06.05.21 - 09:55
(30) А зачем приёмнику передавать информацию о том, что что-то удалилось при обмене? Он сам об этом знает, в нём же это и удалялось
   Василий Алибабаевич
 
33 - 06.05.21 - 09:58
(31) Все проверки должны быть выполнены перед удалением в источнике. После выполнения проверок в источнике считается что в приемнике эти же проверки дадут тот же результат и уже не требуются.
По крайней мере в РИБ это точно так. Ибо базы идентичны вплоть до УИД объектов.

В базах произвольной структуры решение должен принимать архитектор. Если допустимо наличие производных объектов в приемнике без наличия ведущих - тогда все нормально. Если нет - нефик ничего и удалять.
   fisher
 
34 - 06.05.21 - 10:00
Физическое удаление объекта в распределенной да еще и гетерогенной среде - вопрос достаточно тонкий. И дешевле всего он решается отказом от физического удаления.
   Bigbro
 
35 - 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), последние два предложения.
   Bigbro
 
39 - 06.05.21 - 10:13
(38) перечитай 30 и 35.
   Василий Алибабаевич
 
40 - 06.05.21 - 10:14
(35) Птля... Осознай последовательность событий :
1. В "источнике" удаляется объект и его уид регистрируется в службе регистрации. (пока еще нет никакого обмена).
!!!Это и есть место для ПередУдалением().

2. Формируется сообщение обмена и в него включается сообщение УдалениеОбъекта с параметрами зарегаными в шаге "1".

3. Сообщение передается в приемник. При этом в источнике объект удален. Приемник об этом пока не знает.

4. В приемнике обрабатывается сообщение обмена и Объект удаляется из приемника. Никому ничего никто сообщать больше не должен.
!!! Никаких обработок в ПередУдалением() делать не нужно если ОбменДанными.Загрузка
   fisher
 
41 - 06.05.21 - 10:14
(36) Ну, я говорил про самый дешевый универсальный вариант. Если удалять нужно - тогда отрабатываются частные случаи.
   Василий Алибабаевич
 
42 - 06.05.21 - 10:17
+ (40) Уточню : п.1 выполняется в базе-источник. п. 4 - в базе-приемник.
   Василий Алибабаевич
 
43 - 06.05.21 - 10:18
(41) ГЫ. Понятьно что "нифига не делать" есть вариант наиболее дешевый и наиболее универсальный))).
   Bigbro
 
44 - 06.05.21 - 10:19
(40) извините если вы не можете прочесть и осознать достаточно простую мысль которую я сформулировал в 35, то пожалуй я закончу на этом с вами общение.
   ДенисЧ
 
45 - 06.05.21 - 10:20
(44) Давно пора. Иди выпей кофе и выспись. Ты путаешься
   Aleksey
 
46 - 06.05.21 - 11:20
(15) У меня в 7-ке такого нету
   ДенисЧ
 
47 - 06.05.21 - 11:23
(46) Тема в разделе в8. Причём тут 7ка?
   Bigbro
 
48 - 06.05.21 - 11:28
(46) это не принципиально, общая схема и проблема в (12).
для нераспределенных баз решается отлавливанием событий ПередУдалением, ПриУдалении
для обмена между РАЗНЫМИ распределенками - отлов не подходит, это не смог донести до некоторых оппонентов.


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.