Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 06:39

Удаление дублирующихся записей в справочнике

Автор Electron, 17 ноя 2015, 13:37

0 Пользователей и 1 гость просматривают эту тему.

Electron

Добрый день, помогите пожалуйста разобраться с задачей, а то мозгов уже не хватает))
В общем есть справочник Дисциплины, в котором уже имеются повторяющиеся по наименованию элементы, собственно нужно от них избавиться) Набросал такой код, где на входе формируется массив всех элементов "до", а на выходе получаем массив без лишних элементов "после", но это массивы, а как выбрать тот элемент справочника, который нужно удалить, или сделать сравнение готового массива со справочником - придумать не могу, сможете помочь? Заранее спасибо)


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

Для Каждого ЭлементМассива Из МассивДисцилин Цикл
Сообщить("До: " + ЭлементМассива);
КонецЦикла;

ТекущийИндекс = 0;
ВсегоЭлементов = МассивДисцилин.Количество();
Пока ТекущийИндекс < ВсегоЭлементов Цикл
НовыйИндекс = ТекущийИндекс + 1;
Пока НовыйИндекс < ВсегоЭлементов Цикл
Если МассивДисцилин[НовыйИндекс] = МассивДисцилин[ТекущийИндекс] Тогда
МассивДисцилин.Удалить(НовыйИндекс);
ВсегоЭлементов = ВсегоЭлементов - 1;
Иначе
НовыйИндекс = НовыйИндекс + 1;
КонецЕсли;
КонецЦикла;
ТекущийИндекс = ТекущийИндекс + 1;
КонецЦикла;

Для Каждого ЭлементМассива Из МассивДисцилин Цикл
Сообщить("После: " + ЭлементМассива);
КонецЦикла;


Нынешний результат отработки:

vitasw


Electron


Kironten

Цитата: Electron от 17 ноя 2015, 17:04
Цитата: vitasw от 17 ноя 2015, 14:00
коды в элементах отличаются?
vitasw, да - коды разные)
А как вы планируете определять, какие надо удалять, если наименования одинаковые, а коды разные?

vitasw

В качестве примера:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Клиенты.Ссылка,
| Клиенты.Наименование
|ПОМЕСТИТЬ втКлиенты
|ИЗ
| Справочник.Клиенты КАК Клиенты
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| внЗапрос.Наименование КАК Наименование,
| внЗапрос.СсылкаДубликат,
| внЗапрос.КоличествоСовпадений КАК КоличествоСовпадений
|ИЗ
| (ВЫБРАТЬ
| втКлиенты.Наименование КАК Наименование,
| втКлиенты1.Ссылка КАК СсылкаДубликат,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ втКлиенты1.Ссылка) КАК КоличествоСовпадений
| ИЗ
| втКлиенты КАК втКлиенты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ втКлиенты КАК втКлиенты1
| ПО втКлиенты.Наименование = втКлиенты1.Наименование
| И втКлиенты.Ссылка <> втКлиенты1.Ссылка
|
| СГРУППИРОВАТЬ ПО
| втКлиенты.Наименование,
| втКлиенты1.Ссылка) КАК внЗапрос
|ИТОГИ
| СУММА(КоличествоСовпадений)
|ПО
| Наименование";

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

spinnen.87

Если не подходят уже готовые обработки поиска и замены дублей, то почему не открыть ее в конфигураторе и не попробовать подправить под себя?

Electron

Цитата: Kironten от 17 ноя 2015, 17:08
А как вы планируете определять, какие надо удалять, если наименования одинаковые, а коды разные?
Ну так вот для этого и крутил массивы, правда дальше дело не пошло))

Цитата: vitasw от 17 ноя 2015, 17:23
В качестве примера:
Завтра повникаю в ваш пример)

Цитата: spinnen.87 от 17 ноя 2015, 20:21
Если не подходят уже готовые обработки поиска и замены дублей, то почему не открыть ее в конфигураторе и не попробовать подправить под себя?
Готовые пробовал - слишком сложно что-либо понять, тем более новичку со стажем не более месяца))
Легче наверное по новому написать, но вот вроде суть проста, скорей всего отделаться можно парой строк, но не догоняю)

spinnen.87

Раз новичок как и я, то легче воспользоваться помощью знающих. Заплатить за разработку обработки.
Если я правильно понимаю, то на дубли могут ссылаться другие объекты и нужно еще заменить ссылки в этих объектах с удаленных на оставшиеся.

Как вариант. Не получал массив нужных элементов, а наоборот тех которые нужно удалить.
Затем прогнать справочник дисциплин, если нашел элемент с полученного массива, то пометить на удаление.
И в массив нужно записывать уникальный ваш код. они же у вас разные.

Electron

Цитата: spinnen.87 от 18 ноя 2015, 07:05
Раз новичок как и я, то легче воспользоваться помощью знающих. Заплатить за разработку обработки.
Если я правильно понимаю, то на дубли могут ссылаться другие объекты и нужно еще заменить ссылки в этих объектах с удаленных на оставшиеся.

Как вариант. Не получал массив нужных элементов, а наоборот тех которые нужно удалить.
Затем прогнать справочник дисциплин, если нашел элемент с полученного массива, то пометить на удаление.
И в массив нужно записывать уникальный ваш код. они же у вас разные.
Что, платить за домашнее задание? Оо Не диплом, ни зачёт, просто одно из многих домашних заданий)))
Насчёт ссылок не думаю, в любом случае пока что нужно только удалить дублирующиеся записи)
Сейчас подумаю над вашими словами)
Добавлено: 18 ноя 2015, 10:12


В общем покрутил предложенные выше варианты, но ничего не смог сделать...(
Добавлено: 18 ноя 2015, 12:18


Может вообще всё это можно реализовать один небольшим запросом? Имеется справочник Дисциплины с двумя реквизитами: код и наименование, всё)

spinnen.87

Аааа... Раз домашнее задание, то конечно...
Добавлено: 18 ноя 2015, 21:19


Не знаю может и ошибка в коде. Я только постигаю азы, как и Вы.

но типа этого, если сохраните артиклы совпадающих элементов в массив

Выборка2 = Справочники.Дисциплины.Выбрать();

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

Для Каждого ЭлементМассива Из МассивДисцилинАртикул Цикл
Если  ЭлементМассива=СправочникДисциплин.артикул Тогда
СправочникДисциплин.ПометкаУдаления = Истина;
СправочникДисциплин.Записать();
КонецЕсли;

КонецЦикла;


Добавлено: 18 ноя 2015, 21:30


Опять же незнаю верно или нет

Выборка = Справочники.Дисциплины.Выбрать();

Пока Выборка.Следующий() Цикл
СправочникДисциплин=Выборка.ПолучитьОбъект();
Пока Выборка.Следующий()+1 Цикл
СправочникДисциплин2=Выборка.ПолучитьОбъект();
Если СправочникДисциплин.наименование=СправочникДисциплин2.наименование Тогда
СправочникДисциплин2.ПометкаУдаления = Истина;
СправочникДисциплин2.Записать();
                         Сообщить(СправочникДисциплин2.наименование+" Помечен на удаление.");
конецЕсли;
КонецЦикла;
КонецЦикла;


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск