В чем различие табличной и объектной модели данных?

1. user1302499 08.05.24 10:38 Сейчас в теме
На собесах часто задают вопрос "В чем отличие получения реквизита через точку и через запрос?". Правильным ответом считается, что получение через точку это объектная модель, тянутся все реквизиты, а через запрос получаешь только несколько необходимых полей. И возникают вопросы:

1. А когда использовать объектную модель (получение через точку), а когда использовать табличную (запрос)?

Так же посмотрел видео в котором, для отчета, человек вытягивает все поля справочника включая ссылку и говорит что это объектная модель данных, т.к. при получении Ссылки объект сохраняется в памяти.

А так же приводит в пример еще один запрос, где получает только Код и Наименование + использует Выразить КАК Строка и называет это табличной моделью данных. Соответственно второй вопрос:

2. Если мы в запросе получаем Ссылку, то данные полученные с запроса будут иметь объектную модель данных?

3. Для того, чтобы получить табличную модель, нужно вместо ссылки тянуть Представление (например)?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 08.05.24 11:04 Сейчас в теме
(1)1. в идеале - никогда, всегда использовать табличную
2. нет, будут иметь табличную, но нужно понимать, для чего именно запросом получена ссылка.
3. нужно понимать, для чего получена ссылка и просто так ее не получать. Получать Представление - это вообще не очень хороший пример, особенно в свете того, что значение этого представления может формироваться как объектной так и табличной моделями :)
3. SlavaKron 08.05.24 11:17 Сейчас в теме
(1)
это объектная модель данных, т.к. при получении Ссылки объект сохраняется в памяти
Либо человек заблуждается, либо вы не правильно его трактуете. Сама ссылка это просто ГУИД + идентификатор метаданных. Если ссылка выводится на форму в каком бы то ни было виде, то вычисляется ее представление, т.е. дополнительно считываются, например для документов, дата и номер. А если разработчик переопределил получение представления в модуле менеджера, то и другие реквизиты, которые участвуют в представлении.
22. ActionBlog 08.05.24 16:01 Сейчас в теме
(1)Есть хорошая статья с разбором на эту тему. Тут нельзя ссылки прикреплять, поэтому загуглите "Недостатки объектной модели" статья на сайте 1с Лансер. Если коротко, то вывод в статье такой:

Для работы с SQL базой и таблицами значений, наиболее правильно будет использовать класс "Запрос" для получения нужных полей объекта, так как при таком подходе разработчик может влиять на количество полей, выбираемых платформой.

При использовании объектной модели необходимо помнить, что нельзя пренебрегать использованием временных переменных для хранений данных промежуточных объектов. Также крайне нежелательно использовать несколько точек в одном обращении к полю.

Используя запросы, нужно позаботится об их оптимальности, накладывая необходимые фильтры и условия на таблицы и их соединения, чтобы по максимуму ограничить количество полей перед выборкой.
23. RustIG 1631 14.05.24 09:51 Сейчас в теме
(1) неправильно говорить "табличная" модель - есть только объектная и запросная модель.
примеры использования вот здесь читайте https://dzen.ru/a/ZhO4Z0KsqWaOdwLd?share_to=link
4. Vitaly1C8 08.05.24 11:30 Сейчас в теме
Если бы мне задали вопрос: "В чем отличие получения реквизита через точку и через запрос?"
Мой ответ: Для получения реквизита через точку, предварительно нужно ПолучитьОбъект()
А через запрос Запрос.Выполнить() и цикл по Выборке
Если же вопрос задается в каком то контексте (предварительно озвученном) то нам бы тоже этот контекст знать не помешало ...
5. nomad_irk 76 08.05.24 11:36 Сейчас в теме
(4)
Мой ответ: Для получения реквизита через точку, предварительно нужно ПолучитьОбъект()

Получать объект для этого вовсе не обязательно.
6. Vitaly1C8 08.05.24 11:51 Сейчас в теме
(5) Иногда не обязательно, - соглашусь.
Вообще такие общие вопросы мне кажутся слегка оторванными от жизни. Ответить на них можно как угодно.

1. А когда использовать объектную модель (получение через точку), а когда использовать табличную (запрос)?
Объектная - в модулях проведения, формах, обработках (везде где идет обработка Одного объекта)
Табличная - в отчетах, заполнение табличных частей внешними данными (везде где идет обработка Нескольких объектов)

2. Если мы в запросе получаем Ссылку, то данные полученные с запроса будут иметь объектную модель данных?
На мой взгляд, результат запроса всегда Табличная модель;

3. Для того, чтобы получить табличную модель, нужно вместо ссылки тянуть Представление (например)?
На мой взгляд, результат запроса всегда Табличная модель;
7. nomad_irk 76 08.05.24 11:53 Сейчас в теме
(6)
Иногда не обязательно, - соглашусь.

Всегда :)
8. GeraltSnow 174 08.05.24 13:03 Сейчас в теме
когда использовать объектную модель (получение через точку), а когда использовать табличную (запрос)?


Когда работаешь с переменной типа ДокументОбъект, СправочникОбъект, то пользуйся объектной моделью для получения её реквизитов через точку. В этом случае все данные объекта уже в памяти, поэтому чтение будет происходить из неё без выполнения неявных запросов к базе.

