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

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

Автор 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

Поиск