Имя: Пароль:
1C
 
Проверка уникальности артикула в справочнике номенклатура
0 MitTri4
 
16.05.07
14:05
Задача: при создании новой номенклатуры проверять артикул на уникальность.
Делаю это так: в модуле объекта номенклатура в процедуре ПередЗапись()
вставляю в конец

Запрос = Новый Запрос;
   Запрос.УстановитьПараметр("Артикул11", Артикул);
   Запрос.Текст =
   "ВЫБРАТЬ
   |    Справочник.Номенклатура.Артикул КАК Артикул1
   |ИЗ
   |    Справочник.Номенклатура
   |ГДЕ
   |    Справочник.Номенклатура.Артикул = &Артикул11";
   
   Результат = Запрос.Выполнить();
   Выборка = Результат.Выбрать();
   
   Если НЕ Результат.Пустой() Тогда
       Сообщить("Артикул не уникален!");
       Сообщить(Артикул);
       Пока Выборка.Следующий() Цикл
           Сообщить("Артикул в таблице " + Выборка.Артикул1);
       КонецЦикла;
       Отказ = Истина;
   КонецЕсли;

Открываю 1С (УТ), завожу новую номенклатуру с уникальным артикулом фывафывафыва, получаю

Артикул не уникален!
фывафывафыва
Артикул в таблице фывафывафыва
1 ТелепатБот
 
гуру
16.05.07
14:05
2 Бубузяка
 
16.05.07
14:09
1. Вероятно, что артикул действительно неуникален. Пустая строка - это тоже значение.
2. В запросе проверяй Справочник.Номенклатура.Ссылка <> Ссылка, а то после записи сам сабе на артикул наступать будешь ;)
3 MitTri4
 
16.05.07
14:13
(2)2. - понятно, код, который кинул только для процедуры добавления.
1. - артикул точно уникален, артикула фывафывафыва, который я ввожу, в спавочнике точно нет), но есть пару пустых.
4 Wladimir_spb
 
16.05.07
14:14
Выведи номенклатуру из запроса, все станет понятно :)
5 MitTri4
 
16.05.07
14:19
Ну и товар собственно он выводит тот, который я добавляю. В чем ошибка?
6 Defender aka LINN
 
16.05.07
14:21
(5) Не исключаешь из запроса текущий товар.
7 MitTri4
 
16.05.07
14:26
(6)Так как же он может находится в справочнике, если я его еще не добавил?
8 чувак
 
16.05.07
14:27
Сожешь показат код ПрередЗаписью()?
9 Heckfy
 
16.05.07
14:28
(7) Лови. Переделай под себя:
Процедура ПередЗаписью(Отказ)
   Запрос = Новый Запрос;
   Запрос.Текст="ВЫБРАТЬ
   |    ТестовыйСправочник.Код,
   |    ТестовыйСправочник.Наименование,
   |    ТестовыйСправочник.Реквизит1
   |ИЗ
   |    Справочник.ТестовыйСправочник КАК ТестовыйСправочник
   |ГДЕ
   |    ТестовыйСправочник.Реквизит1 = &Реквизит1
   |
   |СГРУППИРОВАТЬ ПО
   |    ТестовыйСправочник.Код,
   |    ТестовыйСправочник.Наименование,
   |    ТестовыйСправочник.Реквизит1"
   ;
   Запрос.УстановитьПараметр("Реквизит1",Реквизит1);
   Результат=Запрос.Выполнить().Выбрать();
   Пока Результат.Следующий() Цикл
       Если Результат.Код=Код Тогда
           Продолжить;
       Иначе
           Предупреждение("Такой уже есть. Код существующего: "+Результат.Код+" наименование существующего: "+Результат.Наименование);
           Отказ=Истина;
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры

ЗЫ: В данном случае, проверка по Реквизит1
10 MitTri4
 
16.05.07
14:30
(8)Процедура ПередЗаписью(Отказ)

   Если НЕ ОбменДанными.Загрузка И НЕ ЭтоГруппа Тогда
       
       Если Не Услуга И ЗначениеНеЗаполнено(БазоваяЕдиницаИзмерения) Тогда
           СообщитьПользователюНезаполненРеквизит(Ссылка, "базовая единица");
           Отказ = Истина;
       Иначе
           // Надо проверить владельца единицы хранения остатков
           Если Не ЗначениеНеЗаполнено(ЕдиницаХраненияОстатков)
              И ЕдиницаХраненияОстатков.Владелец <> Ссылка Тогда
               ТекстСообщения = "У единицы хранения остатков номенклатуры """ + СокрЛП(Ссылка) + """ неверно указан владелец!";
               СообщитьОбОшибке(ТекстСообщения, Отказ);
           КонецЕсли;
       КонецЕсли;

       Если ЗначениеНеЗаполнено(ЕдиницаДляОтчетов) Тогда
           ЕдиницаДляОтчетов = ЕдиницаХраненияОстатков;
       КонецЕсли;

       // Надо проверить владельца единицы для отчетов
       Если Не ЗначениеНеЗаполнено(ЕдиницаДляОтчетов)
          И ЕдиницаДляОтчетов.Владелец <> Ссылка Тогда
           ТекстСообщения = "У единицы для отчетов номенклатуры """ + СокрЛП(Ссылка) + """ неверно указан владелец!";
           СообщитьОбОшибке(ТекстСообщения, Отказ);
       КонецЕсли;

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

       Если Услуга <> Ссылка.Услуга
          И СуществуютСсылки(СуществуютСсылки)Тогда
           ТекстСообщения = "Номенклатура """ + СокрЛП(Ссылка) + """ участвует в товародвижении.
           |Признак услуги не может быть изменен!";
           СообщитьОбОшибке(ТекстСообщения, Отказ);
       КонецЕсли;

       Если Не ВестиУчетПоСериям И Ссылка.ВестиУчетПоСериям И СуществуютСсылкиНаСерииВРегистрахНакопления() Тогда
           ТекстСообщения = "Номенклатура """ + СокрЛП(Ссылка) + """ участвует в товародвижении.
           |признак учета по сериям не может быт изменен!";
           СообщитьОбОшибке(ТекстСообщения, Отказ);
       КонецЕсли;
   КонецЕсли;
   
   Запрос = Новый Запрос;
   Запрос.УстановитьПараметр("Артикул11", Артикул);
   Запрос.Текст =
   "ВЫБРАТЬ
   |   Справочник.Номенклатура.Артикул КАК Артикул1,
   |    Справочник.Номенклатура.Наименование КАК Наименование
   |ИЗ
   |    Справочник.Номенклатура
   |ГДЕ
   |    Справочник.Номенклатура.Артикул = &Артикул11";
   
   Результат = Запрос.Выполнить();
   Выборка = Результат.Выбрать();
   
   Если НЕ Результат.Пустой() Тогда
       Сообщить("Артикул не уникален!");
       Сообщить(Артикул);
       Пока Выборка.Следующий() Цикл
           Сообщить("Артикул в таблице " + Выборка.Артикул1);
           Сообщить("Товар в таблице" + Выборка.Наименование);
       КонецЦикла;
       Отказ = Истина;
   КонецЕсли;

КонецПроцедуры // ПередЗаписью()
11 Wladimir_spb
 
16.05.07
14:32
(9)Не прокатит :)
Нужно исключать текущий элемент даже перед записью. Ведь могли редактировать существующй элемент.
12 Heckfy
 
16.05.07
14:36
(11) А ты попробуй :) А потом результаты в студию :)
13 Wladimir_spb
 
16.05.07
14:40
(12)Влом. Итак видно.
ЗЫ
Прежде чем ручками работать, лучше думать головой.
14 Heckfy
 
16.05.07
14:43
(13) Нет, парень, ты не прав. Посмотри внимательнее код. Это о чем нибудь говорит:
   Пока Результат.Следующий() Цикл
       Если Результат.Код=Код Тогда
           Продолжить;
       Иначе
           Предупреждение("Такой уже есть. Код существующего: "+Результат.Код+" наименование существующего: "+Результат.Наименование);
           Отказ=Истина;
       КонецЕсли;
   КонецЦикла;

ЗЫ: Код реально рабочий. Больше спорить не хочу. :)
15 Wladimir_spb
 
16.05.07
14:46
(14)Мистец :), можно было вообще всё через выборку прошерстить. Слабо условие в запросе сделать?
16 simol
 
16.05.07
14:46
У меня работает такое
       Запрос = Новый Запрос;
       ТекстЗапроса = "ВЫБРАТЬ
                      |    Номенклатура.Наименование,
                      |    Номенклатура.Код
                      |ИЗ
                      |    Справочник.Номенклатура КАК Номенклатура
                      |ГДЕ
                      |    Номенклатура.Наименование = &Наименование
                      |    И Номенклатура.Код <> &Код";
       Запрос.Текст = ТекстЗапроса;
       Запрос.УстановитьПараметр("Наименование",Наименование);
       Запрос.УстановитьПараметр("Код",Код);
       РезультатЗапроса = Запрос.Выполнить();
       Если Не РезультатЗапроса.Пустой() Тогда
           Если  Не РольДоступна("ПолныеПрава") Тогда
               Отказ = Истина;
           КонецЕсли;
           Предупреждение("Номенклатура или группа с таким наименованием существует.");    
       КонецЕсли;
17 MitTri4
 
16.05.07
14:48
(16)Да уже сделал аналогично)
18 MitTri4
 
16.05.07
14:49
Еще рабочая идея была у (2).2, но дольше так
19 Heckfy
 
16.05.07
14:52
(15) Не слабо. Вот проблемы со скоростью записи начнутся, тогда и через условие сделаю.
ЗЫ: Только начинал ты совсем не с этого, а (11) :)))
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.