Имя: Пароль:
1C
 
Разница между объектом и ссылкой
,
0 Kifsif
 
18.11.14
00:17
Возьмем ДокументОбъект и ДокументСсылка. Будем, например, смотреть на флаг ОтражатьВБухгалтерскомУчете. Событие - ПередЗаписью.
Я завел две переменные ОбъектОтражатьВБухгалтерскомУчете и СсылкаОтражатьВБухгалтерскомУчете. И вычислил их значения, остановившись на точке останова в обработчике события.

Нарисовал себе табличку:

1. Документ уже проведен. В нем взведен флаг отразить в БУ.
ОбъектОтражатьВБухгалтерскомУчете - Истина.
СсылкаОтражатьВБухгалтерскомУчете - Истина.

2. Документ был проведен, в нем БЫЛ взведены флаг отразить в БУ. Сняли флаг БУ.
ОбъектОтражатьВБухгалтерскомУчете - Ложь.
СсылкаОтражатьВБухгалтерскомУчете - Истина.

3. Документ был проведен, в нем не был взведен флаг отразить в БУ.
ОбъектОтражатьВБухгалтерскомУчете - Ложь.
СсылкаОтражатьВБухгалтерскомУчете - Ложь.

4. Новый документ. Накинута галка отразить в БУ.
ОбъектОтражатьВБухгалтерскомУчете - Истина.
СсылкаОтражатьВБухгалтерскомУчете - Ложь.

5. Новый документ. Нет галки отразить в БУ.
ОбъектОтражатьВБухгалтерскомУчете - Ложь.
СсылкаОтражатьВБухгалтерскомУчете - Ложь.

Вот сижу и смотрю на эту табличку. И не могу понять 2 и 4-й случаи. Был бы очень признателен за комментарий.
59 Chai Nic
 
18.11.14
10:48
Когда начинают объектную модель 1с натягивать на ООП - ни к чему хорошему это привести не может.
60 МишельЛагранж
 
18.11.14
10:49
(57) в 1С не совсем так ))
61 МишельЛагранж
 
18.11.14
10:55
(58)>>Невозможно два Объекта по одной Ссылке получить?
- невозможно
>>Т.е. два экземпляра класса по одному идентификатору в базе? (это если нормальным языком).
- это не нормальный язык )) Это непонимание, что такое "класс", "объект" и "ссылка" - как в ООП, так и в 1С. И что первично к чему ))
>>Конструктор формирует новый экземпляр класса(Объект)
- конструктор в 1С - это команда, которая и запускает скрипт-класс. На выходе - не "экзепляр класса", а "объект 1С", т.е. "собранный" из кусочков "объект 1С". assembling руками "робота"-скрипта.
>>получая в качестве параметра идентификатор в базе(Ссылку).
- ссылка не параметр, а скорей свойство. Параметр можно менять в широких пределах, чтобы получить разные реакции "объекта", а ссылку - только сгенерировать на точно такую же ссылку, т.е. ни для объекта, ни, тем более, для программиста - ничего в этом случае не меняется ))
62 Classic
 
18.11.14
10:58
(61)
"выхлоп", "скрипт класса", "отделение объекта" - вот это нормальный язык :)
63 МишельЛагранж
 
18.11.14
11:01
(59)>>Когда начинают объектную модель 1с натягивать на ООП
- гораздо чаще путают их между собой. А 1С делает вид, что ничего не происходит, называя каждый раз заново собираемый платформой монолитный кусок (объекты Документ и Справочник - не потомки "одного класса", как может показаться, а совершенно разные по происхождению) - "объектом" ))
64 МишельЛагранж
 
18.11.14
11:03
(62)>>"выхлоп", "скрипт класса", "отделение объекта" - вот это нормальный язык :)
- у 1С нет своей терминологии, а где есть - она крайне нечеткая.
Поэтому это наиболее близкие, в моем понимании, термины, описывающие взаимодействие сущностей внутри 1С.
Но это взаимодействие - точно не ООП ))
Поэтому и термины ООП к 1С не должны применяться, либо - с гигансткими оговорками, о чем, собственно (об этих оговорках), и вся текущая тема.
65 Chai Nic
 
18.11.14
11:03
(63) Ну, формально они "потомки" одного абстрактного базового класса "ссылочный объект" )
66 Chai Nic
 
18.11.14
11:06
(64) Слово "класс" в применении к прикладным объектом 1с следует признать нецензурным
67 Fragster
 
гуру
18.11.14
11:11
привет программистам!
68 Torquader
 
18.11.14
11:11
Что такое "ссылка" - это некоторый специальный объект в системе, в котором хранится информация о том, как найти объект в базе данных и какой объект найти.
Если мы у ссылки запрашиваем какие-то данные объекта, то система считывает данные из базы или из кеша и отдаёт их нам, но реально в самой ссылке они не хранятся.

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

Что касается ООП в 1С, то есть только иллюзия ООП, так как есть общие свойства у всех объектов, а также у объектов одного типа (документы, справочники, регистры).
Но реально никакого наследования нет, каждый объект описывается самостоятельно.
Программист в конфигураторе может создать объект только определённого типа и никак иначе.
69 МишельЛагранж
 
18.11.14
11:15
(65)>>Ну, формально они "потомки" одного абстрактного базового класса "ссылочный объект" )
- нет.
То ли у программистов 1С такой уровень, то ли лень было делать - но кажущиеся однтипными "объекты" - имеют, на самом деле, совершенно разные свойства и методы работу. Зачастую даже одинаково называющиеся (свойства или методы), но работающие по-разному (и это совершенно не замотивированно каким-либо "назначением" объекта и чем-то подобным).
70 МишельЛагранж
 
18.11.14
11:16
(68)>>Несколько разных объектов, полученных из одной ссылки
- т.е. вы тоже сторонник теории "в 1С ссылка рождает объект"? ))
71 Chai Nic
 
18.11.14
11:17
(69) По крайней мере это было бы логично. Сначала создать базовый класс СсылочныйТип со свойством "Ссылка" и методами Записать(), Удалить(). Далее производные классы частично переопределяют эти методы и свойства, и добавляют свои.
72 МишельЛагранж
 
18.11.14
11:17
(68)>>так как есть общие свойства у всех объектов
- это далеко не так. Даже скажу прямо - это вообще не так. Подтверждение тому - весь гигантский зоопарк методов и свойств работы с разными объектами в 1С.
73 Torquader
 
18.11.14
11:18
(70) Так если есть команда "ПолучитьОбъект", то мы можем получать объект из ссылки.
Также есть команда "Ссылка", позволяющая получить из объекта ссылку.
То есть ничего удивительного в том, что из одного объекта (Ссылка) можно получить другой объект (Объект) - нет.
74 МишельЛагранж
 
18.11.14
11:21
(73)>>Так если есть команда "ПолучитьОбъект", то мы можем получать объект из ссылки
- было бы неразумно считать, что завуалированная команда "создать объект" имеет непосредственное отношение к значению того слова-команды, которая в 1С призвана создавать объект ))
75 Torquader
 
18.11.14
11:21
(71) Просто программистам 1С ООП не совсем знакомо.
Одинаковые методы могут вызывать однотипные низкоуровневые функции (например, для записи табличной части), но изначально это будут разные функции.
Собственно, в случае ООП это также будут разные функции, просто для них будет создаваться таблица виртуальных функции, чтобы разные функции одного объекта находились по одному смещению.
Так как в языке 1С все функции вызываются по наименованию, то делать виртуальные таблицы функции никто не стал - там будут таблицы соответствия между наименованием и адресом функции.
76 МишельЛагранж
 
18.11.14
11:22
(71)>>Сначала создать базовый класс СсылочныйТип со свойством "Ссылка" и методами Записать(), Удалить(). Далее производные классы частично переопределяют эти методы и свойства, и добавляют свои.
- это вообще не так, хотя бы потому, что ваш с Torquader подразумеваемый "класс Ссылка" вообще не имеет каких-либо свойств и методов, тем более описанных вами ))
77 Torquader
 