Когда работаешь с переменной типа ДокументСсылка, СправочникСсылка, то вместо обращения к её реквизитам через точку пользуйся запросами или соответствующими методами БСП из общего модуля ОбщегоНазначения.
9. booksfill 08.05.24 13:28 Сейчас в теме
Строго IMHO! Так сказать, добросовестно заблуждаюсь.
"Объектная модель — это совокупность объектов и перечислений, их свойств, параметров и взаимосвязей. Объектная модель определяет структуру хранения пользовательских данных в системе, в т.ч. методы по их извлечению и преобразованию."

Если вы работаете не со ссылкой, а с объектом, то можете смело пользоваться "точкой" - вы работаете с конкретным экземпляром объекта данных, содержащим как сами данные, так и методы.

Обращение же через точку и выборка из документа - это не объектная модель данных, а ОБРАЩЕНИЕ к объектной модели данных 1С для получения нужного результата.

РезультатЗапроса.Выбрать() тоже возвращает не скаляр, а объект для работы с данными, никто при этом не считает работу с выборкой работой с объектной моделью данных.

Обращение "через точку" - класс 1С отдает вам результат (поле из оного) ВЫБРАТЬ * ИЗ, с возможностью кэширования результата.
Кстати, есть интересный момент - если хотим получить примитив от ссылки, например, наименование, то ссылка.Наименование - потянет все данные объекта, а Строка(Ссылка.Наименование) - потянет из базы только наименование.

Обращение, например, к менеджеру документа с использованием метода Выбрать - также представляет собой обращение к методу объекта, той самой объектной модели данных. И получением не простой выборки,а другого неявного экземпляра объекта, который позволяет, например, обходить выборку порционно, получая соответствующие плюшки.

Что от вас хотя получить на собеседовании не знаю, скорее-всего понимание того чем "простой запрос" отличается от других способов получения данных.
10. SlavaKron 08.05.24 14:00 Сейчас в теме
(9)
Строка(Ссылка.Наименование) - потянет из базы только наименование
что-то сомневаюсь, это как проверить?
11. GeraltSnow 174 08.05.24 14:05 Сейчас в теме
(10) профилировщиком запроса
12. SlavaKron 08.05.24 15:05 Сейчас в теме
(11)
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.ОбъектыЭксплуатации");
Выборка = Запрос.Выполнить().Выбрать();
ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Пока Выборка.Следующий() Цикл
  А = Строка(Выборка.Ссылка.Наименование);
КонецЦикла;
ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сообщить(ВремяОкончания - ВремяНачала);
Код со Строка() выполнялся 1500 сек, без — 960. Лично я вывод сделал =)
14. GeraltSnow 174 08.05.24 15:20 Сейчас в теме
(12) Проверил профилировщиком - запросы абсолютно идентичны что при простом обращении к наименованию элемента справочника через точку, что при обращении к нему же внутри преобразования в строку
Прикрепленные файлы:
15. spacecraft 08.05.24 15:25 Сейчас в теме
(9)
ссылка.Наименование - потянет все данные объекта, а Строка(Ссылка.Наименование) - потянет из базы только наименование.

(14)
запросы абсолютно идентичны что при простом обращении к наименованию элемента справочника через точку, что при обращении к нему же внутри преобразования в строку

Доказали прямо противоположное?
16. GeraltSnow 174 08.05.24 15:27 Сейчас в теме
(15) Вопрос был в проверке этого утверждения. Проверил - утверждение оказалось не верным)
17. spacecraft 08.05.24 15:29 Сейчас в теме
(16) хорошо что доказали. Хотя это и так было ясно. Но в любом случае доказательство не помешает для тех кто думает по другому.
19. GeraltSnow 174 08.05.24 15:49 Сейчас в теме
(17) А вот если сделать Строка(Ссылка), тогда в тексте запроса останется только наименование. Но тут срабатывает обработка получения представления, так что в запрос попадет всё, что выбирается этой самой обработкой. В случае, когда обработка получения представления не переопределена в модуле менеджера, то в запрос будет попадать либо наименование, либо код, смотря что выбрано в качестве основного представления справочника.
Прикрепленные файлы:
21. spacecraft 08.05.24 16:01 Сейчас в теме
(19) пока все логично.
Еще можно проверить xmlstring(ref)
20. booksfill 08.05.24 15:55 Сейчас в теме
(14) Прошу прощения, немного ошибся, не Строка(Ссылка.Наименование), а Строка(Ссылка).
Проверил в профайлере - во втором случае выбирает только строку + ее же и кэширует
13. starik-2005 3046 08.05.24 15:18 Сейчас в теме
Какая интересная тема...

Вообще, нужно, наверное, с определений зайти. Объектная модель доступа к данным не такая уж и объектная. Это ORM - Object-Relational Mapping, т.е. отображение связанных таблиц в объект (экземпляр класса), с которым можно работать, дернув базу только один раз. Обратился к объекту - получил его объектное отображение на время жизни контекста/переменной/чего-то-там-еще - зависит от фреймворка.

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

В остальных же случаях (ну я бы сказал "во всех", кроме сценариев с записью) имеет смысл использовать запросы.
nomad_irk; +1 Ответить
18. spacecraft 08.05.24 15:34 Сейчас в теме
(13) ну, есть еще перечисления, которые нет смысла получать запросом только для этого.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот