Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Пример по получению основных сведений по типу данных любого значения , 1С:Предприятие 8.3 (8.3.5.1517) - управляемое приложение          
Gigi Подменю пользователя
сообщение 21.10.19, 14:32
Сообщение #1

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Данным примером функции, решил поделиться для гостей сайта и вообще новичков в системе 1С.
Ибо сам в собственной практике сталкивался с кое-какими вопросами указанной темы. И вследствие чего самому приходилось искать по разным страницам в сети, готовое решение вопроса. Но в итоги находил вовсе не готовое решение, а ее отдельные лоскутки. И на удивление даже эти самые «лоскутки», оказывались не из серии кода самого языка 1С, а из языка XML. Что и послужило выводом того, что в самом языке 1С, скорее всего, нет готовой системной функции решающей указанный вопрос данной темы.
Именно по этой причине пришлось из собранных «лоскутков», сесть и написать эту ниже изложенную простую и думаю понятную функцию. По поводу, которой далеко не новички в системе 1С могут сказать, что не так сделал, как было бы корректнее. И будут обвинять меня в том, что то, как сделал это на самом деле «кустарщина» и т.д. Но, я в любом случае уважаю их мнение, даже если оно негативное. Но при это если честно, сам для своих собственных целей все-таки решил пользоваться не данной системной функцией от 1С:
ТипЗнч()

Созданной точно не в «кустарных» условиях, а другой, собственно написанной функцией, хотя пусть даже и в условия полной «кустарщины» smile.gif.
Теперь о самой функции.
Прежде всего, как протестировать...
Новичкам не буду объяснять элементарные азы. Думаю, сами найдут информацию в сети. А скажу только то, что в созданном справочнике или документе, не важно, пусть даже без единого реквизита в модуль формы объекта нужно полностью скопировать и вставить
вот этот весь текст кода с процедурами запуска и функциями:

//##########################################################

&НаКлиенте
Процедура ТипЗнчСведения_Тест(Команда)
//===================================
    стрТип=ТипЗнчСведения(Объект.Ссылка,"Структура");
//===================================
    Сообщить(
    "ФУНКЦИЯ: «ТипЗнчСведения"+Символы.ПС+"(<Значение>,<ПараметрВозврата>)»"+Символы.ПС+
    "---------------------------------------"+Символы.ПС+
    "Результат:"+Символы.ПС+
    "Тип - "+стрТип.Тип+Символы.ПС+
    "Тип группа - "+стрТип.Группа+Символы.ПС+
    "Метаданные группа - "+стрТип.МетаданныеГруппа+Символы.ПС+
    "Метаданные имя - "+стрТип.МетаданныеИмя+Символы.ПС+
    "Метаданные полное имя - "+стрТип.МетаДанныеПолноеИмя+Символы.ПС+
    "---------------------------------------");
//===================================
КонецПроцедуры

//##########################################################


//########### ОПРЕДЕЛЕНИЕ ТИПА ПО ЗНАЧЕНИЮ #################

&НаСервере
Функция ТипЗнчСведения(Значение,ЗначВозврата) Экспорт // ОСНОВНЫЕ СВЕДЕНИЯ по типу данных любого значения
XMLТип=XMLТипЗнч(Значение).ИмяТипа;
Если Найти(XMLТип,".")=0 Тогда
    ТипГруппа=Строка(ТипЗнч(Значение)); //ТипГруппа=ТипЗнч(Значение);        
    Тип=ТипГруппа;
    МетаданныеГруппа=ТипГруппа;
    МетаданныеИмя=ТипГруппа;
    МетаДанныеПолноеИмя=ТипГруппа;
Иначе
    МетаДанныеПолноеИмя=Значение.Метаданные().ПолноеИмя();
    МетаданныеГруппа=Парсер(МетаДанныеПолноеИмя,".",1);
    МетаданныеИмя=Парсер(МетаДанныеПолноеИмя,".",2);
    Если Найти(XMLТип,"RecordSet")>0 Тогда
    ТипГруппа="НаборЗаписей";    
    ИначеЕсли Найти(XMLТип,"Ref")>0 Тогда
    ТипГруппа="Ссылка";    
    Иначе
    ТипГруппа="Объект";    
    КонецЕсли;
    Тип=МетаданныеГруппа+ТипГруппа+"."+МетаданныеИмя;
КонецЕсли;    
//============================
Стр=Новый Структура();
Стр.Вставить("Группа",ТипГруппа);
Стр.Вставить("Тип",Тип);
Стр.Вставить("МетаданныеГруппа",МетаданныеГруппа);
Стр.Вставить("МетаданныеИмя",МетаданныеИмя);
Стр.Вставить("МетаДанныеПолноеИмя",МетаДанныеПолноеИмя);
//============================
    Если ЗначВозврата=Неопределено или ЗначВозврата="Структура" Тогда
    знВозврат=стр;    
    Иначе
    знВозврат=стр[ЗначВозврата];
    КонецЕсли;
//============================
Возврат знВозврат;
//============================
КонецФункции


//################## PARSER  ################################

&НаСервере
Функция Парсер(Текст,Символ,НомерВхода) Экспорт
НомерВхода=НомерВхода-1;
КоличПовтСимвола = СтрЧислоВхождений(Текст, Символ);
НомСимвПовтора = Число((НомерВходаСимвола(Текст, Символ, НомерВхода)));
If КоличПовтСимвола = 0 Then
    strPart = Текст;
ElsIf КоличПовтСимвола = НомерВхода Then
    strPart = Сред(Текст, НомСимвПовтора+1);
ElsIf КоличПовтСимвола > НомерВхода Then
    strТекст = Сред(Текст, НомСимвПовтора+1);
    СимволNext = Найти(strТекст, Символ);
    strPart = Сред(Текст, НомСимвПовтора+1, СимволNext-1);
Else
    НомСимКонечногоПовтора = НомерВходаСимвола(Текст,Символ,КоличПовтСимвола);
    strPart = Сред(Текст, НомСимКонечногоПовтора+1);   //+ 1
EndIf;
Возврат strPart;
КонецФункции

&НаСервере
Функция НомерВходаСимвола(Текст,Символ,НомерВхода) Экспорт
КолРазделителя=СтрЧислоВхождений(Текст, Символ);
ТекстДлина=СтрДлина(Текст);
Count = 0;
CountSymb = 0;
SymbNum = 0;
//---------------------------
For i = 1 to ТекстДлина do
Count = Count + 1;
char = Сред(Текст, i, 1);
    If char = Символ Then
    CountSymb = CountSymb + 1;
    If CountSymb = НомерВхода Then SymbNum = Count EndIf;
    EndIf;
EndDo;
//---------------------------
Возврат SymbNum;
КонецФункции

//##########################################################


Основная, из которых именована «ТипЗнчСведения()». Та, которая имеет отношение к вопросу данной темы. А другие функции созданы в помощь к основной. Так же как и в помощь, многим другим функциям, что довольно часто было необходимо.
И все это опять-таки в помощь тем, которые как я, в свое время, искали готовое решение, что бы сэкономит время, но не нашли его.
Поэтому, вот готовое решение вопроса и тем самым экономия драгоценного времени программиста.
А что касается «кустарщины» то тут, если честно даже не знаю, справедливо ли это в адрес этой простой функции с именем на пример: «ТипЗнчСведения(<Значение>,<ПараметрВозврата>)». Ибо, до ее написания, когда столкнулся с той самой другой выше указанной уже системной функцией, откровенно говоря, уже было, не до таких вопросов. Так как, сама та самая системная функция и отбила охоту вообще об этом даже думать.
Так что не обессудьте.
Ладно!
Удобного юза!

Gigi Подменю пользователя
сообщение 21.10.19, 15:40
Сообщение #2

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

P.S.
Да еще ...Малое дополнения ... Хотя это не большой косяк но все-таки..
Там в функции «ТипЗнчСведения(<Значение>,<ПараметрВозврата>)», в одном месте присутствуют не нужные строки, которые нужно удалить.
Вот эти:
    МетаданныеГруппа=ТипГруппа;
    МетаданныеИмя=ТипГруппа;
    МетаДанныеПолноеИмя=ТипГруппа;

В принципе в случае с примитивными типами данных, по этим параметрам лучше если возвращаемое значение будет и вовсе Неопределено!
Думаю так правильнее!
Ладно. Еще раз удобного юза!

pablo Подменю пользователя
сообщение 22.10.19, 8:51
Сообщение #3

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

То есть вместо быстрой типовой функции Вы предлагаете использовать своего "монстра" из XML, который возвращает текстовые поля? По Вашему, скорость выполнения кода и объем пересылаемых данных - пустой звук, раз Вы так легко ими жертвуете?
+ по-прежнему предлагаете код, содержащий ссылки на Ваши "эксклюзивы" без исходников?


Signature
Правильно поставленный вопрос содержит до 90% ответа.

Спасибо сказали: Gigi,

Gigi Подменю пользователя
сообщение 22.10.19, 9:33
Сообщение #4

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Цитата(pablo @ 22.10.19, 8:51) *
То есть вместо быстрой типовой функции Вы предлагаете использовать своего "монстра" из XML, который возвращает текстовые поля? По Вашему, скорость выполнения кода и объем пересылаемых данных - пустой звук, раз Вы так легко ими жертвуете?
+ по-прежнему предлагаете код, содержащий ссылки на Ваши "эксклюзивы" без исходников?

СОВЕРШЕННО ВЕРНО! СОГЛАСЕН СОГЛАСЕН и еще раз согласен!
Да точно это минус.

Вы думаете я об этом не думал и не знал? Но не знаю ... блин ... я просто говорил что не претендую на 100% правоту.
А затронуты Вами вопрос ОЧЕНЬ ВАЖНЫЙ ... Просто архи важный ... Но об этом надо подумать.
Поэтому в дополнение к сказанному отмечу, что если мне нужно на пример, понять относиться ли полученное значение конкретным то естественно тут я использовал бы системные инструменты 1С.
На пример вот в таком всем до боли известном виде:
Если ТипЗнч(ТекОбъект) = Тип("СправочникСсылка.ИмяСправочника") Тогда КонецЕсли;

И тут я точно не пользовался бы своей функцией ... тормозной .. и естественно не делал бы так:
ТипЗнчСведения(ТекОбъект,"Тип")="СправочникСсылка.ИмяСправочника"

Это было бы очень не резонным.

Но с другой стороны иногда мне просто нужно знать сведения о том или ином значении. И знать как можно больше. Т.е. знать по максимуму все что можно про значение, настолько это возможно.
И это с любой точки зрения. Например по этому конкретному объекту:
Цитата
"СправочникСсылка.ИмяСправочника"

меня иногда не интересует что с лева от точки. а интересует только то что справа. А иногда и вовсе и то и другое. А только нужно часть того что справа. Т.е. является ли на пример значение ссылкой или это сам объект. Вот что.
И иногда в таких случаях скорость выполнения задачи не сильно важный. Ибо бывают одноразовое действие.
Хотя и все это, конечно же не оправдание ... функция должна годиться для любого случая. Т.е. не только для разового использования но и для использования в цикле.
И об этом надо подумать.
Согласен!

Vofka Подменю пользователя
сообщение 22.10.19, 9:34
Сообщение #5

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Gigi, а в каком случае имеет смысл использовать вашу функцию?

Спасибо сказали: Gigi,

Gigi Подменю пользователя
сообщение 22.10.19, 9:55
Сообщение #6

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Vofka @ Сегодня, 9:34 * ,
Цитата(Vofka @ 22.10.19, 9:34) *
а в каком случае имеет смысл использовать вашу функцию?

Хороший вопрос!
Не помню почему это было нужно. Но раз не поленился то думаю что было нужно.
Хотя стоп... в последний раз эта функция понадобилась и ссылку на экземпляр где ее использовал я даже давал на этом сайте.
Она мне понадобилась знаете в какой теме сайта?
Вот в этой
Программное создание кнопки для всех документов в формах объекта
Хотя сама тема имела косвенное отношение к экземпляру. А цель была в том, что бы записать параметры авто-заполнения под IP.

Но если поконкретнее то представьте табличную часть справочника, наименование которого 'это всегда IP пользователя.
И в этой табличной части есть реквизит с именем: "ТипГруппа" и есть другие реквизиты: "ЗначениеСсылка" (Тип-ЛюбаяСсылка), "ЗначениеСтрока"(Тип-Строка), "ЗначениеЧисло"(Тип-Число) и т.д.
И вот когда пользователь определяет поля авто-заполнения и нажимает на соответствующую кнопку то тут важно знать не конкретный объект метаданных а только группу. Например Ссылка или примитивный тип.
Вот где. В последний раз использовал.

Сообщение отредактировал Vofka - 22.10.19, 9:54

Vofka Подменю пользователя
сообщение 22.10.19, 9:56
Сообщение #7

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Gigi, честное слово, у меня нету сил перечитывать и вникать во все написанное в той теме. Но интересно было бы увидеть короткий пример, где ваша функция применима.

Спасибо сказали: Gigi,

Gigi Подменю пользователя
сообщение 22.10.19, 10:42
Сообщение #8

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

И кроме того, не знаю правильно ли рассуждаю, но нужно это или нет это один вопрос. А на мой взгляд правда в том, что про полученное значение нужно знать ВСЕ!
Нужно это или нет, в любом случае чем больше информации о значении тем лучше.
Это я опять про пример робота который приводил на этом сайте в другой теме. Где говорил о модели №1. Но не сказал про модель №2.
Так вот, модель 1 определяет только наименование овоща, и ничего кроме этого.
Но когда представили модель №2 тут уже было совсем по другому.
Он определяет и наименование и группу фрукт или овощ и корнеплод или нет ... короче все про то что лежит на сканере. Даже химичесикй состав и еще и наличие нитратов. Все по максимуму.
Ну сами подумайте какой робот был бы круче? Модель №1 или №2?
И какая разница где это понадобиться.
Понадобиться! Не переживайте за это! Жизнь сложна и многообразна! Так что, еще как будет необходимо!

За что я уважаю этот сайт и людей тут ... за его демократичность и умение понять разные мнения...

Цитата(Gigi @ 22.10.19, 10:12) *
честное слово, у меня нету сил перечитывать и вникать во все написанное в той теме. Но интересно было бы увидеть короткий пример, где ваша функция применима.

Я Вас понимаю... у меня еще хуже поверьте... но ладно приведу ... постараюсь коротко и ясно.


Gigi @ Сегодня, 10:16 * ,
// ЭТО ФРАГМЕНТ КОДА ЗАПИСИ В СПРАВОЧНИК ПАРАМЕТРОВ АВТО-ЗАПОЛНЕНИЯ.
// стрРеквЗнач - это структура выбранных пользователем реквизитов и значений авто-заполнения
Для Каждого Элемент Из стрРеквЗнач Цикл
Реквизит=Элемент.Ключ;    
Значение=Элемент.Значение;    
//---------------------------
ТЧ_Сторка=ОбъектЗаписи.AutoFill_Данные.Добавить(); //AutoFill_Данные это табличная часть справочника.
ТЧ_Сторка.ID=знID;
ТЧ_Сторка.РеквизитТипГруппа=ТипЗнчСведения(Значение,"Группа"); //ВОТ ПРИМЕР ИСПОЛЬЗОВАНИЯ
ТЧ_Сторка.Реквизит=Реквизит;
ТЧ_Сторка["Значение"+ТЧ_Сторка.РеквизитТипГруппа]=Значение; //Сообщить(Строка(Реквизит)+" - "+Строка(Значение));
КонецЦикла;

Короче не знаю ... в данном конкретном случае по значению было необходимо знать только группу. Т.е. то, значение ссылка или примитивный тип.
И это было необходимо что бы вообще определить куда это значение авто-заполнения вообще записывать. В какой реквизит табличной части.
В реквизит с типом-"ЛюбаяСсылка", с типом-"Строка", или "Число". Вот для чего.
Короче ладно! Вижу что устали все ... и я тоже в том числе.
И у самого тоже
Цитата(Gigi @ 22.10.19, 10:16) *
нету сил

Гуу... и настроения тоже ... просто отвлекаю свое внимание что бы не слететь с катушек. И с ума тоже ...И что бы не застрелится.

Ладно! Всем большое спасибо уважаемые!
У меня все!

Gigi Подменю пользователя
сообщение 23.10.19, 13:28
Сообщение #9

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

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С была допущена одна логическая ошибка в группировке типов данных. Хотя, если это конечно вообще можно назвать «логической ошибкой». Думаю, что, скорее всего, нет.
Но не знаю, с другой стороны, думаю это все-таки не ошибка, а это скорее попросту говоря, небрежная группировка типов данных. Вот что.
Как я думаю, именно по этой причине системная функция «ТипЗнч()», и получилась такой немощной.
Но ладно, это может быть всего лишь мои предположения. И вообще вопрос другой, уже новой темы. Которую, может быть создам и изложу подробно, но коротко. И если решу создать такую тему то, интересно будет услышать мнение по данному вопросу.
Ладно!
Удобного юза!

pablo Подменю пользователя
сообщение 23.10.19, 14:01
Сообщение #10

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

2 замечания.1. Замечание про пересылаемые данные Вы таки проигнорировали. ТипЗнч() отрабатывает на клиенте, а у Вас данные на сервер и обратно гоняются.2. Плюс вы на сервер данные формы (контекста) пересылаете.



Signature
Правильно поставленный вопрос содержит до 90% ответа.

Спасибо сказали: Gigi,

Gigi Подменю пользователя
сообщение 23.10.19, 14:10
Сообщение #11

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Цитата(pablo @ 23.10.19, 14:01) *
2 замечания.1. Замечание про пересылаемые данные Вы таки проигнорировали. ТипЗнч() отрабатывает на клиенте, а у Вас данные на сервер и обратно гоняются.2. Плюс вы на сервер данные формы (контекста) пересылаете.

Ну да ... гуу .. короче опять не учет... хотя я думал об этом. Подобную функцию нужно писать в двух вариантах для вызова на сервере и на клиенте. Ибо сама ТипЗна() насколько знаю работает везде.
Блиин ... короче друзья ... ну вот видите ... сколько бы я не старался все равно кое где получается "кустарно".
Конечно если система имела функционал сведений то это было бы сто раз лучше согласен.
Но ладно .. думаю сгодиться для вызова только на сервере.
А с клиента решил вызывать функцию чисто ради теста ...

pablo Подменю пользователя
сообщение 23.10.19, 14:12
Сообщение #12

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

Я Вам намекал на другие директивы компилятора...


Signature
Правильно поставленный вопрос содержит до 90% ответа.

Gigi Подменю пользователя
сообщение 23.10.19, 14:18
Сообщение #13

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

pablo @ Сегодня, 14:12 * ,
Ну я мог приспособить для клиента, но в таком случае
СведенияМетаДанныеПолноеИмя=Значение.Метаданные().ПолноеИмя();

Как с этой частью? Которая только на сервере. Короче ... значит все равно не оптимально... далеко..
Ну ладно ... я говорил, что не претендую на 100%-ую правоту.
И если что можно будет еще видоизменить.
А пока на этом все!

pablo Подменю пользователя
сообщение 23.10.19, 14:29
Сообщение #14

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

Gigi @ Сегодня, 14:18 * ,

Почитайте про &НаСервереБезКонтекста

Сообщение отредактировал pablo - 23.10.19, 14:30


Signature
Правильно поставленный вопрос содержит до 90% ответа.

Спасибо сказали: Gigi,

Gigi Подменю пользователя
сообщение 23.10.19, 17:14
Сообщение #15

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

pablo @ Сегодня, 14:29 * ,
Цитата(pablo @ 23.10.19, 14:29) *
Почитайте про &НаСервереБезКонтекста

Спасибо … почитаю.
Даа.. Вы правы … То как сделал, все равно не то ….
Вы знаете, для чего выставил решение?
Для того, что бы проверить ее на критику. smile.gif) И то выдержит ли она ее? smile.gif)
Но как вижу не очень … и это в вопросе скорости выполнения … Поэтому по поводу:
Цитата(Gigi @ 23.10.19, 13:28) *
Все-таки решил довершить тему вопроса финальным вариантом решения.

Да какой там «финальный»… Да уж.. Решил взять, и видишь ли, одним махом решить все вопросы. Все не так просто как думалось.
Цитата(Gigi @ 23.10.19, 13:28) *
Поэтому думаю, разница в скорости будет не существенная.

Тоже не правда.
Гуу … Короче как вижу все равно не то…. И не очень годится.
И тут, нужно признать, опыт всего 2 года и вообще не глубокое знание клиент-серверной архитектуры, все-таки дает о себе знать. Тем более, для решения подобных задач. Но я просто исходил из того что на деле вроде бы работает. Но видимо, этого мало. Ибо главное скорость выполнения. А для решения этого вопроса нужно как следует знать клиент-серверную архитектуру. С чем, нужно признать, что плохо знаком. Ибо был занят только кодовой стороной языка 1С. А теории маловато.
Ладно! Нужно будет детально с этим разобраться. А уже ПОСЛЕ ЭТОГО доработать и изменить.
И я РЕШУ ЭТОТ ВОПРОС!
РЕШУ!
Раз начал то, не успокоюсь пока это не сделаю.
Правда точно не знаю, выставлю ли решение на сайте.
И, тут думаю, не существует такого понятия как «Невозможно»!
И кроме того, я шас вообще даже не думаю зачем это нужно и где имеет, смыл применять подобную функцию.
Я об это даже НЕ ДУМАЮ!
Я знаю только одно.
Про значение .. при чем ЛЮБОЕ ЗНАЧЕНИЕ … нужно знать ВСЕ! И это, на мой взгляд, АКСИОМА!
Вот что…
Кроме того, на счет системы 1С у меня есть вопросы по типам данных. Вопросы связанны с тем, почему разработчики все типы данных выставили в один столбец, без разбору. И не сгруппировали их. Ведь есть примитивные типы, а есть сложные. И, на мой взгляд, то как сделали это выглядит чуть небрежно... то, что разработчики как следует, это не проработали. Хотя я вовсе не утверждаю что это недоработка. Мне просто интересно услышать мнение по этому поводу.
Если конечно вообще решу создать такую тему на сайте то, короче есть вопросы.
Гууу… Ладно! Всем спасибо!
В особенности за вполне справедливые замечания.
Пока!

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 14:39
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!