Удаление объекта в узле обмена по обмену данными

05.06.13

Интеграция - Перенос данных 1C

Варианты удаления объектов на удаленном узле при обмене данными.

Порой при обмене данных получается ситуация когда из удаленного узла необходимо удалить определенные объекты и сделать это непосредственно очень проблематично. Возможные варианты решения такой проблемы рассматриваются в данной статье. Необходимо заметить, что в целом рассматривается ситуация с распределенными информационными базами (РИБ).

 Конкретная ситуация: по некоторым причинам необходимо по обмену (а если бы был прямой или удаленный доступ к удаленной базе, то вопрос бы просто отсутствовал) удалить некоторый объект из удаленной базы данных (БД).

 

Вариант 1. Использование объекта УдалениеОбъекта. Суть – находим ссылку на объект и по обмену посылаем в удаленную базу. Что-то вроде этого:

Узел = ПланыОбмена.ИмяНужногоПланОбмена.НайтиПоКоду("02");
Ссылка=Справочники.Номенклатура.НайтиПоКоду("000000026");
Удаление = Новый УдалениеОбъекта(Ссылка);
Удаление.Записать();
ПланыОбмена.ЗарегистрироватьИзменения(Узел, Удаление);

Но с данным кодом возникнет следующая проблема – при наличии строки Удаление.Записать(); будет удален объект в текущей базе (а это не нужно). При отсутствии строки Удаление.Записать(); в удаленной базе данные останутся, то есть задача не будет решена.

 Вот если в текущей БД нет такого объекта, то можно использовать следующее:

Узел = ПланыОбмена.ИмяНужногоПланОбмена.НайтиПоКоду("02");
Ссылка=Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор("de18c53b-c3a7-11e2-acf9-001966ee0859"));
Удаление = Новый УдалениеОбъекта(Ссылка);
Удаление.Записать();
ПланыОбмена.ЗарегистрироватьИзменения(Узел, Удаление); 

Примечание: в 1С8 следует различать УникальныйИдентификатор (UUID) и глобальный уникальный идентификатор (GUID). При необходимости в сети можно найти код преобразования UUID в GUID и обратно.

 В итоге получаем, что данный вариант подходит для случаев когда в удаленном узле необходимо удалить объекты, которые отсутсвуют в текущем узле.

 Необходимо учесть ситуацию, что в удаленном узле объект присутствует в других объектах (то есть, удалили номенклатуру «Валенки», а этот элемент присутствует в документах удаленного узла). Тут уже надо думать либо о восстановлении элемента в текущей базе либо предусмотреть замену удаляемого элемента на другой элемент.

Под задачу удаления объектов, которые отсутствуют в текущей БД весьма подходит //infostart.ru/public/173851/  (Регистрация на узлах обмена или перерегистрация Ссылок.) 

Но зачастую требуется удалить объект в удаленной БД, но в текущей БД он должен остаться.

  

Вариант 2. Муторный и не правильный.

Использовать вариант 1, отправить по обмену, получить подтверждение, восстановить элементы и предотвратить отправку восстановленных элементов в удаленный узел.

 

Вариант 3. Требуется вносить изменения в конфигуратор.

В модуле плана обмена в обработчике ПриОтправкеДанныхПодчиненному и/или ПриОтправкеДанныхГлавному отлавливаем нужные объекты и для них передаём Удаление.
Например:

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

Примечание: для универсальности возможен такой вариант. В план обмена вводим реквизит ВыполняемыйКод, тип строка неограниченной длины. В этот реквизит оперативно вставляется неоходимый программный код. Опять же следует учесть что процедура ПриОтправкеДанныхПодчиненному и ПриОтправкеДанныхГлавному срабатывает для КАЖДОГО отправляемого элемента.

Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)
    Попытка
       Выполнить(ВыполняемыйКод);
    Исключение
    КонецПопытки;
КонецПроцедуры

 

Вариант 4. Самостоятельно формировать файл XML.

Источник  http://www.cyberforum.ru/1c/thread396358-page4.html

 План обмена использую только для регистрации изменений, затем своей обработкой выгружаю выборку в XML по алгоритму из книги Радченко "Практическое пособие разработчика" (довольно просто и гибко получается).

Для передачи удаления объекта не требуется его регистрировать - достаточно выгрузить соответствющую "команду" в XML.

Если Не ВыгружаемыйОбъект.ОтражатьВБухгалтерскомУчете Тогда

    ВыгружаемыйОбъект = Новый УдалениеОбъекта(ВыгружаемыйОбъект.Ссылка);
КонецЕсли;

... и затем собственно сама выгрузка

ЗаписатьXML(ЗаписьXML, ВыгружаемыйОбъект);

 


А теперь подводные камни.

Если вы желаете удалить некоторый объект, то помните, что на этот объект могут быть завязаны и другие объекты в базе данных. Например – подчиненные справочники, движения документа, независимые регистры сведений и т.д., то есть те объекты которые не имеют смысла при отсутствии удаляемого объекта. Часть объектов можно найти достаточно просто (подчиненные справочники, движения документа, регистры сведений где объект является ведущим измерением), а вот некоторые достаточно проблематично, так как необходимо просматривать каждый объект и смотреть в коде какие изменения он вносит в БД при записи и/или проведении.

 

И последний совет. Если расхождения в удаленной БД достаточно велики по сравнению с текущей БД, то гораздо быстрее и проще заново создать БД удаленного узла.

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Перенос данных 1C Оптовая торговля Свертка базы Системный администратор Программист Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Хотите точно знать, что вы выгружаете? Хотите сворачивать товары по НДС или фильтровать товары по доп. реквизиту? Вы волшебник, которому необходимо превращать одних контрагентов в других? Хотите при выгрузке превратить группу товаров в один? Или просто нужен удобный OLE обмен между 1C:Управление торговлей (ред. 11 или 10) и 1С:Бухгалтерия предприятия (ред. 2 или 3). Тогда эта обработка для вас!

12900 руб.

19.04.2013    185076    405    407    

345

Перенос данных 1C НДС 22% Программист Бухгалтер 1С:Предприятие 8 Оперативный учет 7.7 1С:Торговля и склад 7.7 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Управленческий учет Платные (руб)

ВНИМАНИЕ! Разработка НЕ работает на 1с: ФРЕШ! Переносится из типовой конфигурации «Торговля и Склад», реакции 9.2 платформы «1С:Предприятие 7.7» в типовую конфигурацию «Бухгалтерия предприятия», редакции 3.0 платформы «1С: Предприятие 8.3» следующие документы и их операции (с соблюдением всех соответствующих проводок): Поступления товаров и услуг (в т.ч. комиссия), Реализации товаров и услуг (в т.ч. комиссия), ПКО и РКО, выписки банка, счета фактуры (выданные и полученный), Возвраты от покупателей и поставщику, Заявка Покупателя, Инвентаризация и другие (всего 28 видов документов, смотрите описание, приложенное к обработке)

15250 руб.

30.06.2014    70952    124    116    

131

Перенос данных 1C Системный администратор Программист 1С:Предприятие 8 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 Россия Платные (руб)

Надоели постоянные проблемы с синхронизацией УТ 10.3 и Бухгалтерии? Предлагаем удобное решение для одностороннего переноса данных из конфигурации "Управление Торговлей" 10.3 в конфигурацию "Бухгалтерия предприятия" 3.0

24400 руб.

25.09.2013    106876    205    265    

196

Перенос данных 1C НДС 22% Программист Бухгалтер 1С:Предприятие 8 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Предназначена для выгрузки/загрузки данных (обмен данными) из конфигурации УТ 10.3 / УТ 10.2 в конфигурацию БП 3.0 без использования планов обмена. Построена на основе обработки по переносу данных из УТ 10.3/10.2 в БП 2.0 http://infostart.ru/public/80686/ с сохранением функционала. Предусмотрен перенос ставок НДС 5, 7, 22%, если они добавлены в конфигурацию УТ 10.3.

6954 руб.

16.12.2013    194900    614    853    

456

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Платные (руб)

