Gigi @ Вчера, 10:42
необходимо зарегистрироваться для просмотра ссылки
,
Дорогие друзья!
Все-таки решил довершить тему вопроса финальным вариантом решения.
Ибо сей комментарии:
Цитата(pablo @ 22.10.19, 8:51) необходимо зарегистрироваться для просмотра ссылки
То есть вместо быстрой типовой функции Вы предлагаете использовать своего "монстра" из XML, который возвращает текстовые поля? По Вашему, скорость выполнения кода и объем пересылаемых данных - пустой звук, раз Вы так легко ими жертвуете?
представился мне слишком важным вопросом функции, что бы забыть учесть его.
Да именно. То, что приметил автор, данного комментария, он был прав. И это справедливое критическое замечание, которое уважаю.
Именно поэтому все-таки решил отреагировать и исправить этот недостаток. Ну, или почти исправить на сколько это возможно. Ибо тут не то, что согласен с автором комментария. Более того, считаю, что любое решение, пусть даже применимое и проверенное на практике, не стоит даже «выеденного яйца», если это наносит ущерб скорости выполнения задачи. Так что, скорость выполнения очень важный вопрос.
необходимо зарегистрироваться для просмотра ссылки//############ ТЕСТ ########################################
&НаКлиенте
Процедура СведенияПоЗначению_Тест(Команда)
//===================================
стрТип=СведЗнч(Объект.Ссылка,"Все",);
//===================================
Предупреждение(
"ФУНКЦИЯ: «СведЗнч"+Символы.ПС+"(<Значение>,<Сведения>,<Проверка>)»"+Символы.ПС+
"---------------------------------------"+Символы.ПС+
"Результат:"+Символы.ПС+
"---------------------------------------"+Символы.ПС+
"Тип указанный / "+СведЗнч(Объект.Ссылка,"Тип",)+Символы.ПС+
"Сведения-Тип / "+стрТип.СведенияТип+Символы.ПС+
"Сведения-Тип группа / "+стрТип.СведенияТипГруппа+Символы.ПС+
"Сведения-Метаданные группа / "+стрТип.СведенияМетаданныеГруппа+Символы.ПС+
"Сведения-Метаданные имя / "+стрТип.СведенияМетаданныеИмя+Символы.ПС+
"Сведения-Метаданные полное имя / "+стрТип.СведенияМетаДанныеПолноеИмя+Символы.ПС+
"---------------------------------------"+Символы.ПС+
"Тип указанный - Проверка / "+СведЗнч(Объект.Ссылка,"Тип",СведЗнч(Объект.Ссылка,"СведенияТип",))+Символы.ПС+
"Сведения-Тип - Проверка / "+СведЗнч(Объект.Ссылка,"ПроверкаТип",стрТип.СведенияТип)+Символы.ПС+
"Сведения-Тип группа - Проверка / "+СведЗнч(Объект.Ссылка,"ПроверкаТипГруппа",стрТип.СведенияТипГруппа)+Символы.ПС+
"Сведения-Метаданные группа - Проверка / "+СведЗнч(Объект.Ссылка,"ПроверкаМетаданныеГруппа",стрТип.СведенияМетаданныеГруппа)+Символы.ПС+
"Сведения-Метаданные имя - Проверка / "+СведЗнч(Объект.Ссылка,"ПроверкаМетаданныеИмя",стрТип.СведенияМетаданныеИмя)+Символы.ПС+
"Сведения-Метаданные полное имя - Проверка / "+СведЗнч(Объект.Ссылка,"ПроверкаМетаДанныеПолноеИмя",стрТип.СведенияМетаДанныеПолноеИмя)+Символы.ПС+
"---------------------------------------");
//===================================
КонецПроцедуры
//##########################################################
//########### ОСНОВНЫЕ СВЕДЕНИЯ ПО ЗНАЧЕНИЮ ################
&НаСервере
Функция СведЗнч(Значение,Сведения,Проверка) Экспорт
//============================
Если Сведения=Неопределено или Сведения="Тип" Тогда
Если Проверка=Неопределено Тогда
Возврат ТипЗнч(Значение);
Иначе
Возврат ТипЗнч(Значение) = Тип(Проверка);
КонецЕсли;
Иначе
XMLТип=XMLТипЗнч(Значение).ИмяТипа;
КонецЕсли;
//============================
Если Найти(XMLТип,".")=0 Тогда
СведенияТип=Строка(ТипЗнч(Значение));
СведенияТипГруппа=СведенияТип;
Иначе
СведенияМетаДанныеПолноеИмя=Значение.Метаданные().ПолноеИмя();
Номер=Найти(СведенияМетаДанныеПолноеИмя,".");
СведенияМетаданныеИмя = Сред(СведенияМетаДанныеПолноеИмя,Номер+1);
СведенияМетаданныеГруппа = СтрЗаменить(СведенияМетаДанныеПолноеИмя,"."+СведенияМетаданныеИмя,"");
Если Найти(XMLТип,"RecordSet")>0 Тогда
СведенияГруппа="НаборЗаписей";
ИначеЕсли Найти(XMLТип,"Ref")>0 Тогда
СведенияТипГруппа="Ссылка";
Иначе
СведенияТипГруппа="Объект";
КонецЕсли;
СведенияТип=СведенияМетаданныеГруппа+СведенияТипГруппа+"."+СведенияМетаданныеИмя;
КонецЕсли;
//============================
стрСведения=Новый Структура();
стрСведения.Вставить("СведенияТип",СведенияТип);
стрСведения.Вставить("СведенияТипГруппа",СведенияТипГруппа);
стрСведения.Вставить("СведенияМетаданныеГруппа",СведенияМетаданныеГруппа);
стрСведения.Вставить("СведенияМетаданныеИмя",СведенияМетаданныеИмя);
стрСведения.Вставить("СведенияМетаДанныеПолноеИмя",СведенияМетаДанныеПолноеИмя);
стрСведения.Вставить("ПроверкаТип");
стрСведения.Вставить("ПроверкаТипГруппа");
стрСведения.Вставить("ПроверкаМетаданныеГруппа");
стрСведения.Вставить("ПроверкаМетаданныеИмя");
стрСведения.Вставить("ПроверкаМетаДанныеПолноеИмя");
//-----------------------------
Если ТипЗнч(Проверка)=Тип("Структура") Тогда
Если Проверка.Свойство("Тип")=Истина Тогда
стрСведения.Вставить("ПроверкаТип",Проверка.Тип=стрСведения.СведенияТип);
ИначеЕсли Проверка.Свойство("ТипГруппа")=Истина Тогда
стрСведения.Вставить("ПроверкаТипГруппа",Проверка.ТипГруппа=стрСведения.СведенияТипГруппа);
ИначеЕсли Проверка.Свойство("МетаданныеГруппа")=Истина Тогда
стрСведения.Вставить("ПроверкаМетаданныеГруппа",Проверка.МетаданныеГруппа=стрСведения.СведенияМетаданныеГруппа);
ИначеЕсли Проверка.Свойство("МетаданныеИмя")=Истина Тогда
стрСведения.Вставить("ПроверкаМетаданныеИмя",Проверка.МетаданныеИмя=стрСведения.СведенияМетаданныеИмя);
ИначеЕсли Проверка.Свойство("МетаДанныеПолноеИмя")=Истина Тогда
стрСведения.Вставить("ПроверкаМетаДанныеПолноеИмя",Проверка.МетаДанныеПолноеИмя=стрСведения.СведенияМетаДанныеПолноеИмя);
КонецЕсли;
КонецЕсли;
//============================
Если Сведения="Все" Тогда
знВозврат=стрСведения;
Иначе
Если Проверка=Неопределено Тогда
знВозврат=стрСведения[Сведения];
Иначе
Ключ=СтрЗаменить(Сведения,"Проверка","Сведения"); Сообщить(Ключ);
Если стрСведения.Свойство(Ключ)=Истина Тогда
знВозврат=Проверка=стрСведения[Ключ];
Иначе
знВозврат=Неопределено; Сообщить("Неправильное указание параметра сведений: «"+Сведения+"»");
КонецЕсли;
КонецЕсли;
КонецЕсли;
//============================
Возврат знВозврат;
//============================
КонецФункции
В данном варианте функция переименована на «СведЗнч(<Значение>,<Сведения>,<Проверка>)» и вообще видоизменена. И она только одна. Т.е. без других функций в помощь. И это что бы быстрее работала.
Конечно, в представленном видоизмененном варианте и тут не претендую на 100 процентную правоту. Однако я решил объединить типовую системную функцию 1С «ТипЗнч()» и при этом добавить дополнение к ней. Поэтому уже теперь представленную функцию можно использовать по-всякому. Не только в виде дополнительных возможностей, но и формате системной функции.
Для примера, вот на пример код с применением системных инструментов:
ИстинаЛожь=ТипЗнч(ТекОбъект) = Тип("СправочникСсылка.ИмяСправочника")
А вот пример той же задачи уже с помощью представленной функции СведЗнч(<Значение>,<Сведения>,<Проверка>)»:
ИстинаЛожь=СведЗнч (ТекОбъект ,"Тип","СправочникСсылка.ИмяСправочника",)
Если сравнить первый вариант и второй то первый будет все равно быстрее, но думаю не на существенную величину. А на мизерную. Потому, что в моей функции стоит всего один малюсенький алгоритм. Поэтому думаю, разница в скорости будет не существенная.
А относительно скорости выполнения по дополнительным возможностям функции то, это уже проблемы системы 1С. И то, что в системе получить другие сведения возможно только с применением XML. И никак иначе.
И почему так об этом у меня есть свое мнение.
Как я предполагаю, причина в том, что разработчиками системы 1С была допущена одна логическая ошибка в группировке типов данных. Хотя, если это конечно вообще можно назвать «логической ошибкой». Думаю, что, скорее всего, нет.
Но не знаю, с другой стороны, думаю это все-таки не ошибка, а это скорее попросту говоря, небрежная группировка типов данных. Вот что.
Как я думаю, именно по этой причине системная функция «ТипЗнч()», и получилась такой немощной.
Но ладно, это может быть всего лишь мои предположения. И вообще вопрос другой, уже новой темы. Которую, может быть создам и изложу подробно, но коротко. И если решу создать такую тему то, интересно будет услышать мнение по данному вопросу.
Ладно!
Удобного юза!