1С:Предприятие 8 содержит несколько способов получения одних и тех же данных. Для объектных сущностей (Справочников, Документов и т.д.) данные могут считываться с помощью ссылки, запроса, выборки и объекта. Подробно отличия ссылки, выборки и объекта описаны в разделе "Особенности использования типов данных, предназначенных для манипулирования объектами базы данных". В этом разделе мы дадим некоторые рекомендации, когда следует использовать какой способ доступа.
В общем случае, наиболее эффективным способом считывания данных является Запрос. В нем непосредственно указывается, как отбирать записи, и какие поля должны быть считаны. Соответственно, при выполнении запроса из базы данных будет выбрана только необходимая записи информация и передана на клиентский компьютер. Использование запроса позволяет избежать считывания полей и табличных частей, которые не нужны в конкретном случае.
Еще одним преимуществом запроса является возможность однократного считывания всей требуемой информации из нескольких связанных таблиц. То есть если нужно считать данные нескольких объектов или получить данные из других таблиц, связанных с объектами, то использование запроса будет эффективнее, чем несколько отдельных обращений к различным данным. Здесь важно заметить, что, с точки зрения производительности, существенным является не только объем считываемой информации, но и количество обращений к базе данных, так как каждое обращение влечет дополнительные "накладные" расходы.
Однако запрос будет выполнять считывание из базы данных при каждом вызове. Соответственно, при многократном обращении к одним и тем же данным будет выполняться многократное считывание. Этого можно избежать, обращаясь к свойствам ссылки. В этом случае используется кэширование объектов и в определенном интервале времени при повторном обращении к данным объекта не будет выполняться повторное считывание. Но следует учитывать, что обращение к любому полю через ссылку приведет к полному считыванию объекта (включая все поля и все табличные части). Соответственно, ссылку можно использовать для многократного обращения, если считывание объекта целиком не может его существенно замедлить. Например, получение признака "Проведен" у документа через ссылку приведет к считыванию в том числе и его табличной части. Если у документа табличная часть может иметь несколько сотен строк, то лучше воспользоваться запросом.
Разумеется, если необходимо многократно обращаться к одному и тому же полю в пределах одного и того же алгоритма, то эффективнее считать данные, запомнить их в переменную и обращаться к уже считанным данным. Но получение данных через ссылку может выдавать ранее считанные данные, даже если они были считаны в другом вызове встроенного языка, так как кэширование выполняется в рамках всей клиентской сессии.
Отдельно следует отметить возможность использования кэширования представлений. Если, например, необходимо получить представление элемента справочника, то эффективнее не обращаться через ссылку к наименованию, а преобразовать ссылку к строке. В этом случае будет использоваться специальный механизм получения представлений (так же с кэшированием) и если представления объекта еще нет в кэше, то объект не будет считываться целиком, а будут считываться только поля, необходимые для получения представления.
Если необходимо получить перечень объектов для отображения их на экране или вывода на печать, то эффективнее получать представления с помощью объекта "Запрос", а не ориентироваться на автоматическое получение представления при преобразовании ссылки к строке. Например, при выводе отчета о продажах в табличный документ достаточно легко допустить серьезную ошибку с точки зрения производительности, если выводить в табличный документ ссылки на товары. Отчет будет построен правильно, так как система автоматически преобразует ссылки к строке. Однако это преобразование при сотнях и тысячах строк может замедлить формирование отчета в несколько раз. Более правильным будет получение представлений непосредственно в запросе и вывод в табличный документ уже полученного представления в виде строки.
Аналогичным примером может являться отображение результатов запроса в форме путем выгрузки в таблицу значений или дерево значений. Если в ячейках табличного поля выводятся колонки, содержащие ссылки, то просмотр таблицы значений может существенно замедляться при многопользовательской работе. Это будет негативно сказываться и на работе конкретного пользователя, и на работе всей системы в целом. Можно рекомендовать также получать и ссылки, и их представления с помощью запроса и организовывать отображение информации в табличном поле таким образом, чтобы текст ячеек брался бы из колонок, содержащих только примитивные типы.
Однако следует учитывать, что обращение к представлениям ссылок при просмотре таблицы значений пользователем будет выполняться по мере отображения строк, а при получении представлений запросом они будут получаться по всем строкам сразу. В то же время, если будет выполняться поиск по таблице значений, то будут выбираться представления для всех строк (но по отдельности) и это будет существенно менее эффективно, чем единовременное получение представлений запросом.
При обработке информации (например, проведении документа) также можно рекомендовать использовать запросы для получения полей объектов, а не обращаться к большому количеству объектов через ссылки. Например, если нужно получить некоторый реквизит по всем товарам табличной части документа, то эффективнее выполнить запрос по табличной части с получением по каждому товару этого реквизита, чем обходить табличную часть и получать реквизит каждого товара через ссылку.
При использовании запроса вся считанная информация передается на клиентский компьютер и размещается в оперативной памяти. Если требуется обработать очень большие объемы информации, то можно рекомендовать использовать выборку. Выборка не предоставляет широких возможностей по отбору и упорядочиванию информации и считывает все поля и табличные части объектов, но зато она выполняет считывание порциями и, соответственно, может использоваться для обработки любых объемов данных без помещения их в оперативную память.
При получении объектов из выборки их повторное считывание не производится. Поэтому для массовой модификации объектов выборка может быть эффективней, чем считывание ссылок запросом и получение объектов по каждой ссылке.
С точки зрения поиска объектов (ссылок на объекты) по простым условиям (по коду, по наименованию и т.д.) использование запроса и методов менеджеров объектов (НайтиПоКоду() и др.) не имеют существенных отличий по реализации с точки зрения платформы. Методы менеджеров имеет смысл использовать, если выполняются именно одиночные операции поиска. Основным преимуществом методов менеджеров является краткость записи в модуле. Если необходимы сложные условия или поиск нескольких объектов, то необходимо использовать запрос.