8.х ОБМЕН УРИБ: Потеря данных в процессе обмена

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем eryomin, 3 дек 2013.

  1. TopicStarter Overlay
    eryomin
    Offline

    eryomin

    Регистрация:
    3 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Модуль плана обмена:

    Код:
    Перем мЭтоПодразделение;
    Функция ЭтоСвойДокумент(Док,Отдел)
    мНетКонтроля = Истина;
    МетаДок = Док.Метаданные();
    
    Если МетаДок.Реквизиты.Найти("Подразделение") <> Неопределено Тогда
    мНетКонтроля = Ложь;
    Если Док.Подразделение = Отдел Тогда					   
    Возврат Истина;
    КонецЕсли;
    КонецЕсли;
    
    Если МетаДок.Реквизиты.Найти("Отправитель") <> Неопределено Тогда
    мНетКонтроля = Ложь;
    Если Док.Отправитель = Отдел Тогда					   
    Возврат Истина;
    КонецЕсли;
    КонецЕсли;
    
    Если МетаДок.Реквизиты.Найти("Получатель") <> Неопределено Тогда
    мНетКонтроля = Ложь;
    Если Док.Получатель = Отдел Тогда					   
    Возврат Истина;
    КонецЕсли;
    КонецЕсли;
    Возврат мНетКонтроля;
    
    КонецФункции
    
    Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента)
    мТип = ТипЗнч(ЭлементДанных);
    
    Если Лев(мТип,8)="Документ" Тогда
    Если Не ЭтоСвойДокумент(ЭлементДанных,мЭтоПодразделение) Тогда
    ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
    КонецЕсли;
    Возврат;
    КонецЕсли;	   
    Если Лев(мТип,7)="Регистр" Тогда
    Если ЭлементДанных.Отбор.Найти("Регистратор") = Неопределено Тогда
    ИначеЕсли Не ЭтоСвойДокумент(ЭлементДанных.Отбор.Регистратор.Значение,мЭтоПодразделение) Тогда
    ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
    КонецЕсли;
    Возврат;
    КонецЕсли;
    КонецПроцедуры
    Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)   
    мТип = ТипЗнч(ЭлементДанных);
    Если Лев(мТип,8)="Документ" Тогда
    Если Не ЭтоСвойДокумент(ЭлементДанных,Подразделение) Тогда
    ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
    КонецЕсли;
    Возврат;
    КонецЕсли;	   
    Если Лев(мТип,7)="Регистр" Тогда
    Если ЭлементДанных.Отбор.Найти("Регистратор") = Неопределено Тогда
    ИначеЕсли Не ЭтоСвойДокумент(ЭлементДанных.Отбор.Регистратор.Значение,Подразделение) Тогда
    ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
    КонецЕсли;
    Возврат;
    КонецЕсли;
    КонецПроцедуры
    мЭтоПодразделение		 = РегистрыСведений.GML_НастройкаСистемыПодразделение.Получить().ПодразделениеТекущий;


    Изначально в ЦБ есть документы с изменениями, зарегистрированными для всех подразделений, и они попадают в нужную ПБ. Но при следующем обмене эти документы удаляются. Почему? Что я делаю не так?
  2. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    удаляются самопроизвольно в периферийной или главной?
    обработками ничего не удаляете?
  3. TopicStarter Overlay
    eryomin
    Offline

    eryomin

    Регистрация:
    3 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Пока не понял, изучаю. База боевая, объем большой. Вот такой фрагмент из периферийки:



    <v8:ObjectDeletion>

    <v8:Ref xmlns="" xsi:type="DocumentRef.GML_ПередаваемыеЦенности">b1b8002b-528c-11e3-92ad-001d9200c86f</v8:Ref>​
    </v8:ObjectDeletion>

    История вопроса такова. Слетела центральная база. Я подменил ее копией. Чтобы документы ушли на периферийки, обработкой зарегистрировал изменения за несколько дней. Не мудрствуя лукаво, для всех узлов. Не здесь ли у меня ошибка? Может, доки удаляются из тех баз, которым они не принадлежат, но как тогда они туда попадают?
  4. TopicStarter Overlay
    eryomin
    Offline

    eryomin

    Регистрация:
    3 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Первые сообщения об удалении документов появляются при второй выгрузке из центральной базы
  5. TopicStarter Overlay
    eryomin
    Offline

    eryomin

    Регистрация:
    3 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Не знаю, как работает механизм обмена. Поправьте, пожалуйста, если это не так.
    Версия такова: документ относится к одному узлу, а изменения его зарегистрированы для всех узлов. Центральная база, не получив сведений о документе от периферийной, к которой он не относится, считает, что документ удален, и удаляет его из всех перифериек, включая ту, к которой документ отношение имеет.
    Попробую начать все сначала.
  6. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    нет, документ просто не уйдет в чужой узел, а останется висеть зарегистрированным. то, что удаления приходят вторым циклом говорит о том, что эти объекты где-то удаляются.
    посмотрите еще на подписки на события плана обмена, может там что-то есть.
  7. TopicStarter Overlay
    eryomin
    Offline

    eryomin

    Регистрация:
    3 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Подписок нет совсем. Документ останется висеть зарегистрированным всегда? Обмен будет каждый раз пытаться его отправить?
  8. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    да, только отправлять не будет - обработчик не даст. а вот удаление отправится с удовольствием, в том числе и не в свой узел
  9. TopicStarter Overlay
    eryomin
    Offline

    eryomin

    Регистрация:
    3 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Не в своем узле удалить надо, если там что-то есть. При удалении когда снимается регистрация изменений, при получении подтверждения от периферийки?
    Кстати, я не сказал, что движок 1С:Предприятие 8.1 (8.1.15.14)
  10. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    удаление - это отдельная такая сущность, которая передается между базами и говорит, что объект был удален из базы. тот кусок xml, который вы приводили - это оно и есть. при снятии объекта с регистрации оно не посылается, только если объект удаляется из базы физически либо программно, либо удалением помеченных объектов, либо интерактивным удалением (если пользователю разрешено такое)

    8.1 и 8.2 в планах обмена ведут себя одинаково
  11. TopicStarter Overlay
    eryomin
    Offline

    eryomin

    Регистрация:
    3 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Проблема, вроде бы, благополучно разрешилась после повторного восстановления центральной базы и регистрации изменений документов только для узлов назначения.
  12. TopicStarter Overlay
    eryomin
    Offline

    eryomin

    Регистрация:
    3 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Нет, проблема не решена! Как мне запретить передачу объекта типа УдалениеОбъекта в любом случае?
  13. TopicStarter Overlay
    eryomin
    Offline

    eryomin

    Регистрация:
    3 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Например, будет ли работать такой код:


    Если ТипЗнч(ЭлементДанных)=Тип("УдалениеОбъекта") Тогда
    ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
    Возврат;
    КонецЕсли;
  14. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    да, так должен подавить передачу удалений
  15. TopicStarter Overlay
    eryomin
    Offline

    eryomin

    Регистрация:
    3 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    спасибо за помощь, все работает

Поделиться этой страницей