Найти похожий артикул при записи нового элемента справочника Номенклатура

1. Иваныч 23 22.11.24 10:56 Сейчас в теме
Всех приветствую! В целях страховки от дублирования элементов справочника со стороны пользователей задался целью сделать проверку на уникальность поля Артикул. Написал функцию для справочника Номенклатура:

Функция ПохожийАртикул()
ВыборкаКода = СоздатьОбъект("Справочник.Номенклатура");
ВыборкаКода.ВыбратьЭлементы();

Пока ВыборкаКода.ПолучитьЭлемент() = 1 Цикл
Если ВыборкаКода.Артикул <> Артикул Тогда
Продолжить;
КонецЕсли;
Если Выбран() = 0 Тогда
Возврат ВыборкаКода.ТекущийЭлемент();
Иначе
Если ТекущийЭлемент() <> ВыборкаКода.ТекущийЭлемент() Тогда
Возврат ВыборкаКода.ТекущийЭлемент();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат "";
КонецФункции // ПохожийАртикул()

А в процедуру ПриЗаписи добавил следующий код:
// Проверим, есть ли такой артикул в остальной номенклатуре
Дубль = ПохожийАртикул();
Если ПустоеЗначение(Дубль) = 0 Тогда
Предупреждение("В справочнике номенклатуры" + "
|" + Дубль + "
|" + "уже есть такой артикул:" + "
|" + Артикул + " " + ?(Дубль.ПометкаУдаления() = 1," (помечена на удаление).","."), 60);
Активизировать("Артикул");
СтатусВозврата(1);
КонецЕсли;

Есть одна проблема: Если записать значение в виде, например, GIP06045 то если есть уже элемент с таким значением поля - появится сообщение, что уже есть номенклатура с таким артикулом, и уже ясно, что ошибся.
А если записать новый элемент номенклатуры, но в виде GIP.06045 или GIP 06045 или GIP-060.45, т.е с любым разделителем, сообщения нет, т.к значения элемента справочника будут разные. А по-сути - это один и тот-же товар: Лампа 12V 10W Ganz. На сайтах интернет-магазинов все эти разделители автоматом убираются при вводе значения в окне поиска товара. Прошу совета как правильно в процедуре сделать проверку.
По теме из базы знаний
Найденные решения
10. user2107191 22.11.24 12:06 Сейчас в теме
(6)
При выгрузке на сайт уже там автоматом все разделители убираются.
Бери пример с сайта.
П.С. да и мне уже под 50
А мне за, и что?
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 80 22.11.24 11:19 Сейчас в теме
(1) убирать разделители из введенного значения перед проверкой/записью в ИБ?
4. Иваныч 23 22.11.24 11:46 Сейчас в теме
(2) Это самый простой способ, но хорош когда один чел. ведет базу, там все четко и отработано до мелочей. А когда куча пользователей - потом кто-то ответственный все косяки править должен
8. nomad_irk 80 22.11.24 12:01 Сейчас в теме
(4) так исправляйте косяки автоматически, вам же никто/ничто не мешает хранить значения с разделителем и без и использовать нужное в разных ситуациях
CheBurator; Иваныч; +2 Ответить
9. Иваныч 23 22.11.24 12:05 Сейчас в теме
3. user2107191 22.11.24 11:43 Сейчас в теме
(1)
т.к значения элемента справочника будут разные. А по-сути - это один и тот-же товар
А система об этом в курсе? Что ты там сам себе в уме держишь...
user1931226; +1 Ответить
6. Иваныч 23 22.11.24 11:49 Сейчас в теме
(3) Конечно же нет, как она будет в курсе? При выгрузке на сайт уже там автоматом все разделители убираются. Вот и ищу как правильно сделать. Для себя же стараюсь. Многие задумки за 22 года постепенно воплотились в жизнь.
П.С. да и мне уже под 50
10. user2107191 22.11.24 12:06 Сейчас в теме
(6)
При выгрузке на сайт уже там автоматом все разделители убираются.
Бери пример с сайта.
П.С. да и мне уже под 50
А мне за, и что?
11. Иваныч 23 22.11.24 17:19 Сейчас в теме
(10) Подсказал мне человек, пока сделали проверку на точку, тире, пробел. Останется на заглавные/строчные буквы
13. CheBurator 2695 23.11.24 14:09 Сейчас в теме
(11) Ели сопоставление идет на совпадение\несовпадение строк - то да, надо учитывать регистр.
Если используется ВыбратьЭлементыПоРеквизиту или НайтиПоРеквизиту или иные методы, работающие с ИНДЕКСОМ (на реквизите должна стоять галочка "Сортировка"), то индекс - регистронезависимый и "чтото" и "ЧТОТО и "ЧтоТо" будут в терминах индекса СОВПАДАЮЩИМИ.
5. MissionOnly 8 22.11.24 11:47 Сейчас в теме
(1) всегда вводят доп. поле "АртикулБезРазделителей" (индексируемое), и по этому полю выполняют поиск.
CheBurator; user1863362; Иваныч; +3 Ответить
7. Иваныч 23 22.11.24 11:50 Сейчас в теме
(5) Вот за намек куда копать отдельное спасибо. Заранее плюсану
12. CheBurator 2695 23.11.24 14:04 Сейчас в теме
Вариант (5) - голосую за него, но при этом надо понимать что для редуцированного АртикулБезРазделителей уникальность может быть нарушена.
Артикулы: А-Б и А.Б (для РАЗНЫХ товаров - а в общем случае такое может быть) дадут один и тот же "уникальный" АБ и автоматизированная проверка\контроль\итд станут невозможными. Если такой траблы в базе не будет, то АртикулБезРазделителя должен корректно заполняться ВО ВСЕХ МЕСТАХ где возможно создание\загрузка элемента номенклатуры и для параноид-контроля неплохо регулярно запускать обработку, которая будет полностью переопределять АртикулБезРазделителя по всему справочнику номенклатуры и выявлять (на всякий случай) траблы типа описанного выше "АБ".
Если исходить из того, что АртикулБезРазделителя заполняется корректно и удовлетворяет условию уникальности, то при вводе\записи "нового" артикула не надо перебирать весь справочник номенклатуры, которого под несколько сот тысяч элементов может быть (у меня клиент дисками торговал, спр.номенклатура ~170тыс), а достаточно сделать типа

НовыйАртикул = глНормализоватьСтроку(АртикулВведенРучками,СписокРазделителей,СимволНормализатор);
СпрН.ВыбратьЭлементыПоРеквизиту("АртикулБезРазделителя",НовыйАртикул);

и выборка будет в самом худшем случае 1 или несколько элементов
14. CheBurator 2695 23.11.24 14:39 Сейчас в теме
PS: в 2021 делал проект по автоматизации склада (фитинги всякие, сантехника, куча мелочевки всякой). ШК в базе отсутсвуют. "Товароведы" понарожали артикулов со спецсимволами, СМЕСЬЮ РУССКИХ И АНГЛИЙСКИХ БУКВ (типа R-01\786-56-Ж-NV-ЩЫ1), этими артикулами промаркированы короба. Время как всегда ужато до безобразия, входящий инвент с одновременной регистрацией штрихкодов штук\коробов, вводить показанные выше артикулы на ТСД - адский ад, инвент надо делать быстро (ну как всегда). Применил вариант, аналогичный (5): по базе были сгенерены "параллельные" артикулы, содержащие ТОЛЬКОЦИФРЫ (потому что даже латинские букавки на ТСД набирать - это тоже адски тормозно), Артикул R-01\786-56-Ж-NV-ЩЫ1 превращался в 01786561 (понятно, что редуцированный цифровой артикул был неуникальным и для разных товаров получался одинаковым) и процесс выглядел так, что персонал вводил цифровой артикул, система вываливала список номенклатуры "подходящей" под такой артикул и ручками (кнопками курсора или цифровой клавишей, соответствующей номеру в пронумерованнном списке от 0 до 9) выбирали нужную номенклатуру, получалось быстро, потому как в большинстве случаев список "подходящих" был небольшой, умещался на одном экране ТСД. Да, были цифровые артикулы по типу 123, на которые список "подходящих" был большим весьма, но таких было не так чтобы повально много, плюс мелкие ухищрения (типа в список похожих не показывать те, что уже прошли валидацию штрихкода, есть ШК уже на штуки\коробки) позволяли в процессе инвента\верификации такие массивы постепенно уменьшать.
user2107191; +1 Ответить
15. CheBurator 2695 23.11.24 14:41 Сейчас в теме
Так что: не надо артикулы товаров делать с буквами\спецсимволами. Используйте только цифровую кодировку артикулов.
.
ИБО!
16. Иваныч 23 25.11.24 10:28 Сейчас в теме
(12)
(15) Че, я понял вашу позицию, но... англо-цифровой артикул - я его не могу изменить, т.к запчасти в таком формате. В подборе если я напишу VF1842, к примеру, определится значение номенклатуры. Но такая же деталь может быть у другого производителя, но совершенно иная. 1С заикнется, что есть такой уже артикул в базе и предложит выбор. А разделители, как тире, точка, пробел - скорее всего для удобства пользователю, т.к. при большой длине его значения есть вероятность ошибиться. И вопрос-то был как проверить приЗаписи что артикул VF1842 и VF.1842 - это одно и то же, дабы не плодить номенклатуру дублями. Но, все в пятницу и решилось. Теперь вопрос пока не решен: строчные и прописные буквы - это одно и то же в значении артикула. Буду думать. Если что дельное есть подсказать - прошу дать направление.
17. CheBurator 2695 25.11.24 22:26 Сейчас в теме
(16) Так я ж не заставляю менять в том, где нет возможности менять.
Сделайте реквизит типа "АртикулДля" (сортировка=да) и во всех местах где производится запись элемента номенклатуры пишите в него нормализованный (без спецсимволов, разделителй итд) артикул, итого у вас в картчоке номенклатуры будет ДВА АРТИКУЛА (один стандратный Артикул, куда вводят всякую хрень ручками и второй АртикулДля (видимый на форме, но недоступный для редактирования), куда записывается очищенный от ненужного "мусора" Артикул. И когда пользователь где-то вводит артикул ручками - введенный артикул точно также "нормализуйте"/очищайте от ненужного мусора и ищите существующие совпадения по АРТИКУЛДЛЯ, используя СпрН.ВыбратьЭлементуПоРеквизиту("АртикулДля",ЗначениеАртикулДляОчищенноеОтМустора,...)
Иваныч; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот