|
Удаление двойников в справочнике | ☑ | ||
---|---|---|---|---|
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) написал что делать
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |