Создал правила по переносу справочников. Все в общем то стандартно.
При выгрузке отслеживал сообщениями что там с пометкой удаления у объектов и они все выгружаются.
Но после того как я загружаю все в приемник все элементы без пометки удаления.
Пробовал в ПКО после выгрузки написать:
Если Объект.ПометкаУдаления = 1 Тогда
Объект.УстановитьПометкуУдаления(Истина,Ложь);
КонецЕсли;
Элемент переносится с пометкой на удаление но выдает ошибку и все на этом останавливается.
Ошибка в обработчике события ПослеЗагрузкиОбъекта
ИмяПКО = Номенклатура
ТипОбъекта = Номенклатура
Объект = Банки
Обработчик = ПослеЗагрузкиОбъекта
ОписаниеОшибки = Ошибка при вызове метода контекста (УстановитьПометкуУдаления): Элемент не выбран!
ПозицияМодуля = (1)
КодСообщения = 21
Ошибка при загрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1629)}: Ошибка в обработчике события ПослеЗагрузкиОбъекта
ИмяПКО = Номенклатура
ТипОбъекта = Номенклатура
Объект = Банки
Обработчик = ПослеЗагрузкиОбъекта
ОписаниеОшибки = Ошибка при вызове метода контекста (УстановитьПометкуУдаления): Элемент не выбран!
ПозицияМодуля = (1)
КодСообщения = 21
А ошибка из (4), я смотрю, происходит в момент загрузки, для загрузки в обработчиках загрузки применяли метод УстановитьПометкуУдаления ? Или это что-то типовое?
Думаю может в ПВД нужно что то написать, но не знаю, что в исходящих данных и как там что сравнивать. Без отладчика и обращения к методам и св-ам через точку тяжко
только не понятно, правила пометку удаления передают и без доп. кода, надо наверное найти, в какой момент она снимается. Кстати, для пометки удаления сделано ПКС ?
(7) adva, Да ПКС есть, я даже поиск по ней веду. Объекты новые. Но это же не документ, я не могу установить какой то режим записи.
После выгрузки пробовал сделать что то такое:
//Если Объект.ПометкаУдаления = 1 Тогда
Объект.УстановитьПометкуУдаления(Истина,Ложь); // 1 вариант, просто пометку пробовал установить
Если Не ОбъектНайден Тогда // 2 вариант
Объект.Получить();
Объект.УстановитьПометкуУдаления(Истина,Ложь);
Объект.Записать();
КонецЕсли;
КонецЕсли
Показать
;
И в общем ничего вразумительного это не дает, так как я делаю это в ПКО
по поводу (8). Надо сначала записать объект, а затем устанавливать пометку на удаление. У Вас наоборот, пытаетесь установить пометку у несуществующего объекта, а затем его записать.
Если Объект.ПометкаУдаления = 1 Тогда
Если Объект.ЭтоНовый() Тогда // Более грамотно Объект.Модифицированность(), но 1Сники в КД могут манипулировать
Объект.Записать();
КонецЕсли;
Объект.УстановитьПометкуУдаления(Истина,Ложь);
КонецЕсли
(17) ИНТЕГРА, Вставил это в После Выгрузки в ПКО, ошибок не выдало, но и пометок на удаление нет.
(18) insurgut, конфигурация типовая, никаких дополнительный изменений не вносил, так что даже не предположу что там искать на этот счет.
(13) adva, если в ПКС пометки удаления присовить Значению истину или ложь, соответственно у всех объектов будет эта пометка или не будет. Теоритически. Так то они у меня не переносятся все равно. Если присвоить значению ложь, но в После выгрузки в тело условия никогда не зайдет.
(9) PhoenixAOD, В ПКО в событие после выгрузки нет "Значение", значение установить можно в ПКС. Сделал так для ПКС - пометка при загрузке слетает.
(10) В ПКО писал в После выгрузки
Если Объект.ПометкаУдаления = ИСТИНА Тогда
Объект.УстановитьПометкуУдаления(Истина,Ложь);
КонецЕсли;
Выгрузка проходит нормально.
При загрузке выдает:
Начало загрузки: 02.11.2015 11:25:29
Ошибка в обработчике события ПослеЗагрузкиОбъекта
ИмяПКО = Номенклатура
ТипОбъекта = Номенклатура
Объект = 3
Обработчик = ПослеЗагрузкиОбъекта
ОписаниеОшибки = Ошибка при вызове метода контекста (УстановитьПометкуУдаления): Элемент не выбран!
ПозицияМодуля = (3)
КодСообщения = 21
Ошибка при загрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1629)}: Ошибка в обработчике события ПослеЗагрузкиОбъекта
ИмяПКО = Номенклатура
ТипОбъекта = Номенклатура
Объект = 3
Обработчик = ПослеЗагрузкиОбъекта
ОписаниеОшибки = Ошибка при вызове метода контекста (УстановитьПометкуУдаления): Элемент не выбран!
ПозицияМодуля = (3)
КодСообщения = 21
Окончание загрузки: 02.11.2015 11:25:30
Загружено объектов: 4
Показать
Объект на который выдается ошибка загружается с пометкой удаления, но дальше загрузка уже не идет.
(12) не вижу смысла при выгрузке устанавливать пометку удаления, если она уже стоит.
В ПКС ПометкаУдаления и надо было писать Значение = Истина (если она стоит).
Обработчики загрузки в ПКО используют установку пометки удаления? Почему-уверены, что именно с пометкой удаления связана ошибка? А если для ПКС присвоить Значение = Ложь, то ошибки не будет?
Не понял, а зачем в событии после выгрузки устанавливать пометку удаления, надо в ПКО в событии после загрузки устанавливать. Или где должны быть пометки, в источнике? ПослеВыгрузки отрабатывает в источнике, а ПослеЗагрузки, в приемнике.
И еще момент, вроде бы в обработчиках при выгрузке используется Источник, а при загрузке ОБъект. В итоге какой именно обработчик используется: у Вас используется и Объект, и ПослеВыгрузки?
предполагаю, что снятие пометки удаления происходит уже после отработки кода правил, а где именно, надо будет смотреть в отладчике. Попробуйте выгрузить один элемент, и проверить (можете для скорости отключить прочие ПКС).
У вас в конфигураторе базы приемника при записи объекта ничего не происходит? Или события подписки может при записи отрабатывают какие-то? Достаточно сопоставить реквизит источника и приемника в ПКО, все. Никаких проверок, никаких действий после загрузки производить НЕ НАДО. Не там копаете. Правила тут ни при чем, и ничего вы ими не сделаете.
на мисте нашел похожую тему, вроде как при выгрузке объектов по ссылке слетает пометка удаления (конфа там была бух 3). В правилах вроде такой флажок тоже был, но судя по ответам причина не в нем оказалась. Хотя результата изысканий там не приводилось. В общем в отладчике быстрее выясните.
Если СвойстваПоиска["ЭтоГруппа"] Тогда
СтрокаИменСвойствПоиска = "Наименование, ЭтоГруппа, Родитель";
Иначе
СтрокаИменСвойствПоиска = "ПолноеНаименование, Родитель, ПометкаУдаления";
КонецЕсли;
После выгрузки ничего рабочего нет. Все куски кода что я пытался туда вставить написаны выше.
(20) adva, Я как то не разобрался как отладчиком воспользоваться. Включаю отладчик. Создаю там внешнюю обработку, копирую в модуль предложенный код. В загручке/выгрузке указываю это обработку. и ничего не происходит
(24) Xershi, в какой то статье по переносу справочников увидел такой пример с поиском, было написато что то вроде, что у группы нет же всех тех полей поиска что есть у элемента справочника.
http://i.imgur.com/l0tpzvE.png?1
(25) Wefast, как минимум - снимите флаг поиска по реквизиту Пометка удаления - вероятнее всего именно по этому у вас флаг слетает. По родителю искать тоже плохой вариант (если вы перекините номенклатуру в другую группу, то у вас получится что? Дубль!). Вообще поиск номенклатуры по реквизитам штука крайне прихотливая, и если нет четких договоренностей, и вам говорят "вначале по коду, потом по наименованию, потом по полному наименованию, по родителю и т.д. и т.п. - это неизбежно будет приводить к дублям номенклатуры.Если обмен новый и база новая - сразу же убирайте эти вариации и делайте поиск только по внутреннему идентификатору, безо всяких полей поиска. Если же база старая, то необходима долгая работа, возможно даже создание спец. реквизитов, вроде УникальныйКод, по которому и делать синхронизацию.
(28) insurgut, правила https://yadi.sk/d/yl7LCOKYkCHdU БухгалтерияСтроительнойОрганизации 2.0.62.1
1С:Управление строительной организацией, редакция 1.3.66.4
Проблема актуальна для любого справочника. Но экспериментирую над справочником номенклатуры
(29) insurgut, база изначально с дублями. Поэтому так много полей для поиска.
(26) insurgut, переношу справочники из нескольких баз. По идентификатору в этом случае если я правильно понимаю он задублирует все.
(30) Wefast, раз есть дубли, то нужно этот вопрос в начале решить. А только потом делать перенос.
Я в таких случаях делал ИД справочника (делает уникальность) и по нему поле поиска делал.
Поля поиска это уникальные значения. Т.к. если взять комбинацию этих полей, то в базе не должно быть больше 1 такой записи. А у вас этих полей пруд пруди...