18.11.14
11:23
(74) Нет, а что вам не нравится, есть в системе объект, называемый "ссылка" у него есть метод "ПолучитьОбъект", который возвращает объект другого типа (для системы в целом нет никакой связи между объектами "ссылка" и "объект").
78 МишельЛагранж
 
18.11.14
11:24
(77)>>есть в системе объект, называемый "ссылка" у него есть метод "ПолучитьОбъект"
- хотя бы потому, что "в системе" не существует объекта "Ссылка" ))
79 Torquader
 
18.11.14
11:24
Вообще-то, в 1С нет просто объекта "Ссылка", есть объекты "ДокументСсылка", "ДокументВидаСсылка" и т.п.
80 Torquader
 
18.11.14
11:25
А никого не удивляет, что в 1С тип - тоже объект ?
81 МишельЛагранж
 
18.11.14
11:26
(79)>> есть объекты "ДокументСсылка", "ДокументВидаСсылка"
и это тоже не объекты. Даже в интерпретации 1С ))
82 СвинТуз
 
18.11.14
11:26
>>>>Невозможно два Объекта по одной Ссылке получить?
>>- невозможно

Объект1=Ссылка.ПолучитьОбъект();
Объект2=Ссылка.ПолучитьОбъект();

Объект1.Наименование="111";
Объект2.Наименование="321";

Ругается что ли?
странно в фоксе я мог по одному курсору две формы заполнить.
83 МишельЛагранж
 
18.11.14
11:27
(80) если поймете, что в 1С вообще НЕТ никаких объектов - ни "похожих", ни "тех же самых", вам будет легче понять, что это такое, и что под этим объектным "соусом" скрывается - "объект Тип" )))
84 H A D G E H O G s
 
18.11.14
11:27
(42) Садись, два. Для Объект "ошибка 256 таблиц" возникнуть не может.
85 Torquader
 
18.11.14
11:27
(81) В общем виде - это объекты, так как у них есть свойства и методы.
86 МишельЛагранж
 
18.11.14
11:28
(82) вы два раза запустили скрипт создания объекта. Им каждому будет присвоен уникальный UUID.
Ссылка-то тут причем?
87 МишельЛагранж
 
18.11.14
11:29
(84) садись, кол ))
ошибка "256 таблиц" возникает для разъименованных на более мелкие составляющие (другие таблички, которые и переполняют лимит в 256 таблиц) в запросе для SQL "объектов" 1С.
88 Torquader
 
18.11.14
11:29
(86) Так объекты будут изначально содержать одни и те же данные из базы.
Кстати, уникальный идентификатор у них будет один и тот же.
89 H A D G E H O G s
 
18.11.14
11:30
(47) Объект может устареть, если строку таблицы, к которой он привязан, изменит другой пользователь.
90 Torquader
 
18.11.14
11:30
(89) Ссылка тоже может "устареть", если объект из базы удалили.
91 H A D G E H O G s
 
18.11.14
11:31
(90) Нет. При обращении к реквизиту ссылки 1С всегда делает запрос к базе.
92 Torquader
 
18.11.14
11:32
(91) Или кешу.
Просто, после удаления мы получим "Объект не найден", но ссылка будет ещё живая.
93 H A D G E H O G s
 
18.11.14
11:33
(92) Нет, всегда.
Если жив кеш - 1С проверяет поле _version
94 МишельЛагранж
 
18.11.14
11:33
(81) объект - как термин ООП, а другого не существует, т.к. 1С не описала, что такое "объект" в её понимании, - определяется _законченностью_, т.е. есть входные параметры, есть - выходные, и _однозначностью_ поведения, а свойства и методы - уже следствие этого.
А вот поведение - это определяют родительские по отношению к потомку-объекту классы.
95 Torquader
 
18.11.14
11:33
Все согласны, что ссылка - это "адрес" объекта в базе, а адрес, в общем случае, это тоже "объект", только определённого вида.
96 H A D G E H O G s
 
18.11.14
11:33
(87) ДокументОбъект не делает разыменования.
97 H A D G E H O G s
 
18.11.14
11:34
(95) Нет, не согласны, особенно с формулировкой Мишеля.
98 МишельЛагранж
 
18.11.14
11:34
(89) в SQL это не возможно. Для этого и существует блокировка таблиц/записей.
В файловом концепте 1С-базы - да, запросто.
99 Torquader
 
18.11.14
11:34
(94) Есть примитивные типы, а есть - объекты - ничего другого нет.
100 МишельЛагранж
 
18.11.14
11:36
(92)>>Просто, после удаления мы получим "Объект не найден", но ссылка будет ещё живая.
- ссылка в 1С не может быть и "живая", и "объект не найден" одновременно.
Т.е. даже если сделать натяжку - что "еще пока живая", и мы могли бы восстановить удаленный "объект", - но мы не можем так сделать!
101 Ник второй
 
18.11.14
11:36
(42) Что за Ссылочные продолжения?
А ошибка в 256 таблиц возникала из-за обращений по точке в составном типе.
102 Torquader
 
18.11.14
11:36
Ещё раз - ссылка - это данные напрямую из базы.
Объект - это создании копии данных из базы в памяти.
Соответственно, никто не мешает эти данные в памяти изменить.
Конечно, если существует несколько объектов, то записать мы сможем только один, но это не запрещает менять их данные без записи.
103 H A D G E H O G s
 
18.11.14
11:37
(95) "докСсылка "в Си" - это ссылка (почти указатель, но менее "опасный") на область памяти, где содержится в данный момент считанный из БД нужный объект. " в (49)

- ересь.

Хотя в (38) правильно
"ссылки 1С к ссылкам остальных языков отношения не имеют - там ссылка на область памяти (сам объект), тут - ссылка это уникальный индекс, по которому 1С ищет у себя что-то в таблицах."

Мишель Лаграндж противоречит себе в течении нескольких минут.
104 Torquader
 
18.11.14
11:37
(100) Восстановить объект - да запросто - получитьУникальныйИдентификатор, УстановитьСсылкуНового, Записать.
105 H A D G E H O G s
 
18.11.14
11:37
(98) Ты путаешь Объектные и Транзакционные блокировки.
106 МишельЛагранж
 
18.11.14
11:37
(95)>>а адрес, в общем случае, это тоже "объект"
- в 1С это просто индекс, набор символов определенного формата. Т.е. больше "данные", а никак и никакой не "объект".
107 МишельЛагранж
 
18.11.14
11:38
(103) изучите хотя бы основы Си.
108 H A D G E H O G s
 
модератор
18.11.14
11:38
(107) Понятно. Пока.
109 Torquader
 
18.11.14
11:40
(103) Ссылка обычно используется в тех языках, где работа с памятью напрямую невозможна или затруднена.
В Си ссылка используется для указания компилятору, что будет передаваться указатель, чтобы вместо засовывания копии объекта в стек туда попадала только ссылка на объект в памяти.
Соответственно, со ссылками в других языках уже это соотносится не очень.
А ссылка в 1С вообще к ссылкам не имеет никакого отношения.
110 mikeA
 
18.11.14
11:40
(19) > Четвертый случай (новый объект)
в этом случае ПередЗаписью объекта в базе ещё нет. посмотри значение Ссылка.УникальныйИдентификатор()
по ссылке получаются значения по умолчанию реквизитов объекта. для типа Булево это Ложь
поэтому СсылкаОтражатьВБухгалтерскомУчете - Ложь.
111 Torquader
 
18.11.14
11:42
Не забываем ещё, что "умная" 1С решила отличить пустую ссылку от Null и НЕОПРЕДЕЛЕНО, а также допустила возможность получения полей у пустой ссылки, которые возвращают пустые значения, а не ошибку, как должно бы было быть.
112 Рэйв
 
18.11.14
11:44
(106)В том же любимом тобой си ссылка - это тоже просто адрес в памяти. Т.е набор хексовых символов, ну и что?
113 Fragster
 
гуру
18.11.14
11:45
(111) а ничего, что NULL - отсутствие значения в целевой таблице, Неопределено - это Тип 0, а пустая ссылка - тип <> 0, ГУИД = 0? и все эти ситуации надо различать как-то.
114 Fragster
 
гуру
18.11.14
11:47
а про ошибку - это бабушка надвое сказала
115 Torquader
 
