Имя: Пароль:
1C
1С v8
Запрет на дублирование наименования номенклатуры
0 Яна93
 
10.02.15
16:26
Добрый день!
У меня такой вопрос.. в Бухгалтерии 3.0 хочу прописать на запрет дублирования наименования в справочнике номенклатуры.. вот что есть у меня сейчас:

В модуле формы элемента в процедуру
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

добавила следующую строчку..
Отказ = ОбщегоНазначения.ПроверитьНаИдентичностьНаименования(ЭтотОбъект);

А в общем модуле ОбщегоНазначения добавила функцию

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


но выходит сообщение об ошибке
{ОбщийМодуль.ОбщегоНазначения.Модуль(2957)}: Метод объекта не обнаружен (ЭтоНовый)
    Если СамОбъект.ЭтоНовый() тогда
1 Chameleon1980
 
10.02.15
16:30
запросом не?
2 Яна93
 
10.02.15
16:33
(1) Запросом я сравниваю наименования, если присутствует - то вывожу сообщение пользователю..
3 GreatOne
 
10.02.15
16:34
с упр. формами не работаю,но вроде там реквизитформывзначение()
4 alle68
 
10.02.15
16:34
(0) Посмотри на 2-й параметр.
5 piter3
 
10.02.15
16:35
могу ошибаться,но ТекущийОбъект.ЭтоНовый()
6 1976vas
 
10.02.15
16:36
СамОбъект - скорее всего ссылка
7 Chameleon1980
 
10.02.15
16:37
именно объект

СправочникОбъект.<Имя справочника>.ЭтоНовый (CatalogObject.<Имя справочника>.IsNew)
СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>)
ЭтоНовый (IsNew)
Синтаксис:

ЭтоНовый()
Возвращаемое значение:

Тип: Булево.
Истина - изменяется еще ни разу не записанный элемент; Ложь - элемент уже записан.
Описание:

Определяет, записан ли элемент в базу данных.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Пример:

Если Объект.ЭтоНовый() Тогда
    Объект.Наименование = "Новый элемент";
КонецЕсли;


может найтипонаименоанию ?
8 Chameleon1980
 
10.02.15
16:37
может найтипонаименоанию ?
9 GreatOne
 
10.02.15
16:38
Да нет же объектов в форме
10 Яна93
 
10.02.15
16:39
(5) {ОбщийМодуль.ОбщегоНазначения.Модуль(2957,7)}: Переменная не определена (ТекущийОбъект)
    Если <<?>>ТекущийОбъект.ЭтоНовый() тогда (Проверка: Сервер)
11 Яна93
 
10.02.15
16:40
(8) так?
Если СамОбъект.ЭтоНовый() тогда
        Контр = Справочники.Номенклатура.НайтиПоНаименованию("Наименование", СамОбъект.Наименование);
12 Kain_wrath
 
10.02.15
16:40
Проверку ЭтоНовый() перекинь в процедуру ПередЗаписью и оттуда уже вызывай свою проверку
13 salvator
 
10.02.15
16:41
(10) А передаешь как, так?
Отказ = ОбщегоНазначения.ПроверитьНаИдентичностьНаименования(ТекущийОбъект);
14 Kain_wrath
 
10.02.15
16:41
ПередЗаписью клиента, а не сервера
15 anatoly
 
10.02.15
16:42
Пол:    Женский
Род занятий:    Бухгалтер

кто пустил бухгалтершу в конфигуратор???
16 Яна93
 
10.02.15
16:42
сколько вариантов..сейчас попробую))
17 Яна93
 
10.02.15
16:43
(15) я курсы проходила))
18 Kain_wrath
 
10.02.15
16:43
фотка решает
19 GreatOne
 
10.02.15
16:45
там нет объекта. я не прав или меня упорно никто не видит? Дайте знать, уже самому интересно!
20 alle68
 
10.02.15
16:47
(19)  Интересно - смотри (13) или (4).
21 GreatOne
 
10.02.15
16:48
(20) То есть вас тоже не замечают?
22 Яна93
 
10.02.15
16:49
(13) сразу сработал твой вариант!! Спасибо всем огромное!))
С ума сойти как приятно когда код работает))))
23 Злопчинский
 
10.02.15
16:49
"Печенье Юбилейное" и "Печенка Юбиленинка" - поймет что один товар? ;-)
24 Яна93
 
10.02.15
16:50
(23) вот с этим уже ни чего не поделаешь)) возможно крутой программист сможет..но не я))
25 alle68
 
10.02.15
16:52
(22) Молодец. Не учла такой вариант: наименование стало одинаковым в результате изменения элемента, когда объект уже не нов.
26 anatoly
 
10.02.15
16:52
(24) это (23) уже никому не нужные извращения...
вообще номенклатура по артикулу должна однозначно различаться.
27 Яна93
 
10.02.15
16:59
(25) действительно, когда объект уже записан то модуль его не замечает)) ну чуть позже попробую осилить..пока наслаждаюсь маленькой победой))
28 salvator
 
10.02.15
17:01
(27) Просто убери условие на "ЭтоНовый" и будет тебе еще одна маленькая победа.
29 Яна93
 
10.02.15
17:06
(28) {ОбщийМодуль.ОбщегоНазначения.Модуль(2957)}: Преобразование значения к типу Булево не может быть выполнено
    Если ТекущийОбъект тогда

а тут уже ругаться начал..может лучше оставить ЭтоНовый?
30 alle68
 
10.02.15
17:07
(27) Завидую!
(28) Этого недостаточно. Мало того, это запретит любые изменения.
31 Яна93
 
10.02.15
17:07
(28) тем более получается он каждый раз будет проверять справочники при закрытии..а в нашем случае будет проверять лишь новые..
32 salvator
 
10.02.15
17:09
(30) Ага, точно. Это я погорячился :))
33 anatoly
 
10.02.15
17:19
(31) не при закрытии а перед записью надо проверять.
34 salvator
 
10.02.15
17:43
(31) Можно использовать свойство Модифицированность.
Если оно равно Истина, то проводить проверку на наименование. Только добавить в запрос условие на неравенство проверяемого объекта. Чтобы при установке прежнего наименования не вылезло ошибки.
35 Garykom
 
гуру
10.02.15
17:46
(0) а если " " (пробел) лишний в середине, начале или конце наименования  добавят?

это дубля или нет?

может еще 220 к клаве и током автоматом бить когда такое пытаются делать? ))
36 Garykom
 
гуру
10.02.15
17:47
(35)+ хотя не,

лучше сразу на тревожную кнопку идет вызов дежурного админа баз данных и группы оперативного реагирования в лице сисадмина и команды программистов
37 anatoly
 
10.02.15
17:48
(35) идея в (23) еще суровее ))
можно до бесконечности выдумывать критерии "одинаковости".
например: большие и маленькие буквы, латиница и похожие кириллица...
38 Garykom
 
гуру
10.02.15
17:51
(37)+ ага а потом "пойдет у меня все равно почти дубли заводят"

и как сделать расстояние Левенштайна и прочие fuzzy string search (методы нечеткого поиска и сравнения)?
39 SUA
 
10.02.15
17:51
Не трогайте типовую бухгалтерию ей еще жить и обновляться хочется!!!

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