у кого нить есть обработка по удалению сдублированых строк справочника??? вернее пометку на удаление нуно сделать, а то они фигурируют еще и в документах, их тоже прийдется перебирать...
строки в справочнике контрагенты удвоилиськак избавиться??? оч срочно!!!
Автор alina_r, 11.10.2006, 16:02
#2
Отправлено 11.10.2006, 20:26:30
Самый простейший вариант:
Процедура ДубльСтрок() Спр=создатьОбъект("Справочник.Номенклатура"); Спис=СоздатьОбъект("СписокЗначений"); Спр.ВыбратьЭлементы(); пока Спр.ПолучитьЭлемент()=1 Цикл если Спр.ЭтоГруппа()=1 тогда продолжить; КонецЕсли; Если Спис.НайтиЗначение(спр.Код)<>0 Тогда Спр.Удалить(0); Иначе Спис.ДобавитьЗначение(Спр.Код); КонецЕсли; КонецЦикла; КонецПроцедуры
#3
Отправлено 12.10.2006, 13:19:45
При написании вчера кода, увы мне не учел, что в таких случаях просто на код ориентироваться нельзя, лучше будет все таки так:
Процедура ДубльСтрок() Спр=создатьОбъект("Справочник.Номенклатура"); Спис=СоздатьОбъект("СписокЗначений"); Спр.ВыбратьЭлементы(); пока Спр.ПолучитьЭлемент()=1 Цикл если Спр.ЭтоГруппа()=1 тогда продолжить; КонецЕсли; КодСпр=""+Спр.ПолныйКод()+","+Спр.ПолноеНаименование(); Если Спис.НайтиЗначение(КодСпр)<>0 Тогда Спр.Удалить(0); Иначе Спис.ДобавитьЗначение(КодСпр); КонецЕсли; КонецЦикла; КонецПроцедурыТаким образом Вы пометите на удаление все задвоенные элементы в нужном справочнике.
#5
Отправлено 12.10.2006, 23:42:29
они удвоились оч оригинально! в бух справке, которой вносили остатки ссылка на 1 наименование, а в документах, причем не во всех, на второе...строки идентичны, практически, поэтому нуно избавиться от любого из экземпляров, и в бухсправке, или опять же в документах, и затем сослаться уже на непомеченый на удаление
коряво вносили данные, без мысли о сослуживцах...
коряво вносили данные, без мысли о сослуживцах...
#6
Отправлено 13.10.2006, 08:49:08
Удвоились значит не программно? Т.е. например есть контрагент ТОО Альфа с кодом 00001 также есть Альфа с кодом 99999. Но у них есть РНН они наверно одинаковые.
Предлагаю поменять поиском и сравнением по РНН. Потом чтобы поменять в доках надо через ссылки. Если задвоенных контрагентов не много и доки не много тогда вручную сделайте а ак обработку написать пол часа.
Предлагаю поменять поиском и сравнением по РНН. Потом чтобы поменять в доках надо через ссылки. Если задвоенных контрагентов не много и доки не много тогда вручную сделайте а ак обработку написать пол часа.
#7
Отправлено 13.10.2006, 11:07:39
строк около 100 а вот документов оч много, и тут неизвестно какие куда ссылаются...я строки пометила на удаление, по порядку вышло что большая часть помеченых оказалась со ссылкой на начальные остатки, вот теперь моно подсказку? мне как то нужно обратиться к справочнику и выбрать только непомеченые на удаление строки, есть такой оператор? я чот никак не нахожу подходящее ничо
#8
Отправлено 13.10.2006, 11:35:01
Ну и в чем именно проблема? Тебя удовлетворяет удаление которое проедложил Olege? Если да, то потом пробегаешься по всем документам, по их табличным частям. Выбираешь элемент справочника и если он помечен на удаление, то находишь его двойника и подставляешь в табличную часть...
Если все еще есть проблема с нахождением двойников, то надо более конкретно описать что за двойники, что у них общего (наименование, код или еще что...).
Если все еще есть проблема с нахождением двойников, то надо более конкретно описать что за двойники, что у них общего (наименование, код или еще что...).
#11
Отправлено 13.10.2006, 12:06:59
[ Выбираешь элемент справочника и если он помечен на удаление, то находишь его двойника и подставляешь в табличную часть...
[/quote]
ну стопор у меня тут, ну что поделаешь, перебираю я таким манером, а вот на двойника как перейти?
понимаю что мелочь, для некоторых, а я вот застряла
Пока Док.ПолучитьДокумент() = 1 Цикл
ДокДвижения = Док.ТекущийДокумент();
Контрагент = ДокДвижения.Контрагент;
Спр.НайтиЭлемент(Контрагент);
Если Спр.ПометкаУдаления() = 1 Тогда
??? вот тут чо нуно написать???
Док.Контрагент = Спр.ТекущийЭлемент();
Док.записать();
КонецЕсли;
КонецЦикла;
[/quote]
ну стопор у меня тут, ну что поделаешь, перебираю я таким манером, а вот на двойника как перейти?
понимаю что мелочь, для некоторых, а я вот застряла
Пока Док.ПолучитьДокумент() = 1 Цикл
ДокДвижения = Док.ТекущийДокумент();
Контрагент = ДокДвижения.Контрагент;
Спр.НайтиЭлемент(Контрагент);
Если Спр.ПометкаУдаления() = 1 Тогда
??? вот тут чо нуно написать???
Док.Контрагент = Спр.ТекущийЭлемент();
Док.записать();
КонецЕсли;
КонецЦикла;
#13
Отправлено 13.10.2006, 12:30:37
Если в оработку не заложешь логику подстановки дубликата придется все делать вручную. Зацепиться можно по РНН. Находим элемент с пометкой на удаления далее ищем его двойника но не помеченного по РНН. Допустим в переменной контр1 помечен на удаление в переменной контр2 тот который дожен остатся. далее ищем по ссылке их в объектах метаданных справочники и документы. меняем записываем и проводим. если не писать через метаданные тогда придеться писать через явно указанные объекты.Но обработок будет много на каждый вид документа и справочника.
#14
Отправлено 13.10.2006, 12:45:07
справочник 1, я изначально об етом в теме написала- Контрагенты. Документов пока тоже вид 1, по крайней мере так пользователи говорят.
РНН у контаргентов ясно дело совпадают...а где берут обработку replval.ert?
вот я вывесила кусочек модуля, кто нить подскажите, что поставить на место моих вопросиков?
РНН у контаргентов ясно дело совпадают...а где берут обработку replval.ert?
вот я вывесила кусочек модуля, кто нить подскажите, что поставить на место моих вопросиков?
#15
Отправлено 13.10.2006, 12:55:29
Пока Док.ПолучитьДокумент() = 1 Цикл
ДокДвижения = Док.ТекущийДокумент();
Контрагент = ДокДвижения.Контрагент;
Спр.НайтиЭлемент(Контрагент);
Если Спр.ПометкаУдаления() = 1 Тогда
Помеченный = Спр.ТекущийЭлемент();
Если Спр.НайтиПоРеквизиту(Контрагент.РНН) = 1 Тогда
Если Помеченный <> Спр.ТекущийЭлемент() Тогда
ДляЗамены = Спр.ТекущийЭлемент();
КонецЕсли;
КонецЕсли;
Док.Контрагент = ДляЗамены;
Док.записать();
КонецЕсли;
КонецЦикла;
Куда скинуть replval.ert???
ДокДвижения = Док.ТекущийДокумент();
Контрагент = ДокДвижения.Контрагент;
Спр.НайтиЭлемент(Контрагент);
Если Спр.ПометкаУдаления() = 1 Тогда
Помеченный = Спр.ТекущийЭлемент();
Если Спр.НайтиПоРеквизиту(Контрагент.РНН) = 1 Тогда
Если Помеченный <> Спр.ТекущийЭлемент() Тогда
ДляЗамены = Спр.ТекущийЭлемент();
КонецЕсли;
КонецЕсли;
Док.Контрагент = ДляЗамены;
Док.записать();
КонецЕсли;
КонецЦикла;
Куда скинуть replval.ert???
#17
Отправлено 13.10.2006, 13:52:05
>>Если Спр.НайтиПоРеквизиту(Контрагент.РНН) = 1 Тогда
>>Если Помеченный <> Спр.ТекущийЭлемент() Тогда
>>ДляЗамены = Спр.ТекущийЭлемент();
>>КонецЕсли;
Толко не Спр.НайтиПоРеквизиту(Контрагент.РНН), а так
Если Спр.ВыбратьЭлементыПоРеквизиту("РНН", Контрагент.РНН) = 1 Тогда
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Спр.ПометкаУдаления() = 1 Тогда
Продолжить;
Иначе
ДляЗамены = Спр.ТекущийЭлемент();
Прервать;
КонецЕсли;
КонецЦикла;
Иначе
Сообщить("Что-нидудь сообщаем ")
Продолжить; // Переходим к другому документу
КонецЕсли;
Ну естественно проверяем на то, что у нас ДляЗамены - не пустой, что мы нашли нужного контрагента...
>>Если Помеченный <> Спр.ТекущийЭлемент() Тогда
>>ДляЗамены = Спр.ТекущийЭлемент();
>>КонецЕсли;
Толко не Спр.НайтиПоРеквизиту(Контрагент.РНН), а так
Если Спр.ВыбратьЭлементыПоРеквизиту("РНН", Контрагент.РНН) = 1 Тогда
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Спр.ПометкаУдаления() = 1 Тогда
Продолжить;
Иначе
ДляЗамены = Спр.ТекущийЭлемент();
Прервать;
КонецЕсли;
КонецЦикла;
Иначе
Сообщить("Что-нидудь сообщаем ")
Продолжить; // Переходим к другому документу
КонецЕсли;
Ну естественно проверяем на то, что у нас ДляЗамены - не пустой, что мы нашли нужного контрагента...
Количество пользователей, читающих эту тему: 1
пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0