18.11.14
11:47
И, самое главное, когда код пишется на человеческом языке программирования, то мы пишем какие-то конструкции, предполагая, что они на что-то похожи и что-то делают, но для компилятора код - это просто набор команд, и он его преобразует в вызовы процедур программы по адресам в памяти - больше он ничего не знает, а в 1С, кроме того, динамическое определение типа, то есть в момент компиляции никто не знает, что будет в той или иной переменной, поэтому вызов какого-то метода объекта подставляется в общем виде.
116 Torquader
 
18.11.14
11:48
(114) В запросе будет ошибка, а в коде - нет, так как в запросе несуществующая ссылка будет равна Null.
117 Рэйв
 
18.11.14
11:48
(114)В 7.7 ошибка была в таком случае :-) А в 8 сделали получение пустого шаблона объекта при отсутсвии в базе
118 Fragster
 
гуру
18.11.14
11:51
(116) в запросе будет NULL, в коде будет приведение NULL к типу реквизита объекта
119 Fragster
 
гуру
18.11.14
11:52
вот то, что в запросе NULL <> NULL, а в коде - наоборот - это косяк :)
120 Fragster
 
гуру
18.11.14
11:52
(118)+ ошибки в запросе не будет
121 18_plus
 
18.11.14
11:53
(119) это косяк кодера, который в принципе допустил сравнение нуллов.
122 Fragster
 
гуру
18.11.14
11:57
(121) два вопроса:
1. почему нельзя сравнивать с NULL в коде?
2. Почему нельзя сравнивать с NULL в запросе?
123 Рэйв
 
18.11.14
11:59
(122)Наверное это просто разные типы несмотря на то что имя одинаковое.
124 Рэйв
 
18.11.14
12:00
и если в запросе это NULL по правилам скуля, то в коде языка 1С - правила 1С, и чего они там имели в виду фик знает:-)
125 18_plus
 
18.11.14
12:01
(122) сравнивать-то можно, если понимаешь что делаешь, только зачем?
126 Classic
 
18.11.14
12:01
Любая тема, связанная с внутрями 1цэ, сводится к Нулл или Неопределено :)
127 Fragster
 
гуру
18.11.14
12:02
(124)

ВЫБРАТЬ
    "NULL = NULL"
ГДЕ
    NULL = NULL
    
Объединить все

ВЫБРАТЬ
    "NULL <> NULL"
ГДЕ
    NULL <> NULL


против

Если NULL = NULL Тогда
Сообщить("NULL = NULL");
ИначеЕсли NULL <> NULL Тогда
Сообщить("NULL <> NULL");
КонецЕсли;
128 Fragster
 
гуру
18.11.14
12:03
(125) например чтобы проверить, что в соединяемой таблице нет значения по условию соединения?
129 herfis
 
18.11.14
12:03
(119) Не согласен. И там и там есть своя логика. В SQL - это страховка от наиболее частых ошибок. Поэтому для случаев, когда в самом деле нужна проверка на NULL - введен дополнительный оператор. В 1С никакого смысла в доп-операторе нет.
130 Fragster
 
гуру
18.11.14
12:04
(128)+ в самом запросе или в постобработке (например для создания соответствующих отсутствующих элементов)
131 18_plus
 
18.11.14
12:04
(128) специально для этого есть ЕСТЬNULL
132 18_plus
 
18.11.14
12:04
и ЕСТЬ NULL
133 Fragster
 
гуру
18.11.14
12:05
(131) ты не поверишь, н я знаю. я не про то, что чего-то нет, а про (127)
134 Рэйв
 
18.11.14
12:07
(124)Я именно об этом и говорил. Разные вещи и ведут себя по разному.
Похоже скуль вообще считает что "ничто" при любом сравнении с "ничем" дает ложь:-)
135 Рэйв
 
18.11.14
12:08
(124)Вот и получается что в скуле NULL- это "ничто", а в коде NULL  - это просто сущность с таким название
136 18_plus
 
18.11.14
12:09
(133) любые операции с NULL некорректны. корректной считается только проверка на NULL.
все остальные извращения на совести разработчика.
137 Fragster
 
