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