Повторное использование возвращаемых значений функций общих модулей 1С 8.2.19.8 #718329


#0 by Darklight
Хотел воспользоваться встроенным кешированием значений функций. Но наткнулся на следующую проблему. Оказалось, что в качестве входящих параметров этих функций можно передавать значения только ПРИМИТИВНЫХ типов, ССЫЛОЧНЫЕ типы и структуры их содержащие. Ограничения, конечно очень жёсткие. Но... как оказалось они даже жёстче чем кажется. Во-первых, оказалось, что Тип "Уникальный идентификатор" не приравнивается ни к ПРИМИТИВНЫМ типам, ни к ССЫЛОЧНЫМ. Печально, особенно учитывая, что фактически это набор байтов (строка), как и обычная ссылка. И параметры этого типа в такие функции передавать нельзя (ну ладно - обойти можно просто передав их в виде строки). Ну что поделаешь :( тип "Уникальный идентификатор" действительно не относится в справке к ПРИМИТИВНЫМ (хотя мог бы), ни, видимо, к ссылочным тоже не относится. Во-вторых, оказалось, что нельзя передавать и тип "Объект метаданных", который так же не относится к примитивным типам. Это более печально. Но, в общем-то, тоже не критично (хотя удобно и могло бы повысить скорость работы некоторых алгоритмов; объекты "Объект метаданных" вообще константный, и прекрасно сериализуемый). В-третьих, при попытке передать в качесвте параметра в такую функцию значения типа "ТИП" система так же ругнулся, что он не ПРИМИТИВНЫЙ. Но тут я "выпал в осадок", и специально открыв в справке раздел о ПРИМИТИВНЫХ типах прочитал, что тип "ТИП" является примитивным. Что за фигня? Это не дочёт релиза платформы, может он уже исправлен в более поздних (включая 8.3)? Кто что подскажет, как лучше всего обойти это "ограничение". "Тип" очень нужен для передачи в кешированную функцию. Пока напрашивается только использование метода "ЗначениеВСтрокуВнутр", для конвертации типа "ТИП" в тип "Строка" и передачи уже в таком виде. Но, может, есть более красивое, а главное, производительное решение? Или не стоит заморачиваться по поводу производительности - и использование "ЗначениеВСтрокуВнутр" (в паре с "ЗначениеИзСтрокиВнутр") будет достаточно производительным решением Да и вообще вопрос. Стоит ли вообще заморачиваться с модулями, использующими "Повторное использование возвращаемых значений", или лучше строить кеширование по классической схеме (в параметрах сеанса и хранилище значений), или с использованием более новой методики через функцию "ПоместитьВоВременноеХранилище"?
#1 by XLife
плач ярославны
#2 by Ёпрст
передавай массив или структуру или соответствие.. в них пихай че хочешь..
#3 by H A D G E H O G s
Набор бреда.
#4 by Широкий
Если не прокатило на парметре - на массиве тоже не прокатит
#5 by H A D G E H O G s
Передавайте значение типа, как строку.
#6 by H A D G E H O G s
Вот как то так:
#7 by Зойч
1с плевать на тебя и твои трудности хотело с высокой колокольни. Жри что дают. И прыгай от радости
#8 by H A D G E H O G s
Ты какой-то злой.
#9 by Darklight
Почему план Ярославны Почему набор бреда. Написал всё как есть, может кому ещё эта информация будет полезна и съэкономит ему время и нервы; и спросил достаточно конкретно об оптимальной методике решения, или, возможном, отсутствии данный проблемы в более поздних релизах; указал на неточность в реализации данного механизма в платформе. Что не не понравилось в сабже? Приведён аналог использования "ЗначениеВСтрокуВнутр", указанного в сабже. У него есть преимущество? Пожалуйста не грубите! А жрать гуано можно и по разному. Давясь набивая рот, или аккуратно нарезая на ломтики, сдобривая специями и забывая, что это всего лишь гуано.
#10 by Darklight
*плач.. Ярославны
#11 by Darklight
Да, а если у меня уже есть значение типа "Тип", как тогда?
#12 by Darklight
Поспешил, вопрос снят - потому что это можно получить так: А когда можент возникнуть неопределено (не ну в справке я прочитал, но реально на практике - когда)?
#13 by H A D G E H O G s
То, что невозможно сериализовать в XDTO, например, comsafearray
#14 by Зойч
всегда можно передать ЗначениеВСтрокуВнутр
#15 by Torquader
Передать можно всё, что угодно - можно, например, и ссылки на объекты метаданных строками передавать. Другое дело, зачем это нужно ?
#16 by Darklight
Нужно - значит нужно. Метаданные обрабатываются внутри кешированной функции (совмещено с обращением к данным из ИБ) - поэтому результат и кешируется. Вместо метаданных так же может передаваться просто "ТИП" (тогда метаданные уже получаются внутри функции по этому типу). Это затратные по времени операции с фикиспованным возвращаемым значением (в соответствии с переданными параметрами), которое далее часто используется повторно. Кешированные функции подходили почти идеально.
#17 by dot101
учитывайте, что результат кэширования недолговечен. Хотя и указано, что на время сеанса, а по факту на несколько минут, не помню уже точно.
#18 by Darklight
Да, я уже в курсе - печально это :( Посмотрю как реально будет работать - поэтому и спрашиваю, как люди реально на практике сейчас решают подобные задачи (из сабжа).
#19 by Torquader
Если результат где-то сохранить самому, то не нужно будет заниматься изучением кешируемых функций.
#20 by Darklight
Да, но 1. Для моей задачи кешируемые функции были как раз очень удобны 2. Хотелось изучить тонкости работы с ними, хотя бы на будущее;) 3. Собственно в сабже я и спросил, об альтернативах, которые имеют популярное применение на текущий момент
#21 by Darklight
Алгоритм обратного преобразования типа:
#22 by Darklight
Что-то какая-то не та html-строка вставилась в посте, должна быть вот эта ТипXDTO = Новый ТипДанныхXML(ТипОбъекта,";);
#23 by Darklight
Уже лучше - но всё равно перед закрывающей скобкой почему-то встала ";"
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С