Вход | Регистрация
 

Поиск и замена значений - умеют ли такое самые продвинутые заменялки?

Поиск и замена значений - умеют ли такое самые продвинутые заменялки?
Я
   Гений 1С
 
06.08.20 - 21:30
Заменял дубли характеристик (по одинаковому владельцу) обработкой по замене дублей "ПоискИЗаменаДублирующихсяЭлементов_8.3 УФ от Тесла.epf" в Рознице 2.3.
Короче, что обнаружил - некоторые дубли не удаляются, т.к. нельзя записать одинаковые записи в регистр "Цены номенклатуры" и "Себестоимость".
Добавил вот такую затычку:

                    //Осипов 2020-08-06 корректировка
                    Если НаборЗаписей.Метаданные().Измерения.Найти("Номенклатура") <> Неопределено И
                        НаборЗаписей.Метаданные().Измерения.Найти("Характеристика") <> Неопределено
                    Тогда
                        //Удаляем дубли записей
                        Соо = Новый Соответствие();
                        КУдалению = Новый Массив();
                        Для Каждого МЗ ИЗ НаборЗаписей Цикл
                            КлючЗаписи = "" + МЗ.Номенклатура.УникальныйИдентификатор() + МЗ.Характеристика.УникальныйИдентификатор();
                            Если Соо[КлючЗаписи] <> Неопределено Тогда
                                КУдалению.Добавить(МЗ);
                            КонецЕсли;
                            Соо.Вставить(КлючЗаписи, истина);
                        КонецЦикла;
                        //Безжалостно удаляем дубли в регистрах сведений
                        Для Каждого МЗ ИЗ КУдалению Цикл
                            НаборЗаписей.Удалить(МЗ);
                        КонецЦикла;
                        
                    КонецЕсли;

Интересно, а мужики с таким сталкивались? И как решали?
   Злопчинский
 
1 - 06.08.20 - 21:33
(0) учесть что
было
Товар1 123руб
Товар2 128руб

станет
Товар1 ??? руб
   kofeinik
 
2 - 06.08.20 - 22:52
(1) Проще потом перезанести новые цены, поскольку дубли, как правило, старое и ненужное, так что пусть лучше так, чем никак.
   acht
 
3 - 06.08.20 - 23:49
(0) > а мужики

А мужики с таким сталкивались. И сказали - ковыряйтесь вы сами с прикладными данными, которые в БП значат одно, а в ЗУП (особенно в перерасчете) - другое. Мужики данные не портят, а откуда в ЗУП "Номенклатура" им неведомо.

Физик? Ландау? Ебись.
   TormozIT
 
4 - 07.08.20 - 00:16
ЕСть их у нас и причем уже давно http://devtool1c.ucoz.ru/index/poisk_dublej_i_zamena_ssylok/0-23
        ИначеЕсли ТипТаблицы = "РегистрСведений" И ОбъектМД.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору Тогда
            // Избавимся от неуникальных строк набора

            Если СтруктураНабораЗаписей.Данные.Количество() > 1 Тогда
                СтруктураКлюча = ирОбщий.СтруктураКлючаТаблицыБДЛкс(ИмяТаблицыРегистра,,, Ложь);
                СтрокаПолейКлюча = "";
                Для Каждого КлючИЗначение Из СтруктураКлюча Цикл
                    СтрокаПолейКлюча = СтрокаПолейКлюча + "," + КлючИЗначение.Ключ;
                КонецЦикла;
                СтрокаПолейКлюча = Сред(СтрокаПолейКлюча, 2);
                НеуникальныеКлючи = ирОбщий.НеуникальныеКлючиТаблицыЛкс(СтруктураНабораЗаписей.Данные, СтрокаПолейКлюча);
                Если НеуникальныеКлючи.Количество() > 0 Тогда
                    ТаблицаНабора = СтруктураНабораЗаписей.Методы.Выгрузить();
                    Для Каждого НеуникальныйКлюч Из НеуникальныеКлючи Цикл
                        СтрокиНеуникальногоКлюча = ТаблицаНабора.НайтиСтроки(НеуникальныйКлюч);
                        Для ИндексУдаляемойСтроки = 0 По СтрокиНеуникальногоКлюча.Количество() - 2 Цикл
                            ТаблицаНабора.Удалить(СтрокиНеуникальногоКлюча[ИндексУдаляемойСтроки]);
                        КонецЦикла;
                        ПредставлениеСтруктуры = ирОбщий.ПолучитьПредставлениеСтруктурыЛкс(НеуникальныйКлюч);
                        ирОбщий.СообщитьЛкс("Замещены неуникальные строки регистра сведений " + ОбъектМД.Имя + " по ключу " + ПредставлениеСтруктуры);
                    КонецЦикла;
                    СтруктураНабораЗаписей.Методы.Загрузить(ТаблицаНабора);
                КонецЕсли; 
            КонецЕсли;
   TormozIT
 
5 - 07.08.20 - 00:22
(4)+ Правда это не спасает от аналогичной ошибки при перепроведении документа, в котором соответствующая ТЧ тоже получила дубли по ключу. А в ТЧ универсально понять нужно ли сворачивать строки и по какому ключу - невозможно в общем случае.
   acht
 
6 - 07.08.20 - 00:26
(4) > СообщитьЛкс("Замещены неуникальные строки регистра сведений

А вот это опасно, дядь Сереж.
Типовые обработки (особенно при немонопольном использовании) позволяют повторный запуск без порчи данных. Какую-то часть дублей убрали, какую-то не смогли. А твой код берет на себя ответственность о решении - дескать, там что-то было, я сделаль, теперь сами разбирайтесь (если чо, то из бэкапа восстановите). Учитывая общий уровень "разработчиков" - не надо так.
   TormozIT
 
7 - 07.08.20 - 00:41
(6) Уже много лет этот код работает и сам его использовал много раз. С чего ты взял что у меня не работает повторный запуск? Пока я не понял о какой проблеме ты пишешь. Да, моя актуальная реализация для регистров сведений оставляет из группы конфликтующих первую одну строку. Когда то давно я предоставлял выбор пользователю для каждой группы конфликтующих записей оставить одну. Но реальность такова, что ковыряться с этим пользователи в 99% не хотят и потому это лишняя головная боль и сложности для неинтерактивного выполнения. И вот уже много лет такой молчаливый и более простой подход работает и все довольны.
   TormozIT
 
8 - 07.08.20 - 00:44
Т.е. на начальном этапе развития инструмента я сделал максимально контролируемое разрешение таких конфликтов, но меня регулярно просили принести строгость в жертву практичности (частотным сценариям). После многочисленных обсуждений с пользователями, сначала я сделал старый полуручной режим опцией, а потом и вообще отключил.
   Конструктор1С
 
9 - 07.08.20 - 04:56
(0) ты всегда такой кривой код пишешь?
   Гений 1С
 
10 - 07.08.20 - 08:03
(2) А ты в теме, молодец. ;-)
(9) нет, только когда за деньги.
   Бурза
 
11 - 07.08.20 - 08:16
(9) Да ладно, бывает намного хуже, это вполне сойдёт для сельской местности.
   Гений 1С
 
12 - 07.08.20 - 09:16
(11) гггг.
   Сияющий в темноте
 
13 - 07.08.20 - 09:39
На самом деле,пока искуственный интеллект не появитмя,все сложные ситуации будет разбирать пользователь.
в случае с ценой,можно посмотреть,какое значение было установлено ранее,даже не по последней записи,а по последнему изменению,но,может оказаться,что товары-то реально разные и пришли одновременно,например,из-за разницы партий поставщика они были у него в накладной с разными ценами.
поэтому,научить машину всему,что может быть,тут никакого бюджета не хватит.

в стандартной же обоаботке,предполагается,что пользователь саи залезет в регистр и там уничтожит дубль,то есть полуручной режии.
   Конструктор1С
 
14 - 07.08.20 - 09:40
(11) согласен
   DJ Anthon
 
15 - 07.08.20 - 09:49
Так же делал по регистру сведений. Остальные регистры пересчитываются потом, можно и удалять всю кривоту. Плюсом добавил возможность удаления связанных объектов, которые подобны выбранному. Например, если у номенклатуры помечен на удаление вид номенклатуры, чтобы долго не искать, нажимаем одну кнопку, и все номенклатуры, у которых этот же вид номенклатуры, помечаются на удаление. но это в обработке удаления, а не поиска. в поиске и замене я добавил функцию поиска вообще всех дублей, а так же полный игнор всех ошибок для особых случаев. такое бывает после кривого объединения двух и более баз.
   DJ Anthon
 
16 - 07.08.20 - 09:51
поставил на ночь объединение, и наутро 99 процентов обработано, остальное ручками. чем раз в пять минут спотыкаться на каком-нибудь тупом регистре.
   Гений 1С
 
17 - 07.08.20 - 11:22
Чтобы дважды не вставать, задам еще один вопрос.
Обычная замена идет по ссылающимся объекам и заменяет там дубли.
Оптимизированный вариант составляет реест объектов на замену и заменяет исходя из ссылающегося объекта.
т.е. в одном объекте может быть несколько замен.

Вы такое дорабатывали? Я лично как-то делал разок.

Серега, а твоя замена так работает или тупо по-простому?
   TormozIT
 
18 - 07.08.20 - 12:07
(17) Конечно у меня работает оптимально - запись каждого ссылающегося объекта выполняется только один раз.
   DJ Anthon
 
19 - 07.08.20 - 12:09
не делал, не было необходимости
   Гений 1С
 
20 - 10.08.20 - 08:50
(18) это хорошо, а то медленно работает.
Единственное плохо в твоей разработке - сложная курва поставки так сказать.
Кстати, у тебя до сих пор конфа или уже переведено на расширение?
   TormozIT
 
21 - 10.08.20 - 09:08
(20) 4 года назад появился вариант поставки "Расширение". Теперь он является основным. http://devtool1c.ucoz.ru/index/rasshirenie_variant/0-52
Есть очень простой способ установки:
1. Открываешь внешнюю обработку "Установщик варианта Расширение" http://devtool1c.ucoz.ru/load/osnovnye/ustanovshhik_varianta_rasshirenie/1-1-0-21
2. Нажимаешь "Установить" https://i.imgur.com/cXPMCjF.png
   Вафель
 
22 - 10.08.20 - 09:23
(1) по идее должна остаться запись с изначально верной номенклатурой
   TormozIT
 
23 - 10.08.20 - 09:31
(22) В моем опыте решения таких задач было предостаточно случаев, когда верная ссылка имела неверные данные в объекте, не говоря уже про связанные строки в регистрах, где в каждом регистре может быть своя правильность для каждой группы дублей.
   Гений 1С
 
24 - 10.08.20 - 10:59
(21) ну что ж, отлично. Расширение - это хорошо.
   Злопчинский
 
25 - 10.08.20 - 13:38
(23) Вот именно.
с моего мелкого опыта д.б. предприняты все возможные технические ухищрения для исходного недопущения возникновения дублей. все - отальное - это как лечить  кашель при гангрене.
   Гений 1С
 
26 - 10.08.20 - 14:13
(25) ты живешь в идеальном мире. Это неплохо. Но иногда к нам, докторам 1С, приходят пациенты с просьбой замены дублей. И мы замеяем. Хотя знаем, что эта женщина потом опять придет на аборт. ;-)
   Гений 1С
 
27 - 20.08.20 - 12:43
Каюсь, в моей обработке был косяк, она заменила и в регистрах накопления, так что правильный код такой:

                    //Осипов 2020-08-06 корректировка

                    //Только для регистров сведений, регистры накопления не трогаем

                    Если 
                        Метаданные.РегистрыСведений.Содержит(НаборЗаписей.Метаданные()) И
                        НаборЗаписей.Метаданные().Измерения.Найти("Номенклатура") <> Неопределено И
                        НаборЗаписей.Метаданные().Измерения.Найти("Характеристика") <> Неопределено
                    Тогда
                        //Удаляем дубли записей

                        Соо = Новый Соответствие();
                        КУдалению = Новый Массив();
                        Для Каждого МЗ ИЗ НаборЗаписей Цикл
                            КлючЗаписи = "" + МЗ.Номенклатура.УникальныйИдентификатор() + МЗ.Характеристика.УникальныйИдентификатор();
                            Если Соо[КлючЗаписи] <> Неопределено Тогда
                                КУдалению.Добавить(МЗ);
                            КонецЕсли;
                            Соо.Вставить(КлючЗаписи, истина);
                        КонецЦикла;
                        //Безжалостно удаляем дубли в регистрах сведений

                        Для Каждого МЗ ИЗ КУдалению Цикл
                            НаборЗаписей.Удалить(МЗ);
                        КонецЦикла;
                        
                    КонецЕсли;
   Конструктор1С
 
28 - 21.08.20 - 09:28
(27) я бы на твоём месте такой костылище говнокодный даже не выкладывал. Там ещё дофига косяков. На вскидку, чего ты тут наговнокодил:
- мусорные комментарии
- невнятные имена переменных
- 10 табуляций от края как бы намекают, что это действие происходит где-то в говнопроцедуре на тыщу строк. Т.е. декомпозиции никакой
- привязка в универсальном инструменте к конкретной бизнес-логике (номенклатура, характеристика)
- обращение к метаданным миллион раз, хотя это можно было сделать ещё на верхнем уровне декомпозиции (которой у тебя и нет)
- проверка только двух измерений без малейшей попытки проверить остальные измерения (привет непонятным ошибкам)


Это какой-то звиздец-звиздецкий. Ты чем 20 лет занимался, что твой код на уровне рукожопого стажера?
   Гений 1С
 
29 - 31.08.20 - 13:35
(28) О, Гуру, у тебя какое место на инфостарте?
   zak555
 
30 - 31.08.20 - 13:57
(0) используй ИР
 
 Рекламное место пустует
   Конструктор1С
 
31 - 02.09.20 - 05:20
(29) никакого. Меня там нет


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.