Имя: Пароль:
1C
 
Повторное использование возвращаемых значений функций общих модулей 1С 8.2.19.8
,
0 Darklight
 
27.08.14
12:01
Хотел воспользоваться встроенным кешированием значений функций. Но наткнулся на следующую проблему. Оказалось, что в качестве входящих параметров этих функций можно передавать значения только ПРИМИТИВНЫХ типов, ССЫЛОЧНЫЕ типы и структуры их содержащие. Ограничения, конечно очень жёсткие. Но... как оказалось они даже жёстче чем кажется.

Во-первых, оказалось, что Тип "Уникальный идентификатор" не приравнивается ни к ПРИМИТИВНЫМ типам, ни к ССЫЛОЧНЫМ. Печально, особенно учитывая, что фактически это набор байтов (строка), как и обычная ссылка. И параметры этого типа в такие функции передавать нельзя (ну ладно - обойти можно просто передав их в виде строки). Ну что поделаешь :( тип "Уникальный идентификатор" действительно не относится в справке к ПРИМИТИВНЫМ (хотя мог бы), ни, видимо, к ссылочным тоже не относится.

Во-вторых, оказалось, что нельзя передавать и тип "Объект метаданных", который так же не относится к примитивным типам. Это более печально. Но, в общем-то, тоже не критично (хотя удобно и могло бы повысить скорость работы некоторых алгоритмов; объекты "Объект метаданных" вообще константный, и прекрасно сериализуемый).

В-третьих, при попытке передать в качесвте параметра в такую функцию значения типа "ТИП" система так же ругнулся, что он не ПРИМИТИВНЫЙ. Но тут я "выпал в осадок", и специально открыв в справке раздел о ПРИМИТИВНЫХ типах прочитал, что тип "ТИП" является примитивным. Что за фигня? Это не дочёт релиза платформы, может он уже исправлен в более поздних (включая 8.3)?

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

Да и вообще вопрос. Стоит ли вообще заморачиваться с модулями, использующими "Повторное использование возвращаемых значений", или лучше строить кеширование по классической схеме (в параметрах сеанса и хранилище значений), или с использованием более новой методики через функцию "ПоместитьВоВременноеХранилище"?
1 XLife
 
27.08.14
12:03
плач ярославны
2 Ёпрст
 
27.08.14
12:06
передавай массив или структуру или соответствие.. в них пихай че хочешь..
3 H A D G E H O G s
 
27.08.14
12:07
(0) Набор бреда.
4 Широкий
 
27.08.14
12:07
(2)Если не прокатило на парметре - на массиве тоже не прокатит
5 H A D G E H O G s
 
27.08.14
12:10
(0) Передавайте значение типа, как строку.
6 H A D G E H O G s
 
27.08.14
12:13
Вот как то так:

    ИмяТипа="";
    ТипXDTO=СериализаторXDTO.XMLТипЗнч(Значение);
    Если ТипXDTO<>Неопределено Тогда
        ИмяТипа=ТипXDTO.ИмяТипа;
    КонецЕсли;
7 Зойч
 
27.08.14
12:18
1с плевать на тебя и твои трудности хотело с высокой колокольни.
Жри что дают. И прыгай от радости
8 H A D G E H O G s
 
27.08.14
12:24
(7) Ты какой-то злой.
9 Darklight
 
27.08.14
12:26
(1)Почему план Ярославны
(3) Почему набор бреда.
Написал всё как есть, может кому ещё эта информация будет полезна и съэкономит ему время и нервы; и спросил достаточно конкретно об оптимальной методике решения, или, возможном, отсутствии данный проблемы в более поздних релизах; указал на неточность в реализации данного механизма в платформе. Что не не понравилось в сабже?
(6)Приведён аналог использования "ЗначениеВСтрокуВнутр", указанного в сабже. У него есть преимущество?
(7)Пожалуйста не грубите! А жрать гуано можно и по разному. Давясь набивая рот, или аккуратно нарезая на ломтики, сдобривая специями и забывая, что это всего лишь гуано.
10 Darklight
 
27.08.14
12:27
(9)*плач.. Ярославны
11 Darklight
 
27.08.14
12:29
(6)Да, а если у меня уже есть значение типа "Тип", как тогда?
12 Darklight
 
27.08.14
12:32
(11)Поспешил, вопрос снят - потому что это можно получить так:

ТипXDTO = СериализаторXDTO.XMLТип(Некоторый_Тип);
Если ТипXDTO<>Неопределено Тогда
        ИмяТипа=ТипXDTO.ИмяТипа;
КонецЕсли;

А когда можент возникнуть неопределено (не ну в справке я прочитал, но реально на практике - когда)?
13 H A D G E H O G s
 
27.08.14
12:44
(12) То, что невозможно сериализовать в XDTO, например, comsafearray
14 Зойч
 
27.08.14
12:45
(9) всегда можно передать ЗначениеВСтрокуВнутр()
15 Torquader
 
27.08.14
12:46
(14) Передать можно всё, что угодно - можно, например, и ссылки на объекты метаданных строками передавать.
Другое дело, зачем это нужно ?
16 Darklight
 
27.08.14
12:52
(15)Нужно - значит нужно. Метаданные обрабатываются внутри кешированной функции (совмещено с обращением к данным из ИБ) - поэтому результат и кешируется. Вместо метаданных так же может передаваться просто "ТИП" (тогда метаданные уже получаются внутри функции по этому типу). Это затратные по времени операции с фикиспованным возвращаемым значением (в соответствии с переданными параметрами), которое далее часто используется повторно. Кешированные функции подходили почти идеально.
17 dot101
 
27.08.14
13:32
(0) учитывайте, что результат кэширования недолговечен. Хотя и указано, что на время сеанса, а по факту на несколько минут, не помню уже точно.
18 Darklight
 
27.08.14
13:47
(17)Да, я уже в курсе - печально это :(
Посмотрю как реально будет работать - поэтому и спрашиваю, как люди реально на практике сейчас решают подобные задачи (из сабжа).
19 Torquader
 
27.08.14
13:50
(18) Если результат где-то сохранить самому, то не нужно будет заниматься изучением кешируемых функций.
20 Darklight
 
27.08.14
14:18
(19)Да, но
1. Для моей задачи кешируемые функции были как раз очень удобны
2. Хотелось изучить тонкости работы с ними, хотя бы на будущее;)
3. Собственно в сабже я и спросил, об альтернативах, которые имеют популярное применение на текущий момент
21 Darklight
 
27.08.14
15:50
(12) Алгоритм обратного преобразования типа:
ТипXDTO = Новый ТипДанныхXML(ИмяТипа,"http://v8.1c.ru/8.1/data/enterprise/current-config";);
    ПолученныйТип = СериализаторXDTO.ИзXMLТипа(ТипXDTO);
    Если не ПолученныйТип =неопределено Тогда
            //Обработать полученный тип
    КонецЕсли;
22 Darklight
 
27.08.14
15:53
(21)Что-то какая-то не та html-строка вставилась в посте, должна быть вот эта
ТипXDTO = Новый ТипДанныхXML(ТипОбъекта,"http://v8.1c.ru/8.1/data/enterprise/current-config";);
23 Darklight
 
27.08.14
15:54
(22)Уже лучше - но всё равно перед закрывающей скобкой почему-то встала ";"