Доброго дня, коллеги!
Тренеры курса Подготовка к аттестации 1С:Специалист по платформе 1С:Предприятие 8.3 получают обратную связь от слушателей и внимательно следят за подходами оценки решений со стороны экзаменаторов. Следующая ошибка, за которую часто снижают оценку на экзамене, из разряда неоднозначных и, если вы сейчас готовитесь к сертификации, то рекомендуем вам прочитать ответ тренера.
Вопрос
Ответ
Здравствуйте!
В данном пункте имеется в виду выгрузка результата запроса во внешний объект структурного типа (таблица значений, дерево значений, структура, массив, список). То есть смысл данного ограничения в том, что нужно, по возможности, извлекать данные непосредственно из результата запроса (через выборку результатов запроса), не используя промежуточных объектов.
Обратите внимание на фразу “без необходимости”. Иногда получить требуемые данные запросом затруднительно или невозможно, в таком случае приходится использовать промежуточное хранение результатов, над которым производятся дополнительные преобразования. Либо имеется иная причина для использования подобных промежуточных таблиц. В любом случае, нужно суметь обосновать свою позицию на экзамене.
Например, если по результатам запроса заполняются данные регистров, документов, производится вывод отчета (и структура отчета позволяет использовать результат запроса напрямую), то использование промежуточной таблицы будет лишним – нужно извлекать данные непосредственно из результатов запроса.
Если же весь смысл выполнения запроса в том, чтобы заполнить экранную таблицу значений или дерево значений, которые затем будет редактировать пользователь, или же структура отчета такова, что данные для него не удается (или очень сложно) полностью сформировать в запросе и гораздо проще сделать это с использованием промежуточной таблицы, то в этом случае использование промежуточной таблицы оправдано.
Есть ещё один пример, над которым давно уже “ломаем копья”. Во многих примерах данного курса движения регистров (точнее, наборы записей регистров) при проведении документов загружаются из результатов запроса методом Загрузить(). С одной стороны, метод Загрузить() принимает в качестве аргумента только таблицу значений (это, скорее недоработка разработчиков платформы, возможно, когда-нибудь и этот момент улучшат). Поэтому, чтобы его использовать, приходится выгружать результат запроса в промежуточную таблицу. Такая запись более лаконична и, так как используется встроенная функция, можно предполагать, что загрузка будет производиться быстрее, чем построчный перебор выборки из результата запроса и построчное заполнение набора записей регистра. И раньше такой прием не вызвал нареканий у экзаменаторов. Однако в последнее время их взгляды изменились, и, по некоторой информации, за использование такой конструкции стали снижать оценку. Поэтому в данном случае и в подобных сомнительных и не совсем однозначных ситуациях на экзамене лучше все-таки использовать выборку из результатов запроса. Что до реальной практики, то в типовых конфигурациях этот прием используется достаточно широко.
Что касается временной таблицы, то она формируется в пакете запросов, когда результата запроса как такового еще нет – при создании временной таблицы мы находимся как бы “внутри” выполняемого на сервере запроса. Поэтому даже с формальной точки зрения эта фраза к временной таблице запроса не применима.
Небольшое дополнение к ответу. Иллюстрация того, как делать не надо (взято из типовой конфигурации):
ЗапросДокОтгрузки = Новый Запрос(" |ВЫБРАТЬ | ПеремещениеТоваров.Ссылка КАК Ссылка |ИЗ | Документ.ПеремещениеТоваров КАК ПеремещениеТоваров |ГДЕ | ПеремещениеТоваров.ХозОперация = &ХозОперация | И ПеремещениеТоваров.ИДДокументаОтгрузки = &ИДДокументаОтгрузки"); ЗапросДокОтгрузки.УстановитьПараметр("ИДДокументаОтгрузки", ШапкаДокумента.ИДДокументаОтгрузки); ЗапросДокОтгрузки.УстановитьПараметр("ХозОперация", Справочники.ХозОперации.ПеремещениеТоваровВФилиал); РезультатДокОтгрузки = ЗапросДокОтгрузки.Выполнить(); Если НЕ РезультатДокОтгрузки.Пустой() Тогда ДокументОтгрузки = РезультатДокОтгрузки.Выгрузить().Получить(0).Ссылка; КонецЕсли;
Вместо выгрузки в таблицу значений здесь, в соответствии с требованиями экзамена, следовало бы обратиться к выборке из результатов запроса:
Выборка = ЗапросДокОтгрузки.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда ДокументОтгрузки = Выборка.Ссылка; КонецЕсли;
Подготовка к аттестации 1С:Специалист по платформе 1С:Предприятие 8.3.