Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема очень интересные приколы с типизацией (число прочтений - 1481 )
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
очень интересные приколы с типизацией
17. Июля 2012 :: 15:06
Печать  
Есть табличное поле на запросе.
Данные собираются из своей таблички, где одно из полей - идОбъект13. Туда может попасть как документ, так и справочник (собственно, с т.з. хранения данных вопросов никаких - для ссылочных типов ид13 вполне себе уникально).

Далее, начинаются танцы с бубном:
(для всех полей запроса, есно, в ТП по необходимости создаются колонки)

Вариант 1)
Постащику данных скармливаем запрос:
Код
Выбрать все
SELECT
   идОбъект13 as [Док $Документ],
   идОбъект13 as [Спр $Справочник]
FROM
   ... 


Поведение более-мене логичное:
Если первой (в визуальной форме) будет колонка Док - представление в ОБЕИХ будет как при попытке отрезолвить ссылку как документ (т.е. документ или "объект не найден").
Если первой будет колонка Спр - представление в ОБЕИХ колонках будет как для справочника (т.е. или резолв ссылки, или "объект не найден").


Вариант 2)
Теперь добавляем немного извращений - поставщику запрос переписываем чуть в другом виде:
Код
Выбрать все
SELECT
   Жур.идДок13 as [Док $Документ],
   идОбъект13 as [Спр $Справочник]
FROM
   ...
   LEFT JOIN ЖурналДокументов жур on жур.ИдДок13 = идОбъект13 


(ЖурналДокументов - вьюха, построенная на _1SJourn; идДок13 - оно самое и есть)
И тут начинаются чудеса чудесатые:
Если первая колонка - Док, то представление идет замечательно: и справочники резолвятся как справочники, и документы - как документы (причем, в обеих колонках).
А вот если наоборот - то все становится очень весело (см скрин).
Пустые строки в колонке Док объяснимы - после джойна там оказались NULLы. Но почему он резолвит ровно один документ (один и тот же - стабильно).
  

Clip.png ( 3 KB | Загрузки )
Clip.png
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: очень интересные приколы с типизацией
Ответ #1 - 17. Июля 2012 :: 16:12
Печать  
проще надо быть.. достроил бы до неопределенного типа и типизировал бы как $Неопределенный..
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: очень интересные приколы с типизацией
Ответ #2 - 18. Июля 2012 :: 06:08
Печать  
Да на это случайно вылезли - обработка сугубо служебная, чисто посмотреть в процессе реализации БП, что же пишется в табличку.

Потом даже практически разобрались, в чем дело.

В первом случае:
Табличное поле выводит 1 ячейку. 1Ска резолвит ссылку, кэширует представление объекта.
Табличное поле выводит 2 ячейку. 1Ска смотрит - "ага, этот объект уже есть в кэше" - вытаскивает представление из кэша.
Соответственно, представление формируется согласно типизации первой колонки.

Во втором случае:
Если первая колонка документ:
ТП выводит 1 ячейку: это оказался идшник справочника - значит вместо ид13 1Ска получила вообще НУЛЛ - резолвить нечего, проехали.
ТП выводит 2 ячейку - 1Ска смотрит в кэш - а в кэше этого объекта нет - резолвит как справочник - все ок.

Единственно непонятно - почему во втором случае один документ резолвился нормально (причем, всегда один и тот же).


собственно, это так - размышления на тему внутреннего хранения данных 1Ской, кэширования и всего такого.

Есть еще один прикол - если в типизацию "Документ.Вид" подсунуть IDDoc документа другого вида:
Представление ссылки будет правильное, а вот сам объект будет структуры от документа Вид.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: очень интересные приколы с типизацией
Ответ #3 - 18. Июля 2012 :: 09:06
Печать  
trad где-то писал по-поводу типизации и как она в 1cpp сделана.
И по-поводу приведения её к первому типу тоже
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать