- 1
Если Найти(Строка(ТипЗнч(Ссылка)),"Документ") Тогда
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−80
Если Найти(Строка(ТипЗнч(Ссылка)),"Документ") Тогда
Проверка, является ли переданная ссылка документом. Сегодня без авторства.
ilya2184 05.06.2013 14:14 # +2
если кто не понял
mrbus 11.02.2014 20:19 # 0
Почему этот метод лучше: встречал затыки с вашим способом, по-моему возвращалась Истина, если передать Неопределено. Некая логика есть, ведь "многотипные" реквизиты могут принимать значение Неопределено.
А насчет первоначального говнокода, я встречал винды, где конфигуратор по умолчанию считает родным английский. Да, 1С берет локализацию из винды, если она явно не указана.
Строка(ТипЗнч(Ссылка)) вернет что-нибудь типа "DocumentReference.Blablabla".
Тыкну пальцем: такое встречал в конфигурации "ИТРП: Процессное производство". Написал авторам. Исправили. Но не везде. Типа, "Рефакторинг? Не, не слышал". Ну хотя бы поиск по всей конфигурации могли бы сделать.
И кстати, исправили на ваш же вариант :) После чего я им снова тыкнул на косяк с Неопределено :)
mrbus 11.02.2014 20:43 # 0
an0nym 05.06.2013 15:08 # +7
vistefan 05.06.2013 21:41 # +2
bormand 06.06.2013 05:22 # 0
А почему у документа может быть несколько типов?
ilya2184 06.06.2013 08:50 # +3
kyzi007 06.06.2013 10:21 # 0
nixel 06.06.2013 11:53 # 0
в случае счета фактуры он обычно называется СчетФактураВыданный. Без нижних подчеркиваний.
kyzi007 06.06.2013 11:58 # 0
ilya2184 06.06.2013 12:45 # +1
Есть Соглашение при написании кода\Оформление модулей\Правила образования имен переменных
Говнокодеров развелось хоть пруд пруди, и про документ "Система стандартов и методик разработки конфигураций для платформы 1С:Предприятие 8 " знает очень небольшой процент.
roman-kashitsyn 06.06.2013 12:46 # +2
В десяти томах?
ilya2184 06.06.2013 12:55 # +2
Есть на дисках ИТС, для действующих подписчиков можно на сайте ознакомится http://its.1c.ru/db/v8std
nixel 06.06.2013 11:52 # +4
С точки зрения человека, который не пишет на 1с - лютое говно.
С точки зрения человека, который знает баги 1с и места тормозов в 1с - вполне рабочий костыль, который можно применять. Костыль, который работает быстрее методов, предоставляемых платформой и рекомендуемых к использованию 1с.
ilya2184 06.06.2013 12:01 # +1
nixel 06.06.2013 12:12 # 0
ilya2184 06.06.2013 12:27 # 0
Я проверил
10M раз Строка() и ТипВсеСсылки()
платформа 8.2.18.61
по замеру производительности в режиме отладки 50K раз
Так что не Найти() не быстрее, и работает не всегда
Жаль что специалистов таких как ты, я вижу, уже двое...
nixel 06.06.2013 13:10 # +2
на единичном запуске вариант со строкой отрабатывает быстрее (так же на 8.2.16.61). Циферки с замера привести или на слово поверите?
А вот на личности переходить не стоит.
nixel 06.06.2013 13:17 # 0
ilya2184 06.06.2013 13:28 # 0
конфа: Бухгалтерия "допиленная"
Строка() 0,000364
СодержитТип() 0,000134
ilya2184 06.06.2013 13:31 # 0
ilya2184 06.06.2013 13:41 # 0
получение типа, вхождение числа в коллекцию чисел
против
получение типа, получение имени из коллекции, поиск по подстроке, преобразование числа в булево
Не верю
Код в студию
nixel 06.06.2013 14:17 # +2
Тестировал на этом:
Из отличий сразу в глаза бросается то, что я убрал шаг преобразования в булево и порядок вызова функций.
Замеры:
СодержитТип() 0,000048
Строка() 0,00004
СодержитТип() 0,00006
Строка() 0,000046
СодержитТип() 0,000063
Строка() 0,000051
После того, как убрал = 0 из условия.
СодержитТип() 0,000068
Строка() 0,000055
СодержитТип() 0,000063
Строка() 0,00005
К слову сказать, в обратном порядке вызовов идет обратный порядок в замерах. На мой взгляд, тут идет просадка в скорости при первом вызове ТипЗнч() и помещении этого добра в кэш.
nixel 06.06.2013 14:18 # 0
ilya2184 06.06.2013 14:35 # 0
Ссылка = Документы.СчетФактураВыданный.ПустаяСсыл ка();
ТипСсылки = ТипЗнч(Ссылка);
Сообщить(ТипСсылки);
вывод:
Счет-фактура выданный
:-)))
Ща я потестю на управляемом приложении (на толстом я так понимаю), но в не думаю что есть разница, между обычным приложением в данном случае, и один замер - не показателен. Определение типа вынесу за циклы.
nixel 06.06.2013 14:44 # 0
Почему нерабочий? При сообщить() преобразование типов просто проходит. Или я что-то еще не заметил?
А я вот никак на обед не могу уйти. =(
nixel 06.06.2013 14:48 # 0
Да это прям рекурсивный баг какой-то! :D такой спор прервался)
ilya2184 06.06.2013 14:49 # 0
Кстати ЗНАЧИТЕЛЬНО медленнее (50K в одном цикле)
Найти(Строка(ТипСсылки),"Документ") 1,545385 (против 0,394504 в неуправляемом)
Документы.ТипВсеСсылки().СодержитТип(Тип Ссылки) 1,441650 (против 0,307880 в неуправляемом)
...удивление... а не, не удивление - сервер-то у меня на компьютере в виртуалке :-)
в толстом управляемом приложении похожая ситуация.
Ну да ладно, мне надоело... я считаю что поиск по строке - зло, если переменная типа тип - то работать с ней как с типом, если число - как с числом.
nixel 06.06.2013 14:53 # 0
Я абсолютно согласен, что поиск по строке - злое зло и делать надо по-нормальному. И благодарю за развенчание моей уверенности в тормознутости работы метода СодержитТип().
Надо будет еще перепроверить скорость работы методов вроде Метаданные.Справочники.Найти() и Содержит(), может что в платформе уже успели поправить на этот счет.
ilya2184 06.06.2013 14:57 # 0
nixel 06.06.2013 15:00 # 0
возможно, что именно виртуалка дает такую разницу.
guest 28.06.2013 05:50 # 0
1. Документы.ТипВсеСсылки().СодержитТип(нео пределено) вернет Истина
2. Лев(ТипЗнч(Ссылка), 8)="Документ" вернет истина также в случае, когда переданное значение содержит ДокументОбъект, ДокументМенеджер, ДокументСписок.
bormand 28.06.2013 06:01 # 0
Иван Фёдорович Крузенштерн, человек и пароход менеджер и документ.
guest 28.06.2013 09:46 # 0
guest 23.08.2013 15:02 # 0
kegdan 23.08.2013 15:11 # 0
guest 04.02.2014 15:29 # 0
guest 04.02.2014 15:02 # 0
mrbus 11.02.2014 20:39 # 0
mrbus 11.02.2014 20:39 # 0