|
v8: Удаление контрагентов | ☑ | ||
---|---|---|---|---|
0
DmitriyMaxion
07.10.13
✎
14:51
|
Добрый день, поставленна здача почистить справочники контрагентов.
Как проверить есть ли ссылка на этого контрагента где нибудь. Встречается ли он в каких либо документах |
|||
1
mikecool
07.10.13
✎
14:52
|
пометить на удаление все, удалить, что осталось - есть ссылки
|
|||
2
butterbean
07.10.13
✎
14:52
|
Операции - Поиск ссылок на объект
|
|||
3
DmitriyMaxion
07.10.13
✎
14:54
|
Спасибо)
|
|||
4
ДенисЧ
07.10.13
✎
14:54
|
НайтиПоСсылкам()
|
|||
5
DmitriyMaxion
07.10.13
✎
14:57
|
т.е. если не выдает ссылку значит этот контрагент нигде не используется???
|
|||
6
ДенисЧ
07.10.13
✎
14:58
|
(5) Ты гений! :-))
|
|||
7
DmitriyMaxion
07.10.13
✎
15:00
|
Умник)
|
|||
8
ДенисЧ
07.10.13
✎
15:01
|
(7) Ладно, не гений, а просто умник :-)
Я согласен |
|||
9
MSII
07.10.13
✎
15:03
|
ЧСВ задающего вопрос на Мисте обратно пропорционально сложности задаваемого вопроса. :)
|
|||
10
Нуф-Нуф
07.10.13
✎
15:04
|
(9) интересное наблюдение )))) +100500
|
|||
11
DmitriyMaxion
07.10.13
✎
15:18
|
У меня получается что на помеченные на удаление контрагенты много чего ссылается, их нельзя удалить, что делать?)))
|
|||
12
ДенисЧ
07.10.13
✎
15:21
|
(11) Не удалять...
|
|||
13
DmitriyMaxion
07.10.13
✎
15:40
|
Логично! =)) Тогда вообще ничег нельзя удлись, а задача стоит удалить ненужных контрагентов
|
|||
14
Laerys
07.10.13
✎
15:42
|
(13) настрой отображение списка по отбору и все, удалять вообще вредно)
|
|||
15
rbcvg
07.10.13
✎
15:42
|
(13) значит все контрагенты нужные.
|
|||
16
El_Duke
гуру
07.10.13
✎
15:42
|
(13) А у тебя нет ненужных в данном случае.Задача решена
|
|||
17
DmitriyMaxion
07.10.13
✎
15:43
|
Удалять нужно потому что переходим на 3.0 чтобы "мусор" не тянуть за собой...
|
|||
18
rbcvg
07.10.13
✎
15:44
|
(17) что есть "мусор"?
|
|||
19
El_Duke
гуру
07.10.13
✎
15:44
|
(17) тогда перенесите только остатки
ненужное не перенесется |
|||
20
DmitriyMaxion
07.10.13
✎
15:50
|
Мусор - помеченные на удаление и дубликаты....
|
|||
21
El_Duke
гуру
07.10.13
✎
15:51
|
(20) Ответ тебе уже дали.Тему будем продолжать ?
|
|||
22
DmitriyMaxion
07.10.13
✎
15:52
|
Будем..., как удалить эти объекты?
|
|||
23
El_Duke
гуру
07.10.13
✎
15:53
|
(22) Никак.
На них есть ссылки в базе. Далее продолжаем ? |
|||
24
DmitriyMaxion
07.10.13
✎
15:54
|
НЕТ!
|
|||
25
DmitriyMaxion
07.10.13
✎
15:55
|
Спасибо, зо своевременную помощь!
|
|||
26
El_Duke
гуру
07.10.13
✎
15:59
|
(25) Твой единственный выход почистить базу описан в (19)
|
|||
27
shlyahtich
07.10.13
✎
16:03
|
дарю
вот подписка не событие для справочника Процедура ПередЗаписьюСправочникаКонтрагенты(Источник, Отказ) Экспорт Если Источник.ОбменДанными.Загрузка Тогда Если Метаданные.Имя = "БухгалтерияПредприятия_БИТ_ФИНАНС" Тогда Если ТипЗнч(Источник.ОбменДанными.Отправитель) = Тип("ПланОбменаСсылка.БИТ_КС_ЗагрузкаРСБУ") Тогда Возврат; // при загрузке (Был дубль контрагента. Остатки по нему перенесли, поставили пометку на удаление. Ошибочно сняли пометку на удаление. Поставить пометку обратно я уже не могу, т.к. есть проведенные документы. КонецЕсли; КонецЕсли; Если НЕ (ПланыОбмена.ГлавныйУзел() = Неопределено) Тогда Возврат; // при загрузке в подчиненный узел не проверяем (Был дубль контрагента. Остатки по нему перенесли, поставили пометку на удаление. Ошибочно сняли пометку на удаление. Поставить пометку обратно я уже не могу, т.к. есть проведенные документы. КонецЕсли; КонецЕсли; //Проверка на то что контрагент есть в проведенных документах Если Источник.ПометкаУдаления Тогда СписокДок = Метаданные.ПодпискиНаСобытия.ПередЗаписьюДокументаЗапретНаРеквизитКонтрагентСПометкойУдаления.Источник.Типы(); ТекстЗапросаРез="ВЫБРАТЬ СУММА(ВложенныйЗапрос.Ссылка) КАК Ссылка ИЗ ("; Для Ном = 0 по СписокДок.Количество()-1 Цикл ДокОбъект=Метаданные.НайтиПоТипу(СписокДок[Ном]).ПолноеИмя(); Если ОбщегоНазначения.ЕстьРеквизитОбъектаМетаданных("Контрагент",ДокОбъект) Тогда ТекстЗапроса= "ВЫБРАТЬ КОЛИЧЕСТВО("+ДокОбъект+".Ссылка) ИЗ "+ДокОбъект+" ГДЕ "+ДокОбъект+".Проведен = ИСТИНА И "+ДокОбъект+".Контрагент = &Контрагент"+Символы.ПС; ТекстЗапросаРез = ТекстЗапросаРез+" "+ТекстЗапроса; ТекстЗапросаРез = ТекстЗапросаРез + " ОБЪЕДИНИТЬ "; КонецЕсли; КонецЦикла; ТекстЗапросаРез = Лев(ТекстЗапросаРез, СтрДлина(ТекстЗапросаРез)-12); ТекстЗапросаРез = ТекстЗапросаРез + ") КАК ВложенныйЗапрос"; Запрос = Новый Запрос(); Запрос.Текст = ТекстЗапросаРез; Запрос.УстановитьПараметр("Контрагент",Источник.Ссылка); Результат = Запрос.Выполнить().Выгрузить(); Если Результат[0].Ссылка>0 тогда #Если Клиент Тогда Ответ = Вопрос("Пометка на удаление контрагента запрещена, | так как есть проведенные документы с "+Источник+" | Продолжить?", РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет); Если Не Ответ = КодВозвратаДиалога.Да Тогда Отказ = ИСТИНА; КонецЕсли; #КонецЕсли КонецЕсли; КонецЕсли; //Проверка существующего контрагента с такими же ИНН и КПП Если Источник.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо И Лев(Источник.Комментарий, 8) <> "Ин.Фирма" И Источник.ПометкаУдаления = Ложь Тогда Если СтрДлина(СокрЛП(Источник.ИНН)) <> 10 ИЛИ СтрДлина(СокрЛП(Источник.КПП)) <> 9 Тогда ОбщегоНазначения.СообщитьОбОшибке("У контрагента не корректный ИНН или КПП. Элемент не записан."); Отказ = Истина; КонецЕсли; ЗапросК = Новый Запрос; ЗапросК.УстановитьПараметр("ИНН", Источник.ИНН); ЗапросК.УстановитьПараметр("КПП", Источник.КПП); ЗапросК.УстановитьПараметр("Ссылка", Источник.Ссылка); ЗапросК.УстановитьПараметр("ПометкаУдаления", Ложь); ЗапросК.Текст = "ВЫБРАТЬ | Контрагенты.Ссылка, | Контрагенты.ИНН, | Контрагенты.КПП, | Контрагенты.Наименование |ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | Контрагенты.ИНН = &ИНН | И Контрагенты.КПП = &КПП | И Контрагенты.Ссылка <> &Ссылка | И Контрагенты.ПометкаУдаления = &ПометкаУдаления" ; РезультатК = ЗапросК.Выполнить().Выбрать(); Если РезультатК.Количество() > 0 Тогда РезультатК.Следующий(); ОбщегоНазначения.СообщитьОбОшибке("В базе уже существует контрагент <" + РезультатК.Наименование + ">с такими же ИНН = " + РезультатК.ИНН + " и КПП = " + РезультатК.КПП,, "Элемент не записан."); Отказ = Истина; КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
28
shlyahtich
07.10.13
✎
16:03
|
//Проверка на то что контрагент есть в проведенных документах в тексте
|
|||
29
Кай066
07.10.13
✎
16:04
|
(20) Для удаления дублей есть специальная обработка ПоискИЗаменаДублирующихсяЭлементов.epf
|
|||
30
shlyahtich
07.10.13
✎
16:06
|
а это вдогонку в базу - на будущее
Процедура ПередЗаписьюДокументовПроверкаНаРеквизитКонтрагентСПометкойНаУдаление(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт Если ОбщегоНазначения.ЕстьРеквизитОбъекта("Контрагент",Источник) И ЗначениеЗаполнено(Источник.Контрагент) Тогда #Если Клиент Тогда Если Источник.Контрагент.ПометкаУдаления И Источник.ОбменДанными.Загрузка=Ложь Тогда Отказ = Истина; Сообщить("Проведение и запись документов с контрагентом, помеченными на удаление запрещено."+Символы.ПС+" Код: "+Источник.Контрагент.Код+"; Наименование: "+Источник.Контрагент+" "+Символы.ПС+"Изменения в "+Источник+" не могут быть записаны...", СтатусСообщения.Важное); КонецЕсли; #КонецЕсли КонецЕсли; КонецПроцедуры |
|||
31
El_Duke
гуру
07.10.13
✎
16:06
|
(29) В его руках эта вещь может быть опасной
|
|||
32
catena
07.10.13
✎
16:07
|
СправочникОбъект.<Имя справочника>.Удалить (CatalogObject.<Имя справочника>.Delete)
СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>) Удалить (Delete) Синтаксис: Удалить() Описание: Удаляет элемент справочника из базы данных. Важно! В отличие от метода УстановитьПометкуУдаления, данный производит непосредственное удаление элемента справочника без возможности восстановления и без проверки ссылочной целостности. Использовать данный метод нужно крайне осмотрительно. Пример: Объект.Удалить(); |
|||
33
Кай066
07.10.13
✎
16:08
|
(31) а эти портянки ^ он куда будет наматывать? Пройтись разок по ИНН и норм
|
|||
34
shlyahtich
07.10.13
✎
16:09
|
Пишешшь обработку вставляя туда данный код
СписокДок = Метаданные.ПодпискиНаСобытия.ПередЗаписьюДокументаЗапретНаРеквизитКонтрагентСПометкойУдаления.Источник.Типы(); ТекстЗапросаРез="ВЫБРАТЬ СУММА(ВложенныйЗапрос.Ссылка) КАК Ссылка ИЗ ("; Для Ном = 0 по СписокДок.Количество()-1 Цикл ДокОбъект=Метаданные.НайтиПоТипу(СписокДок[Ном]).ПолноеИмя(); Если ОбщегоНазначения.ЕстьРеквизитОбъектаМетаданных("Контрагент",ДокОбъект) Тогда ТекстЗапроса= "ВЫБРАТЬ КОЛИЧЕСТВО("+ДокОбъект+".Ссылка) ИЗ "+ДокОбъект+" ГДЕ "+ДокОбъект+".Проведен = ИСТИНА И "+ДокОбъект+".Контрагент = &Контрагент"+Символы.ПС; ТекстЗапросаРез = ТекстЗапросаРез+" "+ТекстЗапроса; ТекстЗапросаРез = ТекстЗапросаРез + " ОБЪЕДИНИТЬ "; КонецЕсли; КонецЦикла; ТекстЗапросаРез = Лев(ТекстЗапросаРез, СтрДлина(ТекстЗапросаРез)-12); ТекстЗапросаРез = ТекстЗапросаРез + ") КАК ВложенныйЗапрос"; Запрос = Новый Запрос(); Запрос.Текст = ТекстЗапросаРез; Запрос.УстановитьПараметр("Контрагент",Источник.Ссылка); Результат = Запрос.Выполнить().Выгрузить(); Если Результат[0].Ссылка>0 тогда И если Если НЕ Результат[0].Ссылка>0 тогда вставляй непосредственное удаление справочника |
|||
35
shlyahtich
07.10.13
✎
16:09
|
первую строчку чуток переделать
|
|||
36
El_Duke
гуру
07.10.13
✎
16:13
|
(33) это вопрос задай автору портянок, мне чего его задаешь ?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |