![]() |
![]() |
![]() |
|
Проверка уникальности артикула в справочнике номенклатура | ☑ | ||
---|---|---|---|---|
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) :))) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |