Имя: Пароль:
1C
1С v8
Как произвести обмен с удаленными данными
,
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).
для нераспределенных баз решается отлавливанием событий ПередУдалением, ПриУдалении
для обмена между РАЗНЫМИ распределенками - отлов не подходит, это не смог донести до некоторых оппонентов.