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

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

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

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

cska-fanat-kz

Стандартная обработка по поиску и замене дублирующих вполне себе доступна для понимания даже для начинающего пользователя...

Или тут спортивный интерес обязательно самому спрограммить?
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

spinnen.87

cska-fanat-kz, тут не спортивный интерес. Тут домашнее задание, которое нужно самому написать)))

cska-fanat-kz

spinnen.87, аааа, тогда медвежья услуга намечается ;)
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Electron

Цитата: spinnen.87 от 18 ноя 2015, 19:42
Аааа... Раз домашнее задание, то конечно...
Ну а что такого? Даже если я ничего не сделаю - мне за это ничего не будет, зачёт и так получу) Максимум что получу - косой взгляд преподавателя и собственное неудовлетворение))) Чуть позже посмотрю твой код, спасибо)

Цитата: cska-fanat-kz от 19 ноя 2015, 08:03
Стандартная обработка по поиску и замене дублирующих вполне себе доступна для понимания даже для начинающего пользователя...

Или тут спортивный интерес обязательно самому спрограммить?
Стандартная слишком сложная, она ищет связи и т.п., и понять её для меня вообще не реально) Нужна же простенькая)
Добавлено: 19 ноя 2015, 11:42


spinnen.87, ничего из вашего кода не понял, единый код, или два разных, в одном не находит массив, во втором вечная загрузка программы, а после помечаются все дублирующиеся записи, в том числе и оригинал...(

Kironten

Поскольку вы так и не ответили, по какому критерию вы собираетесь отсеивать ненужные элементы при одинаковых названиях, можно сделать например так.
Берете всю выборку из номенклатуры.
а потом обрабатываете:
ПредыдущееНазвание = "ЧиверзднеркисмашкинбрундгальдмеркСЛимоном";
Пока Выборка.Следующий() Цикл
    Если Выборка.Номенклатура.Наименование = ПредыдущееНазвание Тогда
        ОбъектНоменклатуры = Выборка.Номенклатура.ПолучитьОбъект();
        ОбъектНоменклатуры.ПометкаУдаления = Истина;
        Попытка
            ОбъектНоменклатуры.Записать();
            Сообщить("Помечен на удаление элемент: " + Выборка.Номенклатура.Наименование);
            ПредыдущееНазвание = Выборка.Номенклатура.Наименование;
        Исключение
            Сообщить(ОписаниеОшибки());
        КонецПопытки;
    Иначе
        ПредыдущееНазвание = Выборка.Номенклатура.Наименование;
    КонецЕсли;
КонецЦикла

Electron

Цитата: Kironten от 19 ноя 2015, 11:44
Поскольку вы так и не ответили, по какому критерию вы собираетесь отсеивать ненужные элементы при одинаковых названиях, можно сделать например так.
А не важно, будет от двух до бесконечности идентичных дисциплин с одинаковым наименованием, но разным кодом, и не важно какая из них удалиться или останется)
Тока я не понял, что за предыдущее название? И что за Номенклатура.Наименование? У меня справочник Дисциплины же?

spinnen.87

Цитата: Electron от 19 ноя 2015, 11:01
spinnen.87, ничего из вашего кода не понял, единый код, или два разных, в одном не находит массив

Это два разных кода.
В первом случае я дописал твой код. Но выложил основное изменение. :( Нужно было весь код положить
Я добавил массив для артикула. В итоге было два массива в один Наименования сохранял, в другой Артикул (код) тех элементов которые нужно удалить.

А потом делал выборку из дисциплин и присваивал объект. Прогоняя циклом выборку сверял с артикулом в массиве, если совпали, то помечал объект на удаление.

А второй код как альтернативу первому попробовал работать сразу с объектами.
коды не проверял (((

cska-fanat-kz

Цитата: Electron от 19 ноя 2015, 11:01Стандартная слишком сложная, она ищет связи и т.п., и понять её для меня вообще не реально) Нужна же простенькая)

я не прочитал про домашнее задание поэтому предполагал обработку просто использовать, а не анализировать как она работает )

план следующий
1. получаем выборку наименований дисциплин с повторениями
2. по выборке из п.1 получаем выборку уже повторяющихся элементов справочника
3. обходим выборку из п.2
4. наименование первого повторяющегося элемента складываем в массив
5. второй (третий и т.д.) повторяющийся элемент: берем его наименование и смотрим в массив, если такой уже есть, то помечаем текущий элемент на удаление (или кладем во второй массив для непосредственного удаления)

я надеюсь проверять что на удаляемые элементы есть ссылки не надо?
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

spinnen.87

Вот весь код.
Только сделал для справочника Единицы Измерения, чтобы протестировать.
И еще поле Код должно быть уникальным, иначе может удалиться нужные данные )))
Ну или дописать обработку => Сохранить в массив Наименование и Код, а затем сравнивать перед удалением 2 этих параметра с данными объекта.


&НаКлиенте
Процедура Найти(Команда)
      НайтиИЗаменитьДублиПоНаименованию();

КонецПроцедуры

&НаСервере
Процедура НайтиИЗаменитьДублиПоНаименованию()

МассивЕдиницыИзмНаименование = Новый Массив;
МассивЕдиницыИзмКод = Новый Массив;
МассивЕдиницыИзмКодУдалить = Новый Массив;

    Выборка = Справочники.ЕдиницыИзмерения.Выбрать();

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

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

КонецПроцедуры




Добавлено: 20 ноя 2015, 06:12


Упустил одну строку, вот в этой части кода

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


После строки  МассивЕдиницыИзмКодУдалить.Добавить(МассивЕдиницыИзмКод[НовыйИндекс]);
нужно вставить еще МассивЕдиницыИзмКод.Удалить(НовыйИндекс);
Добавлено: 20 ноя 2015, 06:16


Для удаления без пометки можно написать так
СправочникЕдиницыИзм.Удалить();

Electron

Цитата: cska-fanat-kz от 19 ноя 2015, 13:59
я надеюсь проверять что на удаляемые элементы есть ссылки не надо?
Этого не нужно)

Цитата: spinnen.87 от 19 ноя 2015, 23:47
И еще поле Код должно быть уникальным, иначе может удалиться нужные данные )))
Ну код уникальный, да)
Сейчас попробую ваш код, спасибо!)
Добавлено: 20 ноя 2015, 12:29


С пометкой на удаление код работает!) А вот с прямым удалением ошибка :dfbbdrfb:

{МодульУправляемогоПриложения(45)}: Ошибка при вызове метода контекста (Удалить)
СправочникЕдиницыИзм.Удалить();
по причине:
Операция не может быть выполнена, так как данные объекта модифицированы!
Добавлено: 20 ноя 2015, 12:31


Точнее такая:

{МодульУправляемогоПриложения(52)}: Ошибка при вызове метода контекста (Записать)
СправочникЕдиницыИзм.Записать();
по причине:
Элемент не выбран!
Добавлено: 20 ноя 2015, 12:33


Кажется понял, нужно СправочникЕдиницыИзм.Удалить(); поставить после СправочникЕдиницыИзм.Записать();
            

Теги:

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

Рейтинг@Mail.ru

Поиск