Проверка результата запроса на Пустой
2. В то же время если требуется выбрать (или выгрузить) результат запроса, то предварительный вызов метода Пустой не требуется.
Например, вместо:
РезультатЗапроса = Запрос.Выполнить ();
Если НЕ РезультатЗапроса.Пустой() Тогда // избыточный вызов
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
…
Выборка = Запрос.Выполнить ().Выбрать();
Пока Выборка.Следующий() Цикл
…
Проверить пустой результат запроса
Лучше делать это не получая выборку из результата запроса, так как на ее получение тратятся ресурсы системы.
Рекомендуется пользоваться следующим способом:
Если РезультатЗапроса.Пустой() Тогда
Следующий способ НЕВЕРНЫЙ:
Если Выборка.Количество()>0 Тогда
О нашем блоге
В этом разделе нашего интернет магазина вы найдете много полезной информации, статей и обзоров на продукты и программы, которые представлены в нашем каталоге. Приятного чтения!
Работа с запросами
Рекомендуется получать все необходимые однотипные данные одним запросом, вместо выполнения серии запросов.
Проверка на пустой результат выполнения запроса
1. Проверку того, что результат выполнения запроса не содержит строк следует выполнять с помощью метода Пустой. Поскольку на получение выборки из результата запроса (выгрузка его в таблицу значений) будет затрачиваться дополнительное время.
2. В то же время если требуется выбрать (или выгрузить) результат запроса, то предварительный вызов метода Пустой не требуется.
Например, вместо:
Ограничение на использование конструкции “ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ” в запросах
1.1. При разработке текстов запросов следует иметь в виду, что при работе в клиент-серверном варианте, когда в качестве СУБД используется PostgreSQL, производительность выполнения запросов с конструкцией ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ значительно снижается. В особенности это касается случаев, когда в запросе встречаются две и более таких конструкций.Поэтому в общем случае не рекомендуется использовать конструкцию ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ в запросах. И в тех случаях, где это возможно, рекомендуется переписать текст исходного запроса без использования этой конструкции.Например, следующий запрос:
Может быть реализован без конструкции ПОЛНОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ следующим образом
1.2. Исключение составляют случаи, когда текст исходного запроса не может быть переписан без использования конструкции ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ по объективным причинам. Следует иметь в виду, что при выполнении данной конструкции на СУБД PostgreSQL она автоматически заменяется платформой 1С:Предприятие на эквивалентную, которая может быть исполнена в СУБД PostgreSQL. При этом сохраняются все атрибуты запроса, такие как модификаторы ПЕРВЫЕ, РАЗЛИЧНЫЕ, а также УПОРЯДОЧИТЬ ПО. В таких случаях не следует “механически” заменять конструкцию ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ только с той целью, чтобы от нее избавиться в тексте запроса.
Исключением являются ситуации, когда выполнение замены нескольких одинаковых строк одной является необходимым условием выполнения запроса.
2. Не допускается одновременно использовать конструкцию ПОЛНОЕ СОЕДИНЕНИЕ и обращение к табличным частям из раздела ВЫБРАТЬ.
Данное требование продиктовано особенностью выполнения подобных запросов на СУБД PostgreSQL и необходимостью переносимости прикладных решений на эту СУБД.
Использование ключевых слов “ОБЪЕДИНИТЬ” и “ОБЪЕДИНИТЬ ВСЕ” в запросах
В общем случае, при объединении в запросе результатов нескольких запросов следует использовать конструкцию ОБЪЕДИНИТЬ ВСЕ, а не ОБЪЕДИНИТЬ. Поскольку во втором варианте, при объединении запросов полностью одинаковые строки заменяются одной, на что затрачивается дополнительное время, даже в случаях, когда одинаковых строк в запросах заведомо быть не может.
Упорядочивание результатов запроса
1.1. Если алгоритм обработки результатов запроса зависит от порядка записей в запросе или если результат обработки запроса в той или иной форме представляется пользователю, то в тексте запроса следует использовать предложение УПОРЯДОЧИТЬ ПО. В отсутствие выражения УПОРЯДОЧИТЬ ПО невозможно сделать никаких предположений о том, в каком порядке будут представлены записи в результатах запроса.
Типичные примеры проблем, которые могут возникать (даже при работе на одной и той же СУБД в непредсказуемые моменты времени):
- разная последовательность строк табличной части при заполнении по результатам запроса;
- разный порядок вывода данных (строк, колонок) в отчетах;
- разное заполнение движений документа по результатам запроса (*).
Вероятность возникновения разных результатов при выполнении одинаковых действий повышается
- при переносе информационной базы на другую СУБД
- при смене версии СУБД
- при изменении параметров СУБД
* Примечание: упорядочивание результатов запросов, по которым формируются движения, оправдано только в том случае, если упорядочивание является частью алгоритма формирования движений (например, списание остатков партий товаров по FIFO). В остальных случаях упорядочивать записи не следует, так как дополнительное упорядочивание будет создавать избыточную нагрузку на СУБД.
1.2. При сортировке по полю запроса, которое может потенциально содержать NULL, следует учитывать, что в разных СУБД порядок сортировки по этому полю может отличаться.
Неправильно:
Правильно:
1.3. Если результаты запроса должны тем или иным образом отображаться пользователю, то
- упорядочивать результаты таких запросов необходимо по полям примитивных типов;
- упорядочивание по полям ссылочных типов нужно заменять на упорядочивание по строковым представлениям этих полей.
В противном случае порядок следования строк будет выглядеть для пользователя случайным (необъяснимым).
1.4. Отсутствие предложения УПОРЯДОЧИТЬ ПО оправдано только в тех случаях, когда
- алгоритм обработки результатов запроса не рассчитывает на определенный порядок записей
- результат обработки выполненного запроса не показывается пользователю
- результат запроса – заведомо одна запись
В таких случаях рекомендуется не добавлять предложение УПОРЯДОЧИТЬ ПО в текст запроса, так как это приводит к дополнительным затратам времени при выполнении запроса.
Совместное использование с конструкцией РАЗЛИЧНЫЕ
2. Если в запросе используется конструкция РАЗЛИЧНЫЕ, упорядочивание следует выполнять только по полям, включенным в выборку (в секции ВЫБРАТЬ).
Данное требование связано со следующей особенностью выполнения запросов: в поля выборки неявно включаются поля упорядочивания, что в свою очередь может привести к появлению в результате запроса нескольких строк с одинаковыми значениями полей выборки.
Ограничения на использование конструкции АВТОУПОРЯДОЧИВАНИЕ
3. Использование конструкции ПЕРВЫЕ совместно с конструкцией АВТОУПОРЯДОЧИВАНИЕ запрещено.
В остальных случаях конструкцию АВТОУПОРЯДОЧИВАНИЕ также не рекомендуется использовать, так как разработчик не контролирует, какие именно поля будут использованы для упорядочивания. Применение такой конструкции оправдано только в тех случаях, когда получаемый порядок записей не важен, но при этом он должен быть одинаковым в не зависимости от применяемой СУБД.
Причины использования конструкции АВТОУПОРЯДОЧИВАНИЕ следует указывать в комментарии, размещенном непосредственно перед текстом запроса.
Округление результатов арифметических операций в запросах
Особенности использования в запросах оператора ПОДОБНО
1. При использовании в тексте запроса оператора ПОДОБНО допустимо использовать только константные строковые литералы или параметры запроса. Запрещается формировать строку шаблона при помощи вычислений, использовать конкатенацию строк средствами языка запросов. Например:
2. Запросы, в которых управляющие символы шаблона оператора ПОДОБНО находятся в полях запроса или в вычисляемых выражениях, по-разному интерпретируются на различных СУБД. Запрос, успешно выполняющийся, например, при работе с файловой базой, может возвращать неверные результаты при работе в режиме клиент-сервера. Подобные выражения необходимо переформулировать.
Данное требование продиктовано необходимостью переносимости прикладных решений на различные СУБД.
Псевдонимы источников данных в запросах
1. Псевдоним источника данных должен быть осмысленным, чтобы было понятным его назначение. Требования к псевдонимам источников схожи с требованиями к именам переменных в коде.
- псевдонимы следует образовывать от терминов предметной области таким образом, чтобы было понятно, как источник данных будет использоваться в запросе;
- псевдонимы следует образовывать путем удаления пробелов между словами. При этом каждое слово в имени пишется с прописной буквы. Предлоги и местоимения из одной буквы также пишутся прописными буквами;
- псевдонимы запрещается начинать с подчеркивания;
- псевдонимы не должны состоять из одного символа.
Неправильно:
Правильно:
В частности не рекомендуется использовать имена классов объектов метаданных (“Справочник”, “Документ” и т.д.), т.к. обычно такой псевдоним не будет описывать назначение источника в конкретном запросе. Кроме того, соблюдение данной рекомендации уменьшит количество ложных срабатываний при автоматизированном контроле конфигурации на наличие обращений к несуществующим в конфигурации метаданным.
2. В ряде случаев при написании универсальных запросов, когда вместо источника данных при исполнении кода подставляется имя таблицы, допустимо использование универсальных псевдонимов.
Заметки по 1С:Предприятие 8.2, 8.3
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).
Страницы
- Главная
- Полезности
- Мои сертификаты
среда, 23 апреля 2014 г.
Проверка на пустой список значений в запросе
Для того, чтобы в запросе проверить параметр типа список значений на пустоту можно воспользоваться дополнительным параметром, который будет передаваться в запрос вместе со списком и показывать пустой список или нет.
Пример:
Выбрать информацию о продажах только тех контрагентов, которые содержатся в заданном списке. Проверку на заполненность списка значений проверять в запросе.
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| ПродажиОбороты.Номенклатура,
| ПродажиОбороты.ХарактеристикаНоменклатуры,
| ПродажиОбороты.ЗаказПокупателя,
| ПродажиОбороты.ДоговорКонтрагента,
| ПродажиОбороты.ДокументПродажи,
| ПродажиОбороты.Подразделение,
| ПродажиОбороты.Проект,
| ПродажиОбороты.Организация,
| ПродажиОбороты.Контрагент,
| ПродажиОбороты.КоличествоОборот,
| ПродажиОбороты.СтоимостьОборот,
| ПродажиОбороты.СтоимостьБезСкидокОборот,
| ПродажиОбороты.НДСОборот
|ИЗ
| РегистрНакопления.Продажи.Обороты(
| ,
| ,
| ,
| &ПустыеКонтрагенты
| ИЛИ Контрагент В (&СписокКонтрагентов)) КАК ПродажиОбороты» ;
Запрос . УстановитьПараметр ( «ПустыеКонтрагенты» , СписокКонтрагентов . Количество () = 0 );
Запрос . УстановитьПараметр ( «СписокКонтрагентов» , СписокКонтрагентов );
РезультатЗапроса = Запрос . Выполнить ();
ВыборкаДетальныеЗаписи = РезультатЗапроса . Выбрать ();
Пока ВыборкаДетальныеЗаписи . Следующий () Цикл
.
КонецЦикла;