Периодически приходится делать ветвление в модуле в зависимости от типа переданного объекта. С учетом возможности получения объекта как объектом так и ссылкой это вырастает в некрасивые
Если ТипЗнч(Основание) = Тип("ДокументСсылка.Документ1")
или ТипЗнч(Основание) = Тип("ДокументОбъект.Документ1") Тогда
В поисках красивого кода и оптимизации решил замерить, что лучше — ТипЗнч или Метаданные — ведь для метаданных сравнений меньше — метаданные одинаковы как у ссылки, так и у объекта.
Простой модуль (лентяи могут скачать обработку):
Процедура КнопкаВыполнитьНажатие(Кнопка)
//массив имен справочников
МасМД = Новый Массив;
Для Каждого мдСпр из Метаданные.Справочники Цикл
МасМД.Добавить(мдСпр.Имя)
КонецЦикла;
// проверочный объект и его трансформации
Объект = Справочники[МасМД[0]].ПустаяСсылка();
МД = Объект.Метаданные();
ТипОб = ТипЗнч(Объект);
// цикл по метаданным
Сообщить(ТекущаяДата()+" 1");
Для Каждого мдСпр из МасМД Цикл
Если МД = Метаданные.Справочники[мдСпр] Тогда
а = "Да"
Иначе
а = "Нет"
КонецЕсли;
КонецЦикла;
Сообщить(ТекущаяДата()+" 2");
// цикл по типам
Сообщить(ТекущаяДата()+" 3");
Для Каждого мдСпр из МасМД Цикл
Если ТипОб = Тип("СправочникОбъект."+мдСпр) или ТипОб = Тип("СправочникСсылка."+мдСпр) Тогда
а = "Да"
Иначе
а = "Нет"
КонецЕсли;
КонецЦикла;
Сообщить(ТекущаяДата()+" 4");
КонецПроцедуры
В результате получилось что получение метаданных медленее на порядок-два. И хотя речь о долях секунд, но всё равно увы…
Проверял на 8.1 и на 8.2
(0) Этот факт давно известен. Особенно тормозит метод Метаданные.НайтиПоПолномуИмени или что-то вроде того.
(0) А всего-то стоило прочитать стандарты разработки на ИТС. Там об этом написано
всё равно спасибо автору за данный материал, изложенный в статье
Что то я не понял — а что вам мешает вместо:
Написать
(4) DitriX,
можно добавить в замер и такой вариант и посмотреть результат. Почему-то уверен, что двойной вызов «типзнч(основание)» отработает быстрее )))
(2) ChiginAV, написано, но не обосновано. А теперь есть и замеры
(1) Поручик, попробовал здесь найти — не нашел, потому и выложил.
(5) w-divin, а вот нет. см (8)
попробовал
ТипОб = ТипЗнч(Объект); 0,000019
ТипСС = ТипЗнч(Объект.Ссылка); 0,000046
но
Если ТипОб = Тип(«СправочникОбъект.»+мдСпр) или ТипОб = Тип(«СправочникСсылка.»+мдСпр) Тогда 327 0,004849
Если ТипСС = Тип(«СправочникСсылка.»+мдСпр) Тогда 327 0,003510
Кроме прочего, ТипЗнч удачно отработает и в случае, когда проверяемая переменная имеет простой тип (строка, число, булево, дата, null, неопределено) или коллекцию.
В этой ситуации попытка обратиться к свойствам (.Ссылка) или к методам (.Метаданные()) — вызовет ошибку во время выполнения.
(10) DrAku1a, да, тут вы совершенно правы, но всё зависит от базы и конкретной задачи. Например ветвление по типу основания в ОбработкеЗаполнения не предполагает в качестве основания нессылочные типы.
(11) Хороший пример… Когда в форме списка документов установлен отбор и создается новый документ, то в качестве источника для заполнения передается Структура.
(12) DrAku1a, или речь не о 8.1, или я чего-то не отловил. Проверил — ОбработкаЗаполнения не вызывается, в форме ПараметрОбъектКопирования и ПараметрОснование имеют значение Неопределено.
(13) Хм… Может я туплю… У меня 8.2, конфа Комплексная автоматизация 1.1
(13)(14) Передача структуры в качестве параметра при созданию документа есть распространенный прием, поэтому не стоит его сбрасывать со счетов. Назначение метаданных несколько другое, автор в своей статье наглядно доказал, что нестандартное использование этого инструмента неоправдано.
(9)
почему нет? как раз по (8)
отрабатывает дольше. причем более чем в 2 раза.
А если еще каждый раз не получать типзнч то можно и на этом немного поэкономить…
(16) w-divin, это в относительных величинах, однако в абсолютных сложив 2 шага — 1)получение типа и 2) сравнение типов получим выигрыш 0,001312 при использовании приведения к ссылке. Собственно я и экономлю на получении типзнч, загоняя в переменную.
(2) ChiginAV, Ссылку на статью можно?
(18)http://its.1c.ru/db/v8std#content:2149184091:1
Лично я не сильно доверяю этим
сравнениямтьфу, замерам, т.к. как-то понадобилось оптимизировать мне некий код, я его вынес в 2 функции и начал сравнивать их отладчиком — с десяток раз сравнивал и в результате сколько сравнений столько и результатов, иногда на порядок отличались, иногла рядом стояли. Я так и не понял оптимизировал ли я что-то в итоге. Начал равнятся на медленные машины и внутреннее чувство времени. Хотя может это было связано с тем что код работал с формой списка при ее прокрутке, но я прокручивал список равное количество раз для каждого теста.(20) CaSH_2004, , но я прокручивал список равное количество раз для каждого теста.
равное количество раз в секунду?
НастройкаПрограммы
(4) расшифруйте что за код?Основание.Ссылка
(22) в «цикле по типам» идет проверка условия
т.е. анализируемый объект может быть как полным (СправочникОбъект), так и ссылкой (СправочникСсылка). Поскольку в примере нужно лишь определить тип метаданных, то неважно, какого типа объект анализируем. Поэтому, для упрощения кода можно сделать типизацию и гарантированно получить объект типа СправочникСсылка и проверять лишь одно условие
Замеры в таком варианте я приводил в (8)
(23)я чет затупил ) Я вот разрабатываю объектную модель для 1с, один справочник используется для данных и закрывается для чтения, второй справочник содержит методы доступа к первому справочнику которые работают в привилегированном режиме, хочу сделать полную объектную модель для 1с, типа обертки для разработки со всеми 4-5 пунктами объектов, полиморфизм,наследование,инкапсуляцию.
Что скажите?