Имя: Пароль:
1C
1C 7.7
v7: запрет на создание одинаковых элементов справочника
0 СовсемЗеленый
 
29.08.11
01:38
Как сделать чтобы при создании нового элемента справочника, производилась проверка на уникальность наименования?
1 Sereja
 
29.08.11
01:39
(0) Смотри процедуру ПриЗаписи()
2 Cthulhu
 
29.08.11
01:41
ох, замордуют тебя одинаково выглядящими буквами различных языковых алфавитов.
3 СовсемЗеленый
 
29.08.11
01:59
что призаписи я понял, но как указать что с чем сравнивать?((((
4 Никола_
Питерский
 
29.08.11
02:07
(3) зачет !!!
5 Sereja
 
29.08.11
02:17
(0) Ну судя по (0) делай запрос по справочнику, отбирай все элементы с твоим наименованием. Если Запрос вернет тебе больше чем одну запись, следовательно такое наименование уже есть
6 Anarki
 
29.08.11
02:28
(0)Почему больше чем одну запись? По идее хотя бы одну. Создаваемый элемент то еще не записан.
7 Sereja
 
29.08.11
02:32
(6) А если уже записан ? то при перезаписи ссылка на самого себя точно будет. Короче в условии нужнно вставлять неравенство на ТекущийЭлемент()
8 Anarki
 
29.08.11
02:33
А вообще если справочник не сильно большой то.
Спр = СоздатьОбъект("Справочник.Контрагенты");
Спр.ВыбратьЭлементы()
Пока Спр.ПолучитьЭлемент() = 1 Цикл
   СпрТек = Спр.ТекущийЭлемент();
   Если СпрТек.Наименование = Наименование Тогда
       Сообщить("!!!",!);
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;
КонецЦикла

Типо того.
9 Anarki
 
29.08.11
02:36
(8)Оу, куйню написал)) Спр.НайтиПоНаименованию(Наименование) легче.
10 Cthulhu
 
29.08.11
02:37
(8): уже записанный - при записи сам себя найдет, ругнется - и алё.
11 Sereja
 
29.08.11
02:38
(9) Делайте запросом и все у вас  будет хорошо
12 Cthulhu
 
29.08.11
02:40
(11): тогда уж прямым, с LIKE
13 СовсемЗеленый
 
29.08.11
15:05
(8) примерно так же сначала и написал, ругалосё.

(11) попробую сделать прямым запросом
14 chief accountant
 
29.08.11
15:30
(13) прямой запрос-то зачем?
15 ParaWiz
 
29.08.11
15:40
плохо другое, не панацея это, по одной конторе помню
можно придумать вариантов 20 разных как назвать "водка беленькая" даже если жестко административными мерами приказом как должна наименоваться номенклатура
16 СовсемЗеленый
 
29.08.11
21:38
(14) почему бы и нет )))
(15) та
17 Sk0rp
 
29.08.11
22:15
(15) StrMatch
18 Aleksey
 
29.08.11
22:18
(12) А like зачем? Оно же тормознутое
19 GreyK
 
29.08.11
22:27
(0) После того, как ты сообщишь что такое уникальность в твоем справочнике, будет больше нужных тебе ответов.
20 Лефмихалыч
 
29.08.11
22:29
(0) зачем? Чтобы нельзя было завести два принципиально разных ООО "Вектор"?
21 Cthulhu
 
30.08.11
04:11
по уникальности регистрационных кодов контролируй.
22 СовсемЗеленый
 
30.08.11
17:34
(20) Допустим что принципиально разных с одним наименованием нет
23 FN
 
30.08.11
17:38
(22)
ООО Вектор
ООО вектор
ООО ВЕКТОР
ООО "Вектор"
Вектор ООО
Общество с ограниченной отвественностью "Вектор"
Вектор  ООО

это дубли?

Составить правила внесения в базу. После этого дубли сами "вылезут"
24 Смотрящий от 1С
 
30.08.11
17:40
давно когда то писал

Если (НовыйКонтрагент = 1) ИЛИ (Скопирован = 1)  Тогда        
       Контр = СоздатьОбъект("Справочник.Контрагенты");
       рс = СоздатьОбъект("ODBCRecordset");
       ТекстЗапроса = "-- qryMaker:Отчет1.2008.12.18.18.09.48
       |SELECT Контрагенты.ID [Ссылка $Справочник.Контрагенты]
       |     ,$Контрагенты.ИНН ИНН
       |   , Контрагенты.PARENTID [Родитель $Справочник.Контрагенты]
       |FROM $Справочник.Контрагенты AS Контрагенты With (NOLOCK)
       |";
       
       ТекстЗапроса=ТекстЗапроса+"WHERE (Контрагенты.ISMARK = 0) ";
       //    Если ПустоеЗначение(Наименование) = 0 Тогда
       ТекстЗапроса=ТекстЗапроса+" AND (   Rtrim(Контрагенты.DESCR)  LIKE :Наименование) ";
       //    КонецЕсли;
       
       рс.УстановитьТекстовыйПараметр("Наименование", "%"+Строка(СокрЛП(Наименование))+"%");  
       
       тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
       Если тз.КоличествоСтрок() > 0 Тогда
           Сообщить("В справочнике найдены похожие контрагенты. Для открытия формы выберите строку и нажмите ОК.");
           Сообщить("Для продолжения ввода нажмите ОТМЕНА");
           Сообщить("Ввод дублей контрагентов ЗАПРЕЩЕН!");
           Если    тз.ВыбратьСтроку(ВыбраннаяСтрока,"Похожий контрагент уже есть!",60) = 1 Тогда
               тз.ПолучитьСтрокуПоНомеру(ВыбраннаяСтрока);
               Если Контр.НайтиЭлемент(Тз.Ссылка)>0 Тогда
                   ОткрытьФорму(Контр.ТекущийЭлемент(),,0);
                   ОчиститьОкноСообщений();
                   СтатусВозврата(0);
                   Возврат;
               КонецЕсли;
           Иначе
               ОчиститьОкноСообщений();
           КонецЕсли;
           //здесь надо закрыть активную форму
           //    ТекущийЭлемент().Удалить(0);
           //    Форма.Закрыть();
       КонецЕсли;
25 alex-pro
 
30.08.11
17:45
Зачем такие сложности?
запретите английские буквы в наименовании, удаляйте лишние пробелы при записи и проверяйте обычным запросом.
26 alex-pro
 
30.08.11
17:46
А если приемлимы условия
НовыйКонтрагент = 1) ИЛИ (Скопирован = 1)
то вообще НайтиПоНаименованию отлично сработает.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший