Имя: Пароль:
1C
1С v8
Проверка на существование объекта
,
0 FIL0S0FF
 
26.03.17
12:03
Добрый день.
Сделал запрос обработкой результата.
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    НовыйОбъект = Справочники["Номенклатура"].СоздатьГруппу();
    НовыйОбъект.Наименование = "НЕИСПОЛЬЗОВАТЬ";
    НовыйОбъект.Записать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        ВыбОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
        ВыбОбъект.ПометкаУдаления = Истина;
        ВыбОбъект.Родитель = Справочники.Номенклатура.НайтиПоНаименованию("НЕИСПОЛЬЗОВАТЬ");
        ВыбОбъект.Записать();
    КонецЦикла;



При этом создаю новую группу для номенклатуры
    НовыйОбъект = Справочники["Номенклатура"].СоздатьГруппу();
    НовыйОбъект.Наименование = "НЕИСПОЛЬЗОВАТЬ";
    НовыйОбъект.Записать();


Теперь вопрос как сделать проверку... существует данная группа или нет? Потому что при выполнении данной обработки каждый раз создаётся новая группа.
1 Amra
 
26.03.17
12:08
НайтиПоНаименованию("НЕИСПОЛЬЗОВАТЬ")
2 Лефмихалыч
 
26.03.17
12:09
проверяй перед созданием, есть такая или нет, и создавай только, если нет. В чем вопрос-то?
3 FIL0S0FF
 
26.03.17
12:19
То есть
Если Справочники.Номенклатура.НайтиПоНаименованию("НЕИСПОЛЬЗОВАТЬ") = ЛОЖЬ

Тогда создаю. Иначе перехожу сразу к циклу.
Так?
Прошу прощение за глупые вопросы. Только учусь.
4 h-sp
 
26.03.17
12:24
(3) во-первых вот так

        ВыбОбъект.Родитель = НовыйОбъект.Ссылка;

зачем вы ищете то, что уже есть?
5 FIL0S0FF
 
26.03.17
12:31
(4) спасибо, не подумал об этом, хотя если Группа уже была и мне не придётся её создавать. Тогда поиск же всё равно нужен. Потому что переменной НовыйОбъект не будет...?
6 Лефмихалыч
 
26.03.17
12:33
(3) = неопределено

но лучше на форму обработки выведи реквизит, в который ты будешь руками выбирать эту группу "Не использовать" и бери ссылку из реквизита.
7 FIL0S0FF
 
26.03.17
12:34
ок. Всем спасибо
8 Serg_1960
 
26.03.17
12:45
Навскидку как-то вот так ( sorry, если есть ошибки :)

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

ГруппаНеИспользовать = Справочники.Номенклатура.НайтиПоНаименованию("Не использовать");
Если ГруппаНеИспользовать = Неопределенно Тогда
   ГруппаНеИспользовать = Справочники.Номенклатура.СоздатьГруппу();
   ГруппаНеИспользовать.Наименование = "Не использовать";
   ГруппаНеИспользовать.Записать();
   ГруппаНеИспользовать = ГруппаНеИспользовать.Ссылка;
КонецЕсли;
...
   ВыбОбъект.Родитель = ГруппаНеИспользовать;
...
9 Vaflya
 
26.03.17
12:50
(6)(8) зубры по воскресеньям лажают? если не найдет по наименованию то вернет пустую ссылку, юзаю ЗначениеЗаполнено()
10 Aleksey
 
26.03.17
12:53
(9) А если пустая ссылка то почему сразу и не спросить это?
Если ГруппаНеИспользовать.Пустая() Тогда
11 Serg_1960
 
26.03.17
12:59
(9) По воскресеньям даже у бога выходной - чего уж тут про прочих смертных... и зубров :)
12 Vaflya
 
26.03.17
12:59
пусть так. ?
13 Vaflya
 
26.03.17
13:00
12 к 10
14 Serg_1960
 
26.03.17
13:07
Охота мозги напрячь или поговорить? Вспомните про RLS :))

(13) Ты тоже в нашем клубе, зубр :)
15 Zhuravlik
 
26.03.17
13:12
(9) Тогда уж "Пустая()". "ЗначениеЗаполнено" - корректно использовать для проверки составного типа, где может быть и пустая ссылка и неопределено. Здесь однозначно только ссылка, использлвание "ЗначениеЗаполнено" может ввести в заблуждение того, кто потом этот код будет прокуривать.
16 Serg_1960
 
26.03.17
13:21
Если некто тормозит, глядя на ЗначениеЗаполнено(), то это...

- Ты кто?
- Песец!
- А чего такой толстый?
- Я не толстый, я - полный...
17 Vaflya
 
26.03.17
14:00
(15) такая корректность некорректна, все там ок, посмотрите в отладчике как работает ЗначениеЗаполнено(), это подходит практически для всего - почти все пишут Если ТЗ.КОличество() > 0 Тогда, достаточно Если ЗначениеЗаполнено(ТЗ, Массив.. любая коллекция) Тогда. Можно привести много вариантов более удобного использования относительно различных способов сравнения на ноль, на пустую строку, пустуюссылку и иже с ними.
касательно задачи ТС значениезаполнено() соответствует полностью, как и в большинстве случаев сравнений(откройте для себя ЗначениеЗаполнено(), не бойтесь, не кусается). В заблуждении будет только тот, кто не знает, что может возвращать тот или иной метод, а это уже недостаток грамотности.
18 Лефмихалыч
 
26.03.17
14:04
(15) нет. ЗначениеЗаполнено() нужно использовать всегда, когда аргумент точно не будет мутабельным.
Метод Пустая(), во-первых, выполняет больше действий, а, во-вторых, он скопытится, если там неопределено, булево, пустая строка или число.
19 Zhuravlik
 
26.03.17
14:12
Я хотел сказать что при проверке на пустоту *Ссылки* метод Пустая() более корректно применять, чем ЗначениеЗаполнено.
Нафига тогда вообще нужен метод "Пустая()"? Не для того ли как-раз, чтобы в коде сразу отличать реквизит ссылочного типа от составного?
Просто пример - в модуле обработки проведения натыкано "ЗначениеЗаполнено". При разработке понадобилось понять - составной это тип, или нет. Если бы был использован метод "Пустая" - было бы ясно, что ссылочный. Если ЗначениеЗаполнено - надо лезть в объект конфигурации, и там проверять тип реквизита.
Это еще реквизит. А если надо знать составного ли типа переменная в коде?
з.ы. в случае неудачного поиска конструкция
  Элем = Справочники.Номенклатура.НайтиПоНаименованию("Не использовать");
Если Элем.Пустая() Тогда..
- Отработает 100%, и ни разу не скопытится...
20 Лефмихалыч
 
26.03.17
14:17
(19) нет, пустая() не является более корректным методом. Пустая() - это атавизм, оставленный для обратной совместимости с теми временами, когда в платформе не было метода ЗначениеЗаполнено()
21 Zhuravlik
 
26.03.17
14:18
(20) Откуда такие сведения?
22 Лефмихалыч
 
26.03.17
14:20
(21) Опыт. В 8.0 не было ЗначениеЗаполнено() и там проверки осуществлялись посредством сравнения с пустыми значениями соответствующего типа или вызова Пустая(). Во все типовых была функция в модуле ОбщегоНазначенияГлоб.ЗначениеНеЗаполнено(), в которой это было написано. Потом в 8.1 или 8.2 - не помню - появилось ЗначениеЗаполнено() и в описании обновления платформы была пометочка, что используйте его и не долбите мозг с Пустая() и прочими велосипедами.
23 Zhuravlik
 
26.03.17
14:27
К сожалению, нет на ИТС рекомендаций по этому поводу. Все-равно - лучше использовать все по назначению. Считал, и буду считать что ЗначениеЗаполнено - только когда невозможно однозначно определить тип. Во всех остальных случаях на пустоту надо проверять соотв. методами класса. Потому что удобно прямо в коде понимать - переменная составного типа, или нет.
24 Лефмихалыч
 
26.03.17
14:33
(23) ну, считать ты можешь даже, что земля плоская.
Прямо в коде ты не понимаешь, а предполагаешь - типизация не жесткая, значение может быть любым.
25 Zhuravlik
 
26.03.17
14:39
(24) Если вижу Элем.Пустая() - именно понимаю)
26 2083
 
26.03.17
16:14
я б вообще через КД делал и не парил бы себе мозг наличием или отсутствием группы...
27 Vaflya
 
26.03.17
17:53
Смотри, даже в сп написано, что Найтипонаименованию может вернуть "неопределено". А неопределено.пустая() вернет лажу, какую, даже писать лень
28 youalex
 
26.03.17
18:21
(27) хватит умничать. Лучше сам что-нибудь умное скажи.
29 Serg_1960
 
26.03.17
20:38
(умное говорю, своё) Если в справочнике есть элемент с наименованием "НЕИСПОЛЬЗОВАТЬ", то вы все будете глупо выглядеть :)

PS: никто не обратил внимание, что отсутствует поиск/проверка на группу.
30 mehfk
 
26.03.17
20:59
(29) Конечно глупо. Ведь "НЕ" пишется отдельно от глаголов.
31 Zhuravlik
 
27.03.17
10:36
(27) И проверка на Пустая() в этом случае вызовет совершенно логичное исключение. Логичное, потому что поиск по наименованию (при отсутствии оного) - это бред. Это если мы говорим о поиске в справочнике заранее известного вида. А если ты ищешь по наименованию в справочнике (не в произвольном, а заранее известном), и у него при этом наименования нет, а ты проверяешь на ЗначениеЗаполнено - это уже не просто бред, а твоя грубая ошибка.
Впрочем, как если бы ты искал и в произвольном - не представляю чем было бы полезно использование ЗначениеЗаполнено в этом случае. Т.к. Пустая() вернет исключение, и будет ясно что что-то не так. Как минимум - что результаты такого поиска некорректны.

Я дико извиняюсь за оф. топ.
32 1dvd
 
27.03.17
10:39
(31) всё-таки объясни нормально свою ненависть к ЗначениеЗаполнено
33 Zhuravlik
 
27.03.17
10:40
(0) Перед циклом
    ГруппаНеИспользоватьСсылка = Справочники.Номенклатура.НайтиПоНаименованию("Не использовать", Истина);
    Если ГруппаНеИспользоватьСсылка.Пустая() Тогда
        ГруппаНеИспользоватьОбъект = Справочники.Номенклатура.СоздатьГруппу();
        ГруппаНеИспользоватьОбъект.Наименование = "Не использовать";
        ГруппаНеИспользоватьОбъект.Записать();
        
        ГруппаНеИспользоватьСсылка = ГруппаНеИспользоватьОбъект.Ссылка;        
    КонецЕсли;
34 Zhuravlik
 
27.03.17
10:41
(32) Да при чем тут ненависть? Я говорю о том, что объект на пустоту надо проверять соответствующим методом класса, т.к. это на выходе дает более прозрачный код. Смотри (19).
35 Vaflya
 
27.03.17
11:17
(34) зоопарк из "" пустая() 0 неопределено решается одной функцией, угадай, какой. хотя совершенной универсальности нет - исключение будет при мутабельных значениях. я больше о светлом будущем и универсальности. Одним словом Пустая() - лажа, видимо перекочевавшая из 8.0. А "прозрачный код" это конечно здорово, но еще лучше, когда человек знает и помнит, какие методы/функции какие типы возвращают
36 Vaflya
 
27.03.17
11:21
тут конечно могут быть варианты - если надо отличать Неопределено от пустой ссылки, тогда только сравнением, но если надо только понять есть/нет, то даже заморачиваться не стоит
37 Zhuravlik
 
27.03.17
11:34
"когда человек знает и помнит, какие методы/функции какие типы возвращают" - вот это ключевой момент. А теперь представь что ты не один работаешь)) И твою нетленку приходиться сопровождать кому-то еще.
Да и я *очень* сильно сомневаюсь что ты будешь помнить все возвращаемые значения, если только корректно поддерживать описание методов.
Еще момент - в слабо связанном коде довольно трудно допустить момент когда на вход проверки уходит "зоопарк из "" пустая() 0 неопределено".
38 Vaflya
 
27.03.17
12:32
(37) я тебя местами не понимаю
"если только корректно поддерживать описание методов" это о чем? вроде русским по белому, но к предложению по смыслу не подходит, вот как здесь сказано
"в слабо связанном коде" и это как?

зоопарк не весь сразу естественно, имел ввиду при работе то там то здесь делаешь проверки и сравнивать приходилось бы то на одно, то на другое, то методы какие то использовать(все это тоже нужно помнить, а это так трудно!) зачем козе баян.. я как бы не настаиваю, я сказал как мне кажется логичным для облегчения подобных проверок.
усталый спор
39 Zhuravlik
 
27.03.17
12:47
(38)
"если только корректно поддерживать описание методов" - это я о https://its.1c.ru/db/v8std#content:2149184102:hdoc, если корректно поддерживать то конечно проблем не будет. Только я сомневаюсь что кто-то на нетиражном решении с этим загоняется.
"в слабо связанном коде" - это когда архитектура твоего решения построена таким образом, что функциональный блок разбит на независимые друг от друга небольшие модули, т.е. достигается минимальная их зависимость друг от друга. К удивлению своему не нашел четкого определения этому термину сейчас, хотя он часто встречается в статьях о разработке через тестирование
40 Zhuravlik
 
27.03.17
12:48
(все это тоже нужно помнить, а это так трудно!) - гораздо труднее как-раз помнить какой тип тебе вернет тот или иной метод. А посмотреть лишний раз в СП описание методов класса никогда не вредно.
41 Vaflya
 
27.03.17
12:49
я сдаюсь!!)))
42 Вафель
 
27.03.17
12:50
для составного типа нельзя проверять на пустая()
43 Zhuravlik
 
27.03.17
12:54
(42) см. (15) и (19)
44 Вафель
 
27.03.17
12:56
(43) а зачем отличать ссылочный тип от составного?
45 Вафель
 
27.03.17
12:57
потребуется тебе потом тип рассширить, так нужно буедт искать все места гда пустая().
ЗначениеЗаполнено более безопасный метод
46 Vaflya
 
27.03.17
12:57
(43) сколько тебе лет? сори за личностное и оффтоп
47 Zhuravlik
 
27.03.17
13:02
(44) Чтобы знать какие типы может принимать переменная, что порой важно при разработке
(45) Слышал такое утверждение.  Только если потребуется расширить тип - значит потребуется проверить те места, где это используется. Если изначально была проверка на Пустая() - с этим проблем не будет. Если ЗначениеЗаполнено - при плохой архитектуре особенно - никогда качественно все не проверишь.
(46) заполнил в ЛК
48 Zhuravlik
 
27.03.17
13:03
Я к тому, что лучше уж получить исключение по Пустая(), и 100% знать в чем дело, чем трудноуловимую ошибку из-за конфликта типов
49 xxTANATORxx
 
27.03.17
13:04
(0)такие ссылки как Группа номенклатуры НЕ ИСПОЛЬЗОВАТЬ и при частом использовании лучше хранить в базе например в константах, или сделать предопределенный элемент справочника или создать справочник Предопределенные элементы и т.п.
50 Вафель
 
27.03.17
13:09
(47) Чтоб проверить нужно тесты делать изначально
51 Лефмихалыч
 
27.03.17
14:00
развели тут....

Zhuravlik, ты - старовер. Смирись с тем, что с тобой будут постоянно не согласны в этом вопросе.
52 Живой Ископаемый
 
27.03.17
14:08
2(0) Это Код для внешних пользователей, или для базы, в которой ты есть пользователем? Если второй - создай руками раз и потом используй.
53 Zhuravlik
 
27.03.17
14:15
(50) На каждый чих тест не сделаешь
(51) Ни разу :) Я использую метод "Пустая()" не потому что привык, и не могу отвыкнуть, а потому что это логично.
Кодить надо так, чтобы потом легко вносить изменения\сопровождать. Масштабируемость называется. А еще параллельно идет термин "Защитное программирование". Так что не смирюсь) Пока на ИТС не будет обоснованно доказано обратное.
Определенные зерна сомнения появились после (18) ("... больше действий.." - сомнительно). Потестю, как будет время, создам ветку по этой теме.
54 Мимохожий Однако
 
27.03.17
14:25
(47) Для функций проверки можно добавить описание, чтобы не гадать, какие типы проверяются
55 Вафель
 
27.03.17
14:32
(53) Точно старовер
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший