8.х Удаление двойников из справочника "контрагенты"

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем ILDARIAN, 17 ноя 2013.

  1. TopicStarter Overlay
    ILDARIAN
    Offline

    ILDARIAN Опытный в 1С

    Регистрация:
    6 янв 2013
    Сообщения:
    131
    Симпатии:
    1
    Баллы:
    29
    разобрался

    Код:
    Выборка = Справочники.ОбщиеКонтрагенты.Выбрать();
    Пока Выборка.Следующий()  Цикл
    Элемент = Выборка.ПолучитьОбъект();
    ТекЭлемент = ПолучитьТелефонКонтрагента(Элемент.Телефон);
    Элемент.Телефон = ТекЭлемент;
    Элемент.Записать();
    КонецЦикла;
    
  2. TopicStarter Overlay
    ILDARIAN
    Offline

    ILDARIAN Опытный в 1С

    Регистрация:
    6 янв 2013
    Сообщения:
    131
    Симпатии:
    1
    Баллы:
    29
    В общем сделал так: Добавил ещё 1 реквизит, записал туда числовые значения телефона. Далее уже искал двойников по этому реквизиту и помечал их на удаление. Таким образом не меняя значения реквизита "Телефон".
    ----------------
    Такой вот код


    Код:
    Процедура УдалитьДвойников(Команда)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ОбщиеКонтрагенты.Телефон2 КАК Телефон2,
    | МАКСИМУМ(ВЫБОР
    |   КОГДА ОбщиеКонтрагенты.ЕДРПОУ = ""
    |					  ТОГДА 0
    |				  ИНАЧЕ 1
    |			  КОНЕЦ + ВЫБОР
    |				  КОГДА ОбщиеКонтрагенты.ИПН = ""
    |    ТОГДА 0
    |   ИНАЧЕ 1
    |  КОНЕЦ) КАК КоличествоЗаполненныхРеквизитов
    |ПОМЕСТИТЬ ВТ_ПовторяющиесяКонтрагенты
    |ИЗ
    | Справочник.ОбщиеКонтрагенты КАК ОбщиеКонтрагенты
    |ГДЕ
    | ОбщиеКонтрагенты.Телефон2 <> """"
    |
    |СГРУППИРОВАТЬ ПО
    | ОбщиеКонтрагенты.Телефон2
    |
    |ИМЕЮЩИЕ
    | КОЛИЧЕСТВО(*) > 1
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | МАКСИМУМ(ОбщиеКонтрагенты.Ссылка) КАК Контрагент,
    | ОбщиеКонтрагенты.Телефон2
    |ПОМЕСТИТЬ ВТ_НужныеКонтрагенты
    |ИЗ
    | Справочник.ОбщиеКонтрагенты КАК ОбщиеКонтрагенты
    |  ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПовторяющиесяКонтрагенты КАК ВТ_ПовторяющиесяКонтрагенты
    |  ПО ОбщиеКонтрагенты.Телефон2 = ВТ_ПовторяющиесяКонтрагенты.Телефон2
    |   И (ВЫБОР
    |    КОГДА ОбщиеКонтрагенты.ЕДРПОУ = ""
    |							 ТОГДА 0
    |						 ИНАЧЕ 1
    |					 КОНЕЦ + ВЫБОР
    |						 КОГДА ОбщиеКонтрагенты.ИПН = ""
    |	 ТОГДА 0
    |    ИНАЧЕ 1
    |   КОНЕЦ = ВТ_ПовторяющиесяКонтрагенты.КоличествоЗаполненныхРеквизитов)
    |
    |СГРУППИРОВАТЬ ПО
    | ОбщиеКонтрагенты.Телефон2
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ОбщиеКонтрагенты.Ссылка КАК Контрагент
    |ИЗ
    | Справочник.ОбщиеКонтрагенты КАК ОбщиеКонтрагенты
    |  ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПовторяющиесяКонтрагенты КАК ВТ_ПовторяющиесяКонтрагенты
    |  ПО ОбщиеКонтрагенты.Телефон2 = ВТ_ПовторяющиесяКонтрагенты.Телефон2
    |  ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_НужныеКонтрагенты КАК ВТ_НужныеКонтрагенты
    |  ПО ОбщиеКонтрагенты.Телефон2 = ВТ_НужныеКонтрагенты.Телефон2";
    //|   И ОбщиеКонтрагенты.Ссылка <> ВТ_НужныеКонтрагенты.Контрагент";
    
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    Пока Выборка.Следующий() Цикл
    
    Выборка.Контрагент.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
    
    КонецЦикла;
    
    КонецПроцедуры
    Функция ПолучитьТелефонКонтрагента(ТекСтрока)
    НоваяСтрока = "";
    
    Для Сч=1 По СтрДлина(ТекСтрока) Цикл
    
    ТекСимвол = Сред(ТекСтрока, Сч, 1);
    
    Если ТекСимвол = "1"
    ИЛИ ТекСимвол = "2"
    ИЛИ ТекСимвол = "3"
    ИЛИ ТекСимвол = "4"
    ИЛИ ТекСимвол = "5"
    ИЛИ ТекСимвол = "6"
    ИЛИ ТекСимвол = "7"
    ИЛИ ТекСимвол = "8"
    ИЛИ ТекСимвол = "9"
    ИЛИ ТекСимвол = "0"
    Тогда
    НоваяСтрока = НоваяСтрока + ТекСимвол;
    
    
    КонецЕсли;
    КонецЦикла;
    
    возврат НоваяСтрока;
    КонецФункции
    &НаКлиенте
    Процедура ПреобразоватьТелефоны(Команда)
    
    Выборка = Справочники.ОбщиеКонтрагенты.Выбрать();
    Пока Выборка.Следующий()  Цикл
    Элемент = Выборка.ПолучитьОбъект();
    //Если СтрДлина(Элемент.Телефон) < 20 Тогда 
    ТекЭлемент = ПолучитьТелефонКонтрагента(Элемент.Телефон);
    Элемент.Телефон2 = ТекЭлемент;
    Элемент.Записать();
    //КонецЕсли;
    КонецЦикла;
    
    КонецПроцедуры
    
    Спасибо всем за помощь

Поделиться этой страницей