4.20.Работа в конфигураторе. Исправление запросов
      Список правил
      При написании запросов могут быть допущены методические ошибки. Ниже перечислены правила, которых следует придерживаться. Большинство из них надо соблюдать всегда, вырабатывая правильный стиль написания кода. Однако есть правила, соблюдение которых требуется только при переписывании проблемных запросов (почему – станет ясно при ознакомлении с правилами), и для таких случаев в списке указано: «При возникновении проблем на данном участке кода».
            - Выбирать в запросе только то, что нужно.
         - Понимать, что запрос через объектную модель может не соответствовать правилу 1. Зафиксирован случай, когда при получении ДокументСсылка.Проведен из базы на самом деле запрашивались все реквизиты документа. Один из реквизитов имел тип ХранилищеЗначения и большой размер данных в хранилище, поэтому запрос ДокументСсылка.Проведен выполнялся очень долго. Обычно, однако, это не мешает работе, но при возникновении проблем на данном участке кода надо писать запросы на языке запросов, а не пользоваться объектной моделью.
         - При работе в автоматическом режиме блокировок при использовании конструкции ДЛЯ ИЗМЕНЕНИЯ надо указывать, какие таблицы блокировать, если в запросе участвует больше одной таблицы. Пояснения – в этой же главе ниже.
         - Условия в запросе и индексы в базе должны друг другу соответствовать (при возникновении проблем на данном участке кода). Пояснения – в этой же главе ниже.
         - При работе с виртуальными таблицами нужно использовать параметры виртуальных таблиц, а не выносить условия в секцию ГДЕ.
         - Не применять избыточное агрегирование. Механизм виртуальных таблиц сам считает сумму, и так, как в примере, делать не надо:
     
            СУММА(Остатки.СуммаВзаиморасчетовОстаток) КАК СуммаВзаиморасчетовОстаток
                 - При соединении таблиц все условия и параметры, относящиеся к полям этих таблиц, ставить в условия соединения или пользоваться временными таблицами, а не оставлять их до секции ГДЕ. При этом, конечно, не должна страдать логика.
         - Не использовать подзапросы в условии соединения и в секции ГДЕ. Нужно использовать временные таблицы. Пояснения – в этой же главе ниже.
         - Вообще лучше не использовать соединения с подзапросами, а использовать временные таблицы. Пояснения – в этой же главе ниже.
         - Не соединять виртуальные таблицы с реальными, а также виртуальные с виртуальными. Правильно сначала результат виртуальной таблицы записывать во временную таблицу, индексировать ее по полям соединения, а затем уже соединять. Пояснения – в этой же главе ниже.
         - Не рекомендуется использовать логическое ИЛИ в условиях соединения, то есть в секции ПО запроса. Следует проанализировать решаемую задачу и попытаться найти другой алгоритм ее решения (при возникновении проблем на данном участке кода).
         - Аналогично с условием Не равно, особенно если на Не равно сравниваются ссылки (при возникновении проблем на данном участке кода).
         - В секции ГДЕ логическое ИЛИ использовать тоже не рекомендуется. Следует разбить один запрос на несколько и объединить результаты (при возникновении проблем на данном участке кода). Пояснения – в этой же главе ниже.
         - Избегать запросов к пустым таблицам в режиме автоматического управления блокировками «1С». Пояснения – в этой же главе ниже.
         - Понимать, как запрос может быть изменен при работе механизма RLS.
         - Аккуратно пользоваться разыменованием (получением данных «через точку»):
     
      - лучше бы не пользоваться (при возникновении проблем на данном участке кода), а использовать явное соединение;
      - совершенно точно не пользоваться для получения данных от полей составного типа (при возникновении проблем на данном участке кода). Пояснения – в этой же главе ниже;
      - для сравнения ссылок сравнивать только ссылки, если от этого не страдает логика (при возникновении проблем на данном участке кода менять логику):
            ПО ФИО.ФизЛицо = ФизЛица.Ссылка // правильно
        ПО ФИО.ФизЛицо.Наименование = ФизЛица.Ссылка.Наименование // неправильно
           - не получать еще раз .Ссылка:
            ПО ФИО.ФизЛицо = ФизЛица.Ссылка // правильно
        ПО ФИО.ФизЛицо.Ссылка = ФизЛица.Ссылка // неправильно
           - никогда не использовать конструкцию Ссылка.Ссылка. Это всегда ошибка.
      Далее будут даны пояснения к некоторым из перечисленные правил.