Имя: Пароль:
1C
 
Как работает код?
, , ,
0 Виктрыч
 
21.06.22
20:34
Господа, есть кусок кода, который проверяет на уникальность вносимые в справочник товары. Работает корректно, но никак не пойму, что фактически происходит, как осуществляется проверка. Можете объяснить?

Процедура ПередЗаписью(Отказ)
    
    Если ЭтоНовый() Тогда
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Товары.Наименование КАК Наименование
        |ИЗ
        |    Справочник.Товары КАК Товары
        |ГДЕ
        |    Товары.Наименование = &Наименование";
    Запрос.УстановитьПараметр("Наименование", Наименование);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Сообщить ("Такой товар уже существует!");
            Отказ = Истина;
            Прервать;
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры
1 Asmody
 
21.06.22
20:37
код работает примерно так: ВЖУХ!
2 Asmody
 
21.06.22
20:39
вообще-то, это код проверяет уникальность наименования товара.
что, однако, не помешает пользователям внести сколь угодно много дублей.
3 Ненавижу 1С
 
гуру
21.06.22
20:41
Код проверяет уникальность только новых данных. Имеющиеся можно переименовать одинаково и проверки не будет в принципе
4 2S
 
21.06.22
20:43
Зачем выборка в цикле, а не в если?
Решение в лоб, натыкайте пробелов или Анг символов и не сработает.
5 Виктрыч
 
21.06.22
20:45
То что код не проверяет уникальность при переименовании уже существующего товара я знаю. Проверил. То что код работает как ВЖУХ - тоже понимаю. Хотелось бы подробностей.
Чего сам понял. Если создается новый товар, запросом выбираются существующие товары по наименованию. А вот где наименование нового товара сравнивается с существующими?
6 Ненавижу 1С
 
гуру
21.06.22
20:47
(5) примерно здесь:

   |ГДЕ
        |    Товары.Наименование = &Наименование";
    Запрос.УстановитьПараметр("Наименование", Наименование);

Существующие сравниваются с параметром, в который передаётся наименование текущего (нового) объекта
7 Виктрыч
 
21.06.22
20:55
(6) Спасибо!
8 Asmody
 
21.06.22
21:09
что будет, если в наименовании добавят пробел в конце?
что будет, если вместо С напишут C, а вместо А - A? (а они напишут, будь уверен)
а если в наименовании есть числа, то 0.5 и 0,5 - это одно и то же или нет?
а вы знаете, что существует с десяток символов, "похожих" на "-" ("минус"), а программы из офисного пакета очень любят делать замену символов?
9 Злопчинский
 
21.06.22
21:28
(8) "что будет, если в наименовании добавят пробел в конце?"
а вот хз...
.
в клюшках, например, "Наименование" - фиксированной длины, типа СТР(50)
но если обратиться к получению "Наименования" объекта, типа
Стр.Наименование - то получишь строку без хвостовых пробелов...
(а прочие реквизиты строковые пользовательские возвращаются с хвотовыми пробелами)

а вот если наименование вытаскиватьв в запросе - то будет возвернуто с хвостовыми пробелами
.
а как оно работает в снеговике.... хз...
10 Злопчинский
 
21.06.22
21:29
Стр.Наименование
читать как
Спр.Наименование
11 Злопчинский
 
21.06.22
21:32
12 Ненавижу 1С
 
гуру
21.06.22
21:53
(8) насчет пробелов - ничего не будет, SQL конечные пробелы усекает при сравнении
13 DrZombi
 
гуру
22.06.22
07:20
(5) Что бы понять код, вы должны понимать, что там написано, и для чего.

ЭтоНовый()

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



Запрос = Новый Запрос;

Описание:
Предназначен для выполнения запросов к базе данных.




Как работать с запросами 1С:
https://v8.1c.ru/platforma/mehanizm-zaprosov/


Пока  Цикл
КонецЦикла;

Описание:
Оператор цикла Пока предназначен для циклического повторения операторов, находящиеся внутри конструкции Цикл – КонецЦикла. Цикл выполняется, пока логическое выражение равно Истина. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла.


Прервать;
Тоже из Цикла

Пока (While)
Синтаксис:
Пока <Логическое выражение> Цикл
// Операторы
[Прервать;]
// Операторы
[Продолжить;]
// Операторы
КонецЦикла;
14 DrZombi
 
гуру
22.06.22
07:22
(8) Будут новые вопросы на Мисту...  :)


Мне вот любопытно, он там кем приходится? :)
15 Asmody
 
22.06.22
08:17
(12) пробелы - это мизерная часть проблемы (они ещё, кстати, бывают в начале и в середине).
С полгода назад целый мини-проект случился по приведению артикулов в божеский вид. В (8) часть кейсов из него. И 10 разных символов "минус" ещё не самое странное.
16 DJ Anthon
 
22.06.22
08:21
НайтиПоНаименованию уже отменили?
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс