Через 'точку'. Минус объектной модели работы с данными

11 января 2013

Предисловие

Через точкуПлатформа 1С:Предприятие 8.x имеет два подхода работы с базой данных (БД): объектная модель и запросы. При этом фирма "1С" рекомендует использовать именно запросы для получения данных из БД. 

На первом рисунке к статье Вы можете видеть пример использования объектной модели. На нем показан программный код для выборки элементов справочника "Товары" и получением значения поля "Артикул" из ссылки на элемент. Именно в получении данных "через точку" и кроется главная проблема.

Чем же так плоха объектная модель? Об этом мы поговорим сегодня в статье.

Скорость работы

Для начала проведем тест на скорость работы двух подобных алгоритмов. Один алгоритм будет использовать объектную модель для выборки элементов справочника, другой программный код будет осуществлять выборку из базы с помощью класса "Запрос".

Получение данных через объектную модуль и запросом

В тестовой базе измерим время выполнения каждого алгоритма с помощью стандартного инструмента платформы "Замер производительности". Справочник товары предварительно заполним 5000 элементами. Результаты замера производительности приведены на следующем скриншоте.

Замеры производительности

Как мы видим, при использовании объектной модели доступа к данным программный код выполняется 4,84 секунды. Время же работы алгоритма с запросом составляет 0,36 секунды. Вариант с запросом отработал быстрее фактически в 13 (!!!) раз!

В чем разница?

Разница заключается в поведении платформы в части работы с базой данных. Дело в том, что при обращении к свойствам, например, ссылки "через точку", платформа строит запрос к базе на выборку всех доступных полей. И если нам необходимо из ссылки на справочник товары получить только значение поля "Артикул", то платформа все равное выберет в запросе все доступные поля ("Ссылка", "Артикул", "Пометка удаления", "Предопределенный" и др.).

Используя же запрос мы можем не только указать какие конкретные поля для выборки необходимы, но и выбрать данные из нескольких таблиц с наложением гибких условий отбора.

Вернемся к примеру выше. Чтобы получить конкретное представление о действиях платформы, проанализируем SQL-запросы к БД для обоих вариантов. 

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

SQL-запрос выборки элементов справочника при использовании объектной модели работы

На предыдущем рисунке Вы можете видеть SQL-запрос, формируемый платформой 1С:Предприятие 8.x при использовании объектной модели доступа к данным. Первое, что бросается в глаза - это список выбираемых полей. Несмотря на то, что в нашем примере нужно лишь получать поле "Артикул", платформа выбирает все поля из таблицы справочника. Интересным моментом является то, что получение данных из БД осуществляется порциями по 25 записей. SQL-запрос выполняется при вызове метода "Выбрать()" для результата запроса.

Соответственно, имеем следующую картинку: поскольку каждые 25 записей запрос к базе данный осуществляется вновь, то для 5000 элементов справочника будем иметь 200 (!!!) SQL-запросов. Причем выбираются все доступные поля таблицы! Как Вы думаете, хорошо ли это влияет на производительность (риторический вопрос).

Рассмотрим SQL-запрос, формируемый платформой при использовании класса "Запрос" в рассматриваемом примере (см. след. скриншот).

SQL-запрос при использовании класса "Запрос"

Как мы видим, SQL-запрос выполняет получение поля "Артикул" из таблицы справочника "Товары" (в данном случае это SQL-таблица "_Reference7"). Никаких других полей из таблицы не выбирается. Кроме того, выборка записей осуществляется одной порцией.

Правила работы с объектной моделью

Несмотря на недостатки объектной модели работы с данными, ее использование является необходимым при разработке на платформе 1С:Предприятие 8.x. Применение запросов заменяет ее лишь при получении данных непосредственно из БД или таблиц значений. Во всех остальных случаях, таких как работы со структурой или элементами формы, ее использование является единственным вариантом работы.

Чтобы оптимизировать программный код при работе с объектами необходимо сократить использование обращений "через точку". Для этого наилучшим вариантом будет сохранение промежуточных объектов в переменные, к которым можно обращаться в дальнейшем. Приведу простой пример:

Примеры работы "через точку"

В правильном варианте значение "Элементы.Таблица.ТекущиеДанные" было сохранено в переменную, к которой происходило дальнейшее обращение. В неэффективном варианте обращение к текущим данным строки таблицы многократно осуществлялся через элементы формы, что излишне затрачивает ресурсы системы.

Заключение

Для работы с таблицами базы данных наилучшим вариантом будет использование класса "Запрос", поскольку мы сможем влиять на SQL-запросы, формируемые платформой 1С:Предприятие 8.x.

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

При создании запросов к базе данных нужно уделять особое внимание их оптимальности, поскольку самой распространенной причиной низкой производительности системы на платформе 1С:Предприятие являются нерациональные запросы к базе данных, а также неверное использование класса "запрос", например при многократном выполнении запроса в цикле. Но о написании оптимальных запросов и их оптимизации будем говорить в последующих статья.

 



comments powered by Disqus