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

Контроль уникальности Артикула Номенклатуры в ТиС

Автор imok, 07 фев 2024, 12:08

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

imok

Платформа 7.70.027
Конфигурация 7.70.970
Господа. Подскажите как сделать проверку уникальности Артикула при записи новой номенклатуры в справочник.
Изначально в конфигурации нет контроля уникальности

alexandr_ll

imok, Уникальность можно соблюсти только при автоматическом присвоении артикула программой. Создать отдельный справочник "Артикулы", при запписи нового элемента справочника "Номенклатура" автоматически добавляется элемент в справочник "Артикулы" и его код присваевается в качестве реквизита "Артикул" номенклатуры.
Если делать просто проверку артикула на уникальность при записи номенклатуры, это будет выполняться очень медленно. Для этого сначала выгрузить все имеющиеся артикулы в список значений и при записи проверять на вхождение нового артикула в этот список.

Иван_Василич

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

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

Вот эту процедуру добавить перед процедурой ПриЗаписи.

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

alexandr_ll

Иван_Василич, Ваш код будет работать, но на больших справочниках, (порядка десятков тысяч наименований) запись элемента справочника будет занимать несколько минут.

Иван_Василич

alexandr_ll, у меня порядка 22 тыс., пока устраивает.

imok


Теги:

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

Рейтинг@Mail.ru

Поиск