|
Повторное использование возвращаемых значений функций общих модулей 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)Уже лучше - но всё равно перед закрывающей скобкой почему-то встала ";"
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |