Имя: Пароль:
1C
1С v8
"Ручная" регистрация удаления объекта
0 evilmox
 
28.10.11
11:02
Задача следующая: используется универсальный механизм обмена данными, в составе плана обмена есть справочник, для которого отключена авторегистрация (т.к. большая часть данных не должна участвовать в обмене). У справочника есть реквизит УчаствуетВОбмене булева типа, определяющий, участвует объект в обмене или нет, соответственно, при смене значения реквизита с "ИСТИНА" на "ЛОЖЬ" необходимо регистрировать удаление объекта.
Регистрация организована следующим образом - в модуле объекта справочника в обработчике события ПередЗаписью содержится код:

Если НЕ УчаствуетВОбмене  Тогда
   // Зарегистрировать удаление объекта
   ВыборкаУзлов = ПланыОбмена.ПланОбмена.Выбрать();
   Пока ВыборкаУзлов.Следующий() Цикл            
       Если ВыборкаУзлов.Ссылка <> ПланыОбмена.ПланОбмена.ЭтотУзел() Тогда
           УдалениеОбъекта = Новый УдалениеОбъекта(Ссылка);
           ПланыОбмена.ЗарегистрироватьИзменения(ВыборкаУзлов.Ссылка,УдалениеОбъекта);
       КонецЕсли;
   КонецЦикла;
ИначеЕсли // и так далее


Запись в таблицу регистрации изменений производится, судя по результатам перебора выборки изменений, но при записи данных методом ЗаписатьXML в xml файл записывается объект CatalogObject вместо ObjectDeletion.

Что сделано не так?
1 Axel2009
 
28.10.11
11:03
ПланыОбменаМенеджер (ExchangePlansManager)
УдалитьРегистрациюИзменений (DeleteChangeRecords)
Синтаксис:

УдалитьРегистрациюИзменений(<Узлы>, <Данные>)
Параметры:

<Узлы> (обязательный)

Тип: ПланОбменаСсылка.<Имя плана обмена>; Массив. Одиночное значение типа ПланОбменаСсылка.<Имя плана обмена> или массив таких значений, показывающие для каких узлов удаляются записи регистрации изменений.
<Данные> (необязательный)
2 Axel2009
 
28.10.11
11:04
опс, сори.
у меня тоже был гемор с удалением объекта, плюнул, решал все на стороне приемника
3 evilmox
 
28.10.11
11:14
Решать на стороне приемника - как-то странно при наличии механизма регистрации удаления. С ним такая же история, как и с различными видами обхода результата запроса (обход подчиненных записей текущей записи выборки мягко говоря работает не совсем так, как написано в описании встроенного языка)?
4 hhhh
 
28.10.11
11:32
(3) но у вас ведь не регистрация удаления. Вы пытаетесь обмануть их, неудаленный объект ведь.
5 Axel2009
 
28.10.11
11:37
(3) Если указан УдалениеОбъекта, то регистрация изменений выполняется для объекта базы данных, на который "указывает" ссылка, содержащаяся в объекте УдалениеОбъекта.
6 hhhh
 
28.10.11
11:43
(3) что-то непонятна постановка задачи у вас. Ведь на этот элемент справочника наверняка есть куча ссылок в документах, в регистрах. Тут приходит какой-то перец и ставит на элементе ЛОЖЬ (не участвует в обмене). Элемент удаляется из всех баз, но ссылки-то на него остались. Миллион битых ссылок будет в базах. Что-то какую-то фигню вы придумали.
7 evilmox
 
28.10.11
11:46
(4) В этом и суть, чтобы для базы-приемника зарегистрировать удаление объекта, оставив его в этой базе.
(6) Вопрос не в общем решении вопроса (и из всех баз элемент не удаляется, только в базе-приемнике), а в работоспособности механизма регистрации удаления объекта.
8 georgebgk
 
28.10.11
11:49
Можно при выгрузке в событии плана обмена ПриОтправкеДанныхПодчиненному (или главному, ты не указал направление обмена) поставить такой костыль:

Если ТипЗнч(ЭлементДанных) = мТипЗначенияТвоегоСправочника Тогда
Если Не ЭлементДанных.УчаствуетВОбмене Тогда
  ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить
КонецЕсли;
КонецЕсли

Примерно так сделано в типовых конфигурациях
9 evilmox
 
28.10.11
11:52
(8) Используется универсальный механизм обмена данными (написано в самом начале первого поста). Использовать распределенную базу данных не представляется возможности, т.к. база-приемник - вообще не 1С.
10 Axel2009
 
28.10.11
11:55
(7) между прочим в (5) цитата из СП
11 hhhh
 
28.10.11
11:58
(10) ну то есть там тупо должно стоять CatalogObject. Оно там и стоит, автор просто не удосужился прочитать СП?
12 evilmox
 
28.10.11
12:00
(10) (11) То есть зарегистрировать удаление объекта, не удаляя его - невозможно?
13 Axel2009
 
28.10.11
12:01
штатными средствами нет. да и то у меня есть вопрос в том что пойдет в пересылку, если реально удалить объект.
14 Jolly Roger
 
28.10.11
12:01
(0) надо не "регистрировать удаление объекта", а удалять регистрацию объекта...
15 Axel2009
 
28.10.11
12:02
(14) тогда в приемник вообще ничего не пойдет. и как удалить его в приемнике?
16 evilmox
 
28.10.11
12:03
(15) вот именно
17 hhhh
 
28.10.11
12:04
(16) вопрос был в другом

записывается объект CatalogObject вместо ObjectDeletion.

(10) вам дал ответ, почему так записывается.
18 Jolly Roger
 
28.10.11
12:05
(15) теперь уже поздно. раньше надо было думать...
19 Jolly Roger
 
28.10.11
12:06
+(18) и удалять в приемнике другими средствами, не через обмен...
20 Axel2009
 
28.10.11
12:20
(18) а у Вас это красиво настроено, когда было время думать раньше? поделитесь тогда..
21 Axel2009
 
28.10.11
12:22
(16) предложение в ПКО значение реквизита писать в Параметр. в перед загрузкой проверять этот параметр и удалять объект, если Ложь.
22 evilmox
 
28.10.11
12:38
Проблема решена: перед вызовом ЗаписатьXML в зависимости от значения реквизита УчаствуетВОбмене создается объект типа УдалениеОбъекта и передается в качестве параметра процедуре ЗаписатьXML.

Всем спасибо.