Что же Вы получаете? 2 способа обмена объектами – с ОДИНАКОВОЙ структурой и с ОТЛИЧАЮЩЕЙСЯ! Забудьте о том, что не могли ранее перенести данные между базами, из-за того, что изменилась структура объектов в одной из них с обновлением конфигурации – теперь это в прошлом! Теперь не помеха для обмена изменение состава реквизитов объекта (измерений, ресурсов)/состава табличных частей/реквизитов табличных частей/типов реквизитов! А так же получаете быстрый алгоритм обмена, с возможностью указания уровня выгрузки объектов по ссылкам! 2 способа обмена - ФАЙЛ, HTTP: Система слежения за дублями предопределенных элементов при загрузке; Система поиска связей объектов для выгрузки; Отборы для каждого объекта конфигурации в отдельности; Динамическая замена произвольных ссылок при обмене; Выбор регистров движений для выгрузки. (Обновление от 18.06.2026, версия 11.3.1, фоновая выгрузка-загрузка версия 1.4)

21960 руб.

28.08.2012    226427    337    287    

678

Перенос данных 1C Программист 1С:Предприятие 8 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Переход на УТ-10.3 в любой месяц года для любого количества баз для больших и средних объемов данных с документами и остатками. Обработка выгрузки выполнит проверку исходных данных и сформирует отчет о найденных ошибках в справочниках и документах. Партии переносятся с себестоимостью.

7320 руб.

25.02.2013    55151    27    38    

39

Перенос данных 1C Системный администратор Программист 1С:Предприятие 8 1С:Розница 2 1С:Бухгалтерия 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Хотите точно знать, что вы выгружаете? Хотите при выгрузке свернуть табличную часть? Вам необходимо превращать одни склады, статьи, контрагенты в другие? Или просто нужен удобный OLE обмен между 1C Розница (ред. 2) в 1С Бухгалтерия предприятия (ред. 3) или (ред 2). Тогда эта обработка для вас!

12500 руб.

30.09.2014    41221    10    12    

22
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. maikl007 99 31.12.14 09:52 Сейчас в теме
В БП 3.0 добавил следующий код в правила обмена для удаления объета (обработчик события - перед обработкой). Объект остается в центральной и удаляется в перефирийной базе.
1. Для удаления объектов:
Если Не Объект.МиграцияДокумента Тогда
	Узел = Планыобмена[ПРО.ИмяПланаОбмена].НайтиПоКоду("ПБ");
	ОбъектУдаления = Новый УдалениеОбъекта(Объект.Ссылка);
	ПланыОбмена.ЗарегистрироватьИзменения(Узел, ОбъектУдаления);
	Отказ = Истина;
КонецЕсли;

2. Для удаления записей регистров:
Если Не Объект.Отбор.Регистратор.Значение.МиграцияДокумента Тогда
	Узел = Планыобмена[ПРО.ИмяПланаОбмена].НайтиПоКоду("ПБ");
	Регистратор = Объект.Отбор.Регистратор.Значение;
	НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Регистратор.Установить(Регистратор);
	ПланыОбмена.ЗарегистрироватьИзменения(Узел, НаборЗаписей);
	Отказ = Истина;
КонецЕсли;
It-developer; forseil; druv; s.w.a.t.; Rudakov_D; +5 Ответить
2. serko8547 114 05.02.26 11:32 Сейчас в теме
Хочу дать уточнение: что указанный код:

Узел = ПланыОбмена.ИмяНужногоПланОбмена.НайтиПоКоду("02");
Ссылка=Справочники.Номенклатура.НайтиПоКоду("000000026");
Удаление = Новый УдалениеОбъекта(Ссылка);
Удаление.Записать();
ПланыОбмена.ЗарегистрироватьИзменения(Узел, Удаление);

не удаляет изменения, он удаляет САМИ ОБЪЕКТЫ! т.е. если вы указали какой-то документ - то этот документ вы удалите полностью! вот вообще!
за это отвечает этот кусок кода:
Удаление = Новый УдалениеОбъекта(Ссылка);
Удаление.Записать();


правильно будет по-другому:
		Узел = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоНаименованию("Нужный вам узел");
		мСсылка=Док.ссылка;
		ПланыОбмена.УдалитьРегистрациюИзменений(Узел, мСсылка);
Для отправки сообщения требуется регистрация/авторизация