Имя: Пароль:
1C
1С v8
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) это вопрос задай автору портянок, мне чего его задаешь ?