гуру
18.11.14
12:11
(136) поставлю вопрос по другому: у тебя в общих модулях есть
Функция ЕстьNULL(Значение)
  Возврат Значение = NULL;
КонецФунцкии
?
138 herfis
 
18.11.14
12:13
Просто в SQL для операций над множествами ЕСТЬ необходимость совершенно особо обрабатывать значение НЕИЗВЕСТНО в разных случах. Поэтому NULL и стоит так обособленно. В коде 1С такой необходимости нет, поэтому и обособленного поведения нет.
139 Fragster
 
гуру
18.11.14
12:16
(138) простейший пример - загружаешь прайс поставщика, для существующей номенклатуры поставщика обновляешь описание, для отсутствующей - создаешь новый элемент. вот тебе необходимость сравнения с NULL в коде. Можно, конечно, в запросе получить, типа "Выбор когда Номенклатура.Ссылка Есть NULL Тогда Истина Иначе Ложь Конец как Создавать", но стоит ли оно того?
140 herfis
 
18.11.14
12:19
(139) Пример чего? В (138) я попытался сказать, почему в коде и в запросе NULL ведет себя по-разному.
141 Ненавижу 1С
 
гуру
18.11.14
12:21
блин, все пропустил!
142 Fragster
 
гуру
18.11.14
12:21
(140) ты написал не "почему в коде и в запросе NULL ведет себя по-разному", а "коде 1С такой необходимости сравнения с NULL нет"
143 herfis
 
18.11.14
12:25
(142) Нет. Я написал, что в коде 1С нет необходимости в особой работе с NULL, как в SQL. При обработке выборки нужна просто возможность проверки на NULL. Для этого используется стандартный оператор. Всё логично, хотя на первый взгляд и не очень :)
144 Рэйв
 
18.11.14
12:26
(141)А я думал тебя забанили где-то, что очередной нуло-срач пропускаешь:-)
145 18_plus
 
18.11.14
12:27
(137) такой нет. а вот сравнение с null есть.
фактически это та же проверка на null, которую не сделали в запросе. и работает она правильно.

да, получается, что (136) больше относится к запросам.
146 Серго62
 
18.11.14
12:27
(127) А вот если в менеджмент студии написать:
select 1 as f1 where null <> null
select 1 as f1 where null = null
то оба запроса возвращают пустой результат, вот такая вот загогулина :)
147 Smallrat
 
18.11.14
12:28
(126) и призывает в топик Ненавижу 1С ))
148 Рэйв
 
18.11.14
12:28
(146)Вот не лень тебе было туда лезть?:-)  У меня тоже самое в консоли в 1С выдало
149 Серго62
 
18.11.14
12:30
(148) Мне если чесно, то лень, просто рядом девочка сидит у которой студия открыта :)
150 Ненавижу 1С
 
гуру
18.11.14
12:32
(147) см (141)
151 Ненавижу 1С
 
гуру
18.11.14
12:33
(149) девочка это хорошо
152 Smallrat
 
18.11.14
12:34
(150) я до туда еще не дочитал )) когда увидел что всё скатилось опять в обсуждение NULL, и подумал что кого-то тут не хватает.
153 herfis
 
18.11.14
12:34
Вопрос всем ненавистникам разного поведения NULL в запросах и коде - а как надо было сделать? NULL уже существует в SQL и обладает таким поведением, каким обладает по многим причинам. Соответственно, это значение может присутствовать в выборке и его нужно отличать от других. Что нужно было сделать разработчикам 1С в коде 1С? Задублировать поведение NULL для выражений и добавить специальный оператор просто чтобы унифицировать поведение? Хотя с точки зрения насущной необходимости это нафиг не нужно?
154 Fragster
 
гуру
18.11.14
12:40
(146) а в консоли запросов 1с пробовал написать?
155 Рэйв
 
18.11.14
12:42
(146)->(148)
156 Рэйв
 
18.11.14
12:43
(155) к (154)
157 Fragster
 
гуру
18.11.14
12:55
(155) а кто автор (146), смотрел?
158 mikeA
 
18.11.14
13:16
(151) и в конце концов свели таки всё к куям)))