- 1
Если Найти(Строка(ТипЗнч(Ссылка)),"Документ") Тогда
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−80
Если Найти(Строка(ТипЗнч(Ссылка)),"Документ") Тогда
Проверка, является ли переданная ссылка документом. Сегодня без авторства.
если кто не понял
Почему этот метод лучше: встречал затыки с вашим способом, по-моему возвращалась Истина, если передать Неопределено. Некая логика есть, ведь "многотипные" реквизиты могут принимать значение Неопределено.
А насчет первоначального говнокода, я встречал винды, где конфигуратор по умолчанию считает родным английский. Да, 1С берет локализацию из винды, если она явно не указана.
Строка(ТипЗнч(Ссылка)) вернет что-нибудь типа "DocumentReference.Blablabla".
Тыкну пальцем: такое встречал в конфигурации "ИТРП: Процессное производство". Написал авторам. Исправили. Но не везде. Типа, "Рефакторинг? Не, не слышал". Ну хотя бы поиск по всей конфигурации могли бы сделать.
И кстати, исправили на ваш же вариант :) После чего я им снова тыкнул на косяк с Неопределено :)
А почему у документа может быть несколько типов?
в случае счета фактуры он обычно называется СчетФактураВыданный. Без нижних подчеркиваний.
Есть Соглашение при написании кода\Оформление модулей\Правила образования имен переменных
Говнокодеров развелось хоть пруд пруди, и про документ "Система стандартов и методик разработки конфигураций для платформы 1С:Предприятие 8 " знает очень небольшой процент.
В десяти томах?
Есть на дисках ИТС, для действующих подписчиков можно на сайте ознакомится http://its.1c.ru/db/v8std
С точки зрения человека, который не пишет на 1с - лютое говно.
С точки зрения человека, который знает баги 1с и места тормозов в 1с - вполне рабочий костыль, который можно применять. Костыль, который работает быстрее методов, предоставляемых платформой и рекомендуемых к использованию 1с.
Я проверил
10M раз Строка() и ТипВсеСсылки()
платформа 8.2.18.61
по замеру производительности в режиме отладки 50K раз
Так что не Найти() не быстрее, и работает не всегда
Жаль что специалистов таких как ты, я вижу, уже двое...
на единичном запуске вариант со строкой отрабатывает быстрее (так же на 8.2.16.61). Циферки с замера привести или на слово поверите?
А вот на личности переходить не стоит.
конфа: Бухгалтерия "допиленная"
Строка() 0,000364
СодержитТип() 0,000134
получение типа, вхождение числа в коллекцию чисел
против
получение типа, получение имени из коллекции, поиск по подстроке, преобразование числа в булево
Не верю
Код в студию
Тестировал на этом:
Из отличий сразу в глаза бросается то, что я убрал шаг преобразования в булево и порядок вызова функций.
Замеры:
СодержитТип() 0,000048
Строка() 0,00004
СодержитТип() 0,00006
Строка() 0,000046
СодержитТип() 0,000063
Строка() 0,000051
После того, как убрал = 0 из условия.
СодержитТип() 0,000068
Строка() 0,000055
СодержитТип() 0,000063
Строка() 0,00005
К слову сказать, в обратном порядке вызовов идет обратный порядок в замерах. На мой взгляд, тут идет просадка в скорости при первом вызове ТипЗнч() и помещении этого добра в кэш.
Ссылка = Документы.СчетФактураВыданный.ПустаяСсыл ка();
ТипСсылки = ТипЗнч(Ссылка);
Сообщить(ТипСсылки);
вывод:
Счет-фактура выданный
:-)))
Ща я потестю на управляемом приложении (на толстом я так понимаю), но в не думаю что есть разница, между обычным приложением в данном случае, и один замер - не показателен. Определение типа вынесу за циклы.
Почему нерабочий? При сообщить() преобразование типов просто проходит. Или я что-то еще не заметил?
А я вот никак на обед не могу уйти. =(
Да это прям рекурсивный баг какой-то! :D такой спор прервался)
Кстати ЗНАЧИТЕЛЬНО медленнее (50K в одном цикле)
Найти(Строка(ТипСсылки),"Документ") 1,545385 (против 0,394504 в неуправляемом)
Документы.ТипВсеСсылки().СодержитТип(Тип Ссылки) 1,441650 (против 0,307880 в неуправляемом)
...удивление... а не, не удивление - сервер-то у меня на компьютере в виртуалке :-)
в толстом управляемом приложении похожая ситуация.
Ну да ладно, мне надоело... я считаю что поиск по строке - зло, если переменная типа тип - то работать с ней как с типом, если число - как с числом.
Я абсолютно согласен, что поиск по строке - злое зло и делать надо по-нормальному. И благодарю за развенчание моей уверенности в тормознутости работы метода СодержитТип().
Надо будет еще перепроверить скорость работы методов вроде Метаданные.Справочники.Найти() и Содержит(), может что в платформе уже успели поправить на этот счет.
возможно, что именно виртуалка дает такую разницу.
1. Документы.ТипВсеСсылки().СодержитТип(нео пределено) вернет Истина
2. Лев(ТипЗнч(Ссылка), 8)="Документ" вернет истина также в случае, когда переданное значение содержит ДокументОбъект, ДокументМенеджер, ДокументСписок.
Иван Фёдорович Крузенштерн, человек и пароход менеджер и документ.