Имя: Пароль:
1C
1С v8
Удаление двойников в справочнике
,
0 ildarian
 
16.11.13
15:03
Добрый день!

база самописная.

Такая задача: нужно сравнить каждый элемент справочника "Контрагенты" со всеми остальными элементами по полю "Наименование". Из списка контрагентов с одинаковым наименованием, оставить тот, у которого заполнено больше реквизитов, а остальные пометить на удаление.

Как это можно реализовать ?
1 Сияющий Асинхраль
 
16.11.13
15:21
Обычно оставляют тот элемент, на который больше ссылок в системе. А вообще на ИТС есть обработка по замене ссылок с ненужного элемента на нужный, но в любом случае делается это обычно руками :-(, потому что удаление элементов автоматизировать, конечно, можно, но ИМХО не стоит, можно удалить что-нибудь нужное...
2 xenos
 
16.11.13
15:25
(1) > А вообще на ИТС есть обработка

На ИТС - плохая обработка лучше взять из торговли или УПП.

И её уже допилить, чтобы перед удалением значения реквизитов переносилось если не заполнены.
3 echo77
 
16.11.13
15:29
(2) всегда думал, что на и с тоже что в упп. Чем она плоха?
4 Поросенок Петр
 
16.11.13
15:32
Количество заполненных реквизитов, как дополнительный критерий выбора основного значения при слиянии в DataCommander...  Спасибо за идею! Не слушайте меня.
5 Armando
 
16.11.13
15:33
ВЫБРАТЬ
    Контрагенты.Наименование КАК Наименование
ПОМЕСТИТЬ ВТ_ПовторяющиесяКонтрагенты
ИЗ
    Справочник.Контрагенты КАК Контрагенты

СГРУППИРОВАТЬ ПО
    Контрагенты.Наименование

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(*) > 1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Контрагенты.Ссылка,
    ВТ_ПовторяющиесяКонтрагенты.Наименование КАК Наименование
ИЗ
    ВТ_ПовторяющиесяКонтрагенты КАК ВТ_ПовторяющиесяКонтрагенты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
        ПО ВТ_ПовторяющиесяКонтрагенты.Наименование = Контрагенты.Наименование
ИТОГИ ПО
    Наименование
6 Aleksey
 
16.11.13
15:33
(0) фееречискмй бред
7 Aleksey
 
16.11.13
15:34
Это все равно что сворачивать физ лица скажем по имени. Т.е. думаешь имя уникальное?
8 acsent
 
16.11.13
15:39
поиск и замена дублирующихся элементов
9 xenos
 
16.11.13
15:43
(3)> всегда думал, что на и с тоже что в упп. Чем она плоха?

На ИТС: Поиск и замена значений - меняет только в реквизитах, в движениях не меняет, надо еще препроводить документы.

Обработки из УПП и УТ  - меняют и в регистрах и препроводить не надо.

Там правда бывают нюансы, бывает из УТ не справляется с заменой и надо использовать из УПП иногда наоборот.
10 Поросенок Петр
 
16.11.13
15:45
В целом задача нормальная, но у меня есть обработка, которая может только выделить в качестве результирующих только тех, на кого больше ссылок в базе. А вот по заполненности реквизитов... Может быть когданибудь.
11 echo77
 
16.11.13
15:48
В упп есть обработка помск и замена дублирующихся элементов справочников. На сколько я помню поиск и замена значений в УПП нет.
А обработкой поиск и замена значений с ИТС я заменял ссылки на справочник, при этом перепроводить ничего не приходилос, после этого все прекрасно удалялось.

На сколько я помню на ИТС обе эти обработки

Где я проглядел?
12 ildarian
 
16.11.13
15:49
Дело в том что база маленькая очень, на много контрагентов нету ссылок как таковых. Нужно отсеивать именно по количеству заполненных реквизитов, ну и неплохо бы переносить значение реквизита из контрагента которого нужно удалить, в не заполненный реквизит контрагента, которого нужно оставить, если таковые имеются.
13 xenos
 
16.11.13
15:51
(10) > А вот по заполненности реквизитов...

Это проще написать под конкретный справочник, чем универсальную.
14 ildarian
 
16.11.13
15:53
напишите приблизительный код, я может дальше докумекаю, мало опыта у меня в программировании ещё :(
15 Поросенок Петр
 
16.11.13
15:53
(13) да вощем-то подпилить полчаса. Тока я щас пьян, а никто другой в ней не разберется.
16 xenos
 
16.11.13
15:56
Я бы сначала сделал у всех элементов одинаковые реквизиты

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ВложенныйЗапрос.Наименование КАК Наименование,
    |    ВложенныйЗапрос.Ссылка КАК Ссылка,
    |    ВложенныйЗапрос.ИНН КАК ИНН,
    |    ВложенныйЗапрос.КПП КАК КПП
    |ИЗ
    |    (ВЫБРАТЬ
    |        Контрагенты.Наименование КАК Наименование,
    |        Контрагенты.Ссылка КАК Ссылка,
    |        Контрагенты.ИНН КАК ИНН,
    |        Контрагенты.КПП КАК КПП
    |    ИЗ
    |        Справочник.Контрагенты КАК Контрагенты) КАК ВложенныйЗапрос
    |ИТОГИ
    |    МАКСИМУМ(ИНН),
    |    МАКСИМУМ(КПП)
    |ПО
    |    Наименование,
    |    Ссылка";

    Результат = Запрос.Выполнить();

    ВыборкаНаименование = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

    Пока ВыборкаНаименование.Следующий() Цикл
        Пока ВыборкаСсылка.Следующий() Цикл
             Об= ВыборкаСсылка.Ссылка.ПолучитьОбъект();
             Об.Инн=ВыборкаНаименование.ИНН;
             Об.КПП=ВыборкаНаименование.КПП;
             Об.Записать()
            
        КонецЦикла;
    КонецЦикла;



А потом уже сделал свертку двойников.
17 Поросенок Петр
 
16.11.13
15:56
(12) Вообще теоретически можно из заменямых взять эти значения. Если они в результирующей ссылке не заполнены. Блин, автор, ты мине больше помог чем я тебе)
18 ildarian
 
16.11.13
16:05
(16) не совсем понял, зачем делать одинаковыми реквизиты ?
19 acsent
 
16.11.13
16:20
у одного есть ИНН у ругого юр адрес. Какой оставим??
Самый лучший вариант заполнить у дублей все реквизиты, а потом удалять
20 Armando
 
16.11.13
16:35
Этот запрос по идее должен показать контрагентов, которых можно удалить. Сравнивается тупо по количеству заполненных реквизитов. Только надо допилить подсчет заполненности реквизитов.


ВЫБРАТЬ
    Контрагенты.Наименование КАК Наименование,
    МАКСИМУМ(ВЫБОР
            КОГДА Контрагенты.ИНН = ""
                ТОГДА 0
            ИНАЧЕ 1
        КОНЕЦ + ВЫБОР
            КОГДА Контрагенты.КПП = ""
                ТОГДА 0
            ИНАЧЕ 1
        КОНЕЦ) КАК КоличествоЗаполненныхРеквизитов
ПОМЕСТИТЬ ВТ_ПовторяющиесяКонтрагенты
ИЗ
    Справочник.Контрагенты КАК Контрагенты

СГРУППИРОВАТЬ ПО
    Контрагенты.Наименование

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(*) > 1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(Контрагенты.Ссылка) КАК Контрагент,
    Контрагенты.Наименование
ПОМЕСТИТЬ ВТ_НужныеКонтрагенты
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПовторяющиесяКонтрагенты КАК ВТ_ПовторяющиесяКонтрагенты
        ПО Контрагенты.Наименование = ВТ_ПовторяющиесяКонтрагенты.Наименование
            И (ВЫБОР
                КОГДА Контрагенты.ИНН = ""
                    ТОГДА 0
                ИНАЧЕ 1
            КОНЕЦ + ВЫБОР
                КОГДА Контрагенты.КПП = ""
                    ТОГДА 0
                ИНАЧЕ 1
            КОНЕЦ = ВТ_ПовторяющиесяКонтрагенты.КоличествоЗаполненныхРеквизитов)

СГРУППИРОВАТЬ ПО
    Контрагенты.Наименование
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Контрагенты.Ссылка КАК Контрагент
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПовторяющиесяКонтрагенты КАК ВТ_ПовторяющиесяКонтрагенты
        ПО Контрагенты.Наименование = ВТ_ПовторяющиесяКонтрагенты.Наименование
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_НужныеКонтрагенты КАК ВТ_НужныеКонтрагенты
        ПО Контрагенты.Наименование = ВТ_НужныеКонтрагенты.Наименование
            И Контрагенты.Ссылка <> ВТ_НужныеКонтрагенты.Контрагент
21 xenos
 
16.11.13
16:50
(18) > не совсем понял, зачем делать одинаковыми реквизиты ?

Если реквизиты одинаковые то все равно кого удалять.
22 ildarian
 
17.11.13
14:34
(20) Я правильно понимаю ? Запрос выдаст мне список контрагентов, которых нужно удалить ?
23 ildarian
 
17.11.13
15:38
Выдает такую ошибку, я решил сравнивать по номеру телефона.

{Справочник.ОбщиеКонтрагенты.Форма.ФормаСписка1.Форма(65)}: Ошибка при вызове метода контекста (Выполнить)
    Результат = Запрос.Выполнить();
по причине:
{(2, 2)}: Поле не найдено "ОбщиеКонтрагенты.Телефон"
<<?>>ОбщиеКонтрагенты.Телефон КАК Телефон,

справочник так и называется, и там есть поле "Телефон". Почему его не находит?.

Вот вся процедура.

&НаКлиенте
Процедура УдалитьДвойников(Команда)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ОбщиеКонтрагенты.Телефон КАК Телефон,
    |    МАКСИМУМ(ВЫБОР
    |            КОГДА ОбщиеКонтрагенты.ЕДРПОУ = ""
    |                ТОГДА 0
    |            ИНАЧЕ 1
    |        КОНЕЦ + ВЫБОР
    |            КОГДА ОбщиеКонтрагенты.ИПН = ""
    |                ТОГДА 0
    |            ИНАЧЕ 1
    |        КОНЕЦ) КАК КоличествоЗаполненныхРеквизитов
    |ПОМЕСТИТЬ ВТ_ПовторяющиесяКонтрагенты
    |ИЗ
    |    Справочник.ОбщиеКонтрагенты КАК Контрагенты
    
    |СГРУППИРОВАТЬ ПО
    |    ОбщиеКонтрагенты.Телефон
    
    |ИМЕЮЩИЕ
    |    КОЛИЧЕСТВО(*) > 1
    |;
    
    ////////////////////////////////////////////////////////////////////////////////
    
    |ВЫБРАТЬ
    |    МАКСИМУМ(ОбщиеКонтрагенты.Ссылка) КАК Контрагент,
    |    ОбщиеКонтрагенты.Телефон
    |ПОМЕСТИТЬ ВТ_НужныеКонтрагенты
    |ИЗ
    |    Справочник.ОбщиеКонтрагенты КАК Контрагенты
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПовторяющиесяКонтрагенты КАК ВТ_ПовторяющиесяКонтрагенты
    |        ПО ОбщиеКонтрагенты.Телефон = ВТ_ПовторяющиесяКонтрагенты.Телефон
    |            И (ВЫБОР
    |                КОГДА ОбщиеКонтрагенты.ЕДРПОУ = ""
    |                    ТОГДА 0
    |                ИНАЧЕ 1
    |            КОНЕЦ + ВЫБОР
    |                КОГДА ОбщиеКонтрагенты.ИПН = ""
    |                    ТОГДА 0
    |                ИНАЧЕ 1
    |            КОНЕЦ = ВТ_ПовторяющиесяКонтрагенты.КоличествоЗаполненныхРеквизитов)
    
    |СГРУППИРОВАТЬ ПО
    |    ОбщиеКонтрагенты.Телефон
    |;
    
    ////////////////////////////////////////////////////////////////////////////////
    
    |ВЫБРАТЬ
    |    ОбщиеКонтрагенты.Ссылка КАК Контрагент
    |ИЗ
    |    Справочник.ОбщиеКонтрагенты КАК Контрагенты
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПовторяющиесяКонтрагенты КАК ВТ_ПовторяющиесяКонтрагенты
    |        ПО ОбщиеКонтрагенты.Телефон = ВТ_ПовторяющиесяКонтрагенты.Телефон
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_НужныеКонтрагенты КАК ВТ_НужныеКонтрагенты
    |        ПО ОбщиеКонтрагенты.Телефон = ВТ_НужныеКонтрагенты.Телефон
    |            И ОбщиеКонтрагенты.Ссылка <> ВТ_НужныеКонтрагенты.Контрагент";
    
    Результат = Запрос.Выполнить();
    
    ВыборкаТелефон = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    ВыборкаСсылка = Результат.Выбрать();
    Пока ВыборкаТелефон.Следующий() Цикл
        Пока ВыборкаСсылка.Следующий() Цикл
            Об = ВыборкаСсылка.Ссылка.ПолучитьОбъект();
            Об.ЕДРПОУ = ВыборкаТелефон.ЕДРПОУ;
            Об.ИПН = ВыборкаТелефон.ИПН;
            Об.Записать();        
            
        КонецЦикла;
    КонецЦикла;
    
    
    
    
    
    
    
    
    
КонецПроцедуры
24 Wobland
 
17.11.13
15:39
(23) патамушта алиас таблицы не тот
25 ildarian
 
17.11.13
15:40
а как правильно ?
26 Wobland
 
17.11.13
15:42
(25) правильно спросить "а что это такое?"
27 ildarian
 
17.11.13
15:46
(26) А что это такое ? :)
28 Wobland
 
17.11.13
15:51
(27) более другое имя таблицы, по которому к ней, к её полям можно обращаться в других секциях запроса. объявляется ключевым словом КАК
29 romix
 
17.11.13
16:00
Я недавно этим заморочился: создал реквизит Ошибка, с которым элемент справочника окрашивается в списке в красный цвет. У всяких подозрительных элементов (что-то не заполнено или что-то дублируется) поставил этот признак ошибки. Аналогично по документам, в них поставил такой же реквизит Ошибка, который наследуется от справочников (или от пометок на удаление). Чисто программно может не получиться разрулить, т.к. в одном месте могли иметь в виду одно, в другом - другое. После переименования и пересохранения краснота убирается и журнал со справочником постепенно чистится.
30 ildarian
 
17.11.13
16:33
Поправил синонимы, теперь выдает ошибку:

{Справочник.ОбщиеКонтрагенты.Форма.ФормаСписка1.Форма(66)}: Ошибка при вызове метода контекста (Выполнить)
    Результат = Запрос.Выполнить();
по причине:
{(16, 5)}: Недопустимое поле для группировки "Телефон"
<<?>>ОбщиеКонтрагенты.Телефон
------------
подскажите что это значит пожалуйста и как это исправить ?
31 xenos
 
17.11.13
17:08
(30) Ты какой-то фигней занимаешься, я тебе уже в (16) написал что делать