Разработка и оптимизация запросов в 1С:Предприятие 8.3. Модуль 8. Оптимизация запросов

На данной странице задавайте вопросы по материалам и практическому заданию восьмого модуля курса «Разработка и оптимизация запросов в 1С:Предприятие 8.3».

Практические задания

К сожалению, у Вас недостаточно прав для дальнейшего просмотра.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Комментарии / обсуждение (157):

  1. Рустам

    ДЗ 30 в Учебной версии платформы выдает ошибку при создании элемента справочника «Достигнуто ограничение учебной версии — «Номенклатура»»

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  2. Рустам

    1. Чем отличаются режимы Автоматические и Управляемые блокировки?
    2. Насколько я понял конструкцию ДЛЯ ИЗМЕНЕНИЯ стоит использовать в случае, если после запроса к определенным объектам будет изменение этих объектов?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  3. Максим

    Добрый день! А почему в папке оптимизация всего 2 коротких видео?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  4. cyberandr

    Добрый день!
    На текущей работе столкнулся с ситуацией когда по сути в самописной базе для хранения остатков в основном используется регистр бухгалтерии. Все хорошо но на больших списках товаров запрос получения остатков и движения по ним, желательно ускорить, а регистр остатков не доработан. Имеет ли Регистр накопления преимущества в скорости перед Бухгалтерским регистром в запросах? От виртуальной таблицы ОстаткиИобороты я постарался отказаться.

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  5. aldoro

    Добрый день.
    Немного запутался с индексами.
    В теоретическом материале сказано про порядок следования.
    И в комментариях со схожими вопросами есть ответы что оптимизатор хорошо справляется с порядком
    Насколько понял порядок полей критичен только по некоторому блоку условий к полям в составном индексе.
    А вот как мы расположим между собой все остальные условия и этот блок условий составного индекса
    уже совершенно не важно.
    Оптимизатор сам выберет подходит ли ему какой либо блок условий возьмет его первым
    и потом все остальные условия расставит в след за ним как надо
    К примеру на регистре сведений вашей базы «ЦеныНоменклатуры»
    есть условия:
    1) Регистратор = &Регистратор
    2) НомерСтроки = &НомерСтроки
    3) Цена = &Цена
    4) ТипЦен = &ТипЦен
    (на всякий случай уточню, что измерение тип цен ни в одном из индексов первым не является)
    Верно ли я понимаю что прядок
    1 и 2 и 3 и 4
    3 и 1 и 2 и 4
    3 и 4 и 1 и 2
    и др. где блок 1 и 2 по порядку и не разрывны
    совершенно одинаково будет распознан оптимизатором
    т.к. блок 1 и 2 он сам распознает что он идеально подходит под индекс «ByRecorder»
    и он в любом из перечисленных вариантов выберет сразу одну конкретную запись (index seek)
    а потом уже в произвольном порядке просто проверит оставшиеся условия

    Не самым худшим будет вариант при разрыве
    к примеру
    1 и 3 и 2 и 4
    index scan по тому же «ByRecorder», а потом все остальные условия

    А вот к примеру
    2 и 1 и 3 и 4
    это уже будет table scan

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  6. aldoro

    Добрый день.
    Вопрос по поводу не использовать функции от параметров запроса
    В теоретическом материале пример: НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)
    1) А разве в оптимизатор попадёт не уже конкретное значение дата с временем?
    Ну или в похожих случаях другое уже конкретное сформированное значение
    к примеру для ДЕНЬНЕДЕЛИ(&Дата) и &Дата = 14.05.2020 результатом будет 4
    разве в оптимизаторе и далее будет рассматриваться не уже сформированное число 4?
    и это не будет абсолютно идентично тому что мы просто передадим в запрос число 4
    2) До какого именно момента эта агрегатная функция в тексте запроса 1с будет действовать именно как агрегатная?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  7. ThurisazGudleifr

    Добрый вечер.
    «Избегать запросов к пустым таблицам в режиме автоматических блокировок
    При использовании автоматических блокировок применяется уровень изоляции транзакций Serializable, поэтому существуют блокировки диапазона ключа индекса, пустая таблица в этом случае окажется заблокированной целиком. Избежать таких блокировок можно, удалив программный код записи движений из пустой табличной части.
    Также эта проблема не проявляется при использовании управляемых блокировок из-за более низкого уровня изоляции транзакций.»

    Ключи у индекса представляют собой ссылку или код? А т.к у пустой таблицы их нет, то происходит блокировка целиком? Я правильно понял?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  8. Udar

    Добрый день! Извиняюсь за элементарный вопрос. Никак не пойму: отличаются ли понятия «подзапрос» и «вложенный запрос».

  9. ThurisazGudleifr

    Добрый день!
    Вопрос по индексам.

    1) Индекс содержит все поля, перечисленные в условии — Т.е все поля после условия ГДЕ должны входить в индекс?
    2) Эти поля находятся в самом начале индекса — дерево представил, суть понятна, но.. У нас есть таблица с полями ФИО, Город, Телефон, Факс. В начале индекса будут те поля, которые мы сделаем индексируемыми первыми?
    3) Эти поля идут подряд. Т.е если ФИО , Город, Факс есть в условии запроса, то их целесообразно сделать индексируемыми, но между ними вклинивается Телефон, а это неверно?

    4) По умолчанию в 1С режим блокировок автоматический? Ранее слышал о них, но не «парился». Выходит, система все делала сама?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • ThurisazGudleifr

        3) Т.е в первую очередь обращать внимание на то, в каком порядке расположены поля таблицы (ФИО, Город, Телефон, Факс), исходя из этого принимать решение?

        4) Если используется Управляемый режим блокировок, то это не обязательно значит, что это все ложится на плечи разработчика? Платформа все равно будет, грубо говоря, делать основную работу самостоятельно?

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

          • ThurisazGudleifr

            1) «Не следует использовать ИЛИ в секции ГДЕ запроса. Это может привести к тому, что СУБД не сможет использовать индексы таблиц и будет выполнять сканирование, что увеличит время работы запроса и вероятность возникновения блокировок.» Здесь речь только о тех полях, что мы проиндексировали?
            2)» В частности, не рекомендуется обращаться к реквизитам регистратора регистра (например, ТоварныеЗапасы.Регистратор.Дата)» — разыменование полей у реквизитов составного типа это плохо, но в чем особенность Регистратора?

            • Василий Ханевич

              …
              (текст комментария доступен только участникам Мастер-группы)

  10. Михаил Сергеев

    Добрый день
    файл для скачивания подписан как модуль 2 — это нормально?

    • Юлия Толстых

      Добрый день, Михаил!
      Нет, конечно, это ошибка. Спасибо, что сообщили об опечатке — мы ее исправили.
      Ошибка была только в названии файла, ссылка на архив корректная.

  11. StanislavCh

    Добрый день!
    Если необходимо отобрать ,например, тип регистратора для записей регистра, можно
    воспользоваться разными вариантами —
    -ГДЕ ТИПЗНАЧЕНИЯ(ТоварныеЗапасы.Регистратор) = ТИП(Документ.РасходТовара)
    -ГДЕ ТоварныеЗапасы.Регистратор ССЫЛКА Документ.РасходТовара
    -ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РасходТовара)
    какой из вариантов оптимален с методической точки зрения ? Предположительно ВЫРАЗИТЬ исполнится до отбора данных , так ли это ?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • StanislavCh

        Спасибо. Еще вопрос — в рекомендациях предлагается помещать по возможности условия в параметры виртуальные таблицы. Имеет ли это смысл, если условия касаются не самих полей виртуальной таблицы, а их подчиненных полей? например, условие по виду номенклатуры в виртуальной таблице продаж, где измерением является сама номенклатура.

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

  12. Denis74

    Здравствуйте! На стр. 241 говорится про соединение с подзапросами и о том, что их не следует использовать в связях. Сегодня на практике сделал два запроса для УПП, которые выполняю одно и тоже действие — вычисляют остаток для формировании документа Требование-накладная». И выполнив в цикле запрос 1000 раз, стало очевидно, что текст Запроса 1 (подзапросы) выполняется в 2 раза быстрее (5.8 секунды на 1000), чем Запрос 2 (временные таблицы) (10.7 секунд на 1000). Сразу скажу, что запросы получают небольшое количество строк (до 30 записей). Можете пояснить, почему так произошло??? Ниже текст запросов:
    Запрос1 = Новый Запрос;
    Запрос1.Текст = «ВЫБРАТЬ
    | СквознаяКартаПлавильнаяКарта.Номенклатура,
    | СквознаяКартаПлавильнаяКарта.Склад,
    | СквознаяКартаПлавильнаяКарта.ХарактеристикаНоменклатуры,
    | СквознаяКартаПлавильнаяКарта.СерияНоменклатуры,
    | СквознаяКартаПлавильнаяКарта.Количество — ЕСТЬNULL(ПроведенныеТребованияНакладные.Количество, 0) КАК Количество
    |ПОМЕСТИТЬ Таб1_Итог
    |ИЗ
    | (ВЫБРАТЬ
    | чкпзСквознаяКартаПлавильнаяКарта.Номенклатура КАК Номенклатура,
    | чкпзСквознаяКартаПлавильнаяКарта.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | чкпзСквознаяКартаПлавильнаяКарта.СерияНоменклатуры КАК СерияНоменклатуры,
    | СУММА(чкпзСквознаяКартаПлавильнаяКарта.Количество) КАК Количество,
    | чкпзСквознаяКартаПлавильнаяКарта.Склад КАК Склад
    | ИЗ
    | Документ.чкпзСквознаяКарта.ПлавильнаяКарта КАК чкпзСквознаяКартаПлавильнаяКарта
    | ГДЕ
    | чкпзСквознаяКартаПлавильнаяКарта.Ссылка = &СквознаяКарта
    |
    | СГРУППИРОВАТЬ ПО
    | чкпзСквознаяКартаПлавильнаяКарта.Номенклатура,
    | чкпзСквознаяКартаПлавильнаяКарта.ХарактеристикаНоменклатуры,
    | чкпзСквознаяКартаПлавильнаяКарта.СерияНоменклатуры,
    | чкпзСквознаяКартаПлавильнаяКарта.Склад) КАК СквознаяКартаПлавильнаяКарта
    | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    | ТребованиеНакладнаяМатериалы.Номенклатура КАК Номенклатура,
    | ТребованиеНакладнаяМатериалы.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | ТребованиеНакладнаяМатериалы.СерияНоменклатуры КАК СерияНоменклатуры,
    | СУММА(ТребованиеНакладнаяМатериалы.Количество) КАК Количество,
    | ТребованиеНакладнаяМатериалы.Склад КАК Склад
    | ИЗ
    | Документ.ТребованиеНакладная.Материалы КАК ТребованиеНакладнаяМатериалы
    | ГДЕ
    | ТребованиеНакладнаяМатериалы.Ссылка.Проведен
    | И ТребованиеНакладнаяМатериалы.Ссылка.чкпзСквознаяКарта = &СквознаяКарта
    |
    | СГРУППИРОВАТЬ ПО
    | ТребованиеНакладнаяМатериалы.СерияНоменклатуры,
    | ТребованиеНакладнаяМатериалы.ХарактеристикаНоменклатуры,
    | ТребованиеНакладнаяМатериалы.Номенклатура,
    | ТребованиеНакладнаяМатериалы.Склад) КАК ПроведенныеТребованияНакладные
    | ПО СквознаяКартаПлавильнаяКарта.Номенклатура = ПроведенныеТребованияНакладные.Номенклатура
    | И СквознаяКартаПлавильнаяКарта.ХарактеристикаНоменклатуры = ПроведенныеТребованияНакладные.ХарактеристикаНоменклатуры
    | И СквознаяКартаПлавильнаяКарта.СерияНоменклатуры = ПроведенныеТребованияНакладные.СерияНоменклатуры
    | И СквознаяКартаПлавильнаяКарта.Склад = ПроведенныеТребованияНакладные.Склад
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | Таб1_Итог.Номенклатура,
    | Таб1_Итог.Склад,
    | Таб1_Итог.ХарактеристикаНоменклатуры,
    | Таб1_Итог.СерияНоменклатуры,
    | Таб1_Итог.Количество
    |ИЗ
    | Таб1_Итог КАК Таб1_Итог
    |ГДЕ
    | Таб1_Итог.Количество > 0»;

    Запрос2.Текст = «ВЫБРАТЬ
    | ТребованиеНакладнаяМатериалы.Номенклатура КАК Номенклатура,
    | ТребованиеНакладнаяМатериалы.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | ТребованиеНакладнаяМатериалы.СерияНоменклатуры КАК СерияНоменклатуры,
    | СУММА(ТребованиеНакладнаяМатериалы.Количество) КАК Количество,
    | ТребованиеНакладнаяМатериалы.Склад КАК Склад
    |ПОМЕСТИТЬ ПроведенныеТребованияНакладные
    |ИЗ
    | Документ.ТребованиеНакладная.Материалы КАК ТребованиеНакладнаяМатериалы
    |ГДЕ
    | ТребованиеНакладнаяМатериалы.Ссылка.Проведен
    | И ТребованиеНакладнаяМатериалы.Ссылка.чкпзСквознаяКарта = &СквознаяКарта
    |
    |СГРУППИРОВАТЬ ПО
    | ТребованиеНакладнаяМатериалы.СерияНоменклатуры,
    | ТребованиеНакладнаяМатериалы.ХарактеристикаНоменклатуры,
    | ТребованиеНакладнаяМатериалы.Номенклатура,
    | ТребованиеНакладнаяМатериалы.Склад
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | чкпзСквознаяКартаПлавильнаяКарта.Номенклатура КАК Номенклатура,
    | чкпзСквознаяКартаПлавильнаяКарта.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | чкпзСквознаяКартаПлавильнаяКарта.СерияНоменклатуры КАК СерияНоменклатуры,
    | СУММА(чкпзСквознаяКартаПлавильнаяКарта.Количество) КАК Количество,
    | чкпзСквознаяКартаПлавильнаяКарта.Склад КАК Склад
    |ПОМЕСТИТЬ СквознаяКартаПлавильнаяКарта
    |ИЗ
    | Документ.чкпзСквознаяКарта.ПлавильнаяКарта КАК чкпзСквознаяКартаПлавильнаяКарта
    |ГДЕ
    | чкпзСквознаяКартаПлавильнаяКарта.Ссылка = &СквознаяКарта
    |
    |СГРУППИРОВАТЬ ПО
    | чкпзСквознаяКартаПлавильнаяКарта.Номенклатура,
    | чкпзСквознаяКартаПлавильнаяКарта.ХарактеристикаНоменклатуры,
    | чкпзСквознаяКартаПлавильнаяКарта.СерияНоменклатуры,
    | чкпзСквознаяКартаПлавильнаяКарта.Склад
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | СквознаяКартаПлавильнаяКарта.Номенклатура,
    | СквознаяКартаПлавильнаяКарта.Склад,
    | СквознаяКартаПлавильнаяКарта.ХарактеристикаНоменклатуры,
    | СквознаяКартаПлавильнаяКарта.СерияНоменклатуры,
    | СквознаяКартаПлавильнаяКарта.Количество — ЕСТЬNULL(ПроведенныеТребованияНакладные.Количество, 0) КАК Количество
    |ПОМЕСТИТЬ Таб1_Итог
    |ИЗ
    | СквознаяКартаПлавильнаяКарта КАК СквознаяКартаПлавильнаяКарта
    | ЛЕВОЕ СОЕДИНЕНИЕ ПроведенныеТребованияНакладные КАК ПроведенныеТребованияНакладные
    | ПО СквознаяКартаПлавильнаяКарта.Номенклатура = ПроведенныеТребованияНакладные.Номенклатура
    | И СквознаяКартаПлавильнаяКарта.ХарактеристикаНоменклатуры = ПроведенныеТребованияНакладные.ХарактеристикаНоменклатуры
    | И СквознаяКартаПлавильнаяКарта.СерияНоменклатуры = ПроведенныеТребованияНакладные.СерияНоменклатуры
    | И СквознаяКартаПлавильнаяКарта.Склад = ПроведенныеТребованияНакладные.Склад
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | Таб1_Итог.Номенклатура,
    | Таб1_Итог.Склад,
    | Таб1_Итог.ХарактеристикаНоменклатуры,
    | Таб1_Итог.СерияНоменклатуры,
    | Таб1_Итог.Количество
    |ИЗ
    | Таб1_Итог КАК Таб1_Итог
    |ГДЕ
    | Таб1_Итог.Количество > 0»;

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  13. elfnatal

    Подскажите пожалуйста, при открытии расшифровки в отчете тоже происходит неявное обращение к Базе Данных или нет?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  14. Lirina

    Добрый день!
    На странице 242 теоретического материала читаю: «Правильно результат запроса к виртуальной таблице поместить во временную таблицу, проиндексировать её по полям соединения, затем использовать эту временную таблицу для соединения.» Приведите пожалуйста пример практический по этому предложению, для наглядности, заранее спасибо!

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  15. Eldrasil

    Про временные таблицы. Почему в примерах с временными таблицами не используется уничтожение самой временной таблицы? Да и почти нигде не вижу, чтобы эту возможность использовали.

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  16. MaxKor

    Здравствуйте! А могли бы вы подсказать как лучше сделать следующий запрос:
    Есть ТЧ, в ней записи (например менеджеры). В запрос передаем параметр Менеджер. Нужно в выборке получить менеджера который совпал с параметром, или если обратное, вывести все существующие строки.
    Пытался городить через ВТ, но вышло как то очень громоздко и костыльно. Есть ли способ проще сделать? Спасибо!
    Вот например мой запрос:
    ВЫБРАТЬ
    КонтрагентыМенеджеры.Менеджер КАК Менеджер
    ПОМЕСТИТЬ ВТ_Менеджеры
    ИЗ
    Справочник.Контрагенты.Менеджеры КАК КонтрагентыМенеджеры
    ГДЕ
    КонтрагентыМенеджеры.Ссылка.ИНН = &ИНН
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТ_Менеджеры.Менеджер КАК Менеджер
    ИЗ
    ВТ_Менеджеры КАК ВТ_Менеджеры
    ГДЕ
    ВЫБОР
    КОГДА НЕ &Менеджер В
    (ВЫБРАТЬ
    ВТ_Менеджеры.Менеджер
    ИЗ
    ВТ_Менеджеры КАК ВТ_Менеджеры)
    ТОГДА ИСТИНА
    ИНАЧЕ ВТ_Менеджеры.Менеджер = &Менеджер
    КОНЕЦ

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  17. ParhomchikAN

    Здравствуйте.
    в уроке Query-9-Practice-1 на 5 минуте 34 секунде
    ставите условие на тип цен на закладке СВЯЗИ.
    в чем будет отличие, если сделать это на закладке УСЛОВИЯ?
    чем руководствоваться при выборе?

    Так же вопрос про временные таблицы. индексировать надо по тем полям, по которым вдальнейшем делаем объединение таблиц? или еще какие-то надо делать индексы?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • ParhomchikAN

        После слов «Сначала выполняются связи таблиц, затем отборы из секции ГДЕ» все встало на свои места.
        спасибо.

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

          • cyberandr

            Разрешите немного расширить вопрос — если вид цен это регистр, то
            ВидЦен = &ВидЦен можно указать в условии регистра, а отсутствующую цену уточнить ISNULL. Не получим ли мы на больших таблицах выйгрыш в скорости?

            • Василий Ханевич

              …
              (текст комментария доступен только участникам Мастер-группы)

  18. Akorg

    Прочитал в теоретическом материале информацию, показавшуюся мне новой и интересной. Если я правильно понял написанное, то для того, чтобы не выводить саму ссылку в отчет, но сохранить для пользователя возможность ее расшифровки, надо в запрос кроме ссылки включить ее представление, а в отчет вывести только представление. Попробовал в учебной БД создать простейший отчет на СКД с использованием этого приема. В запрос включил таблицу контрагентов.

    ВЫБРАТЬ
        Контрагенты.Ссылка,
        ПРЕДСТАВЛЕНИЕ(Контрагенты.Ссылка) КАК Представление
    ИЗ
        Справочник.Контрагенты КАК Контрагенты

    К сожалению, при попытке настроить вариант отчета с включенным в него только полем представления, у меня ничего не получилось. Поле запроса Представление не попадает в список автоматически сформированных полей запроса, соответственно его нельзя выбрать в настройках отчета. Я что-то не то делаю?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  19. sergr78@mail.ru

    Добрый день!
    Вопросы про индексы.
    1) Получается что СУБД индексирует все таблицы базы данных?.
    2) В каких случаях используем в запросах ИНДЕКСИРОВАТЬ ПО ? В том случае, когда создаем временную таблицу, которая еще не индексирована СУБД?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  20. BorisLK

    Добрый день.
    Предполагается разработка конфигурации «с нуля».
    Для каждой Номенклатуры предусмотрен набор свойств (около 10 шт.). Именно для каждой. Т.е. в обязательном порядке каждая номенклатура будет иметь какое-то значение каждого из этих свойств.
    В отдельных ситуациях предусматривается отбор номенклатуры по одному или нескольким свойствам.
    Какое из решений (с точки зрения производительности) будет более оптимальным:
    1) Как в типовых конфигурациях. Т.е. регистр сведений «свойства объектов». Туда помещать значения всех свойств для всех номенклатур.
    2) Сделать в справочнике «номенклатура» отдельные реквизиты для каждого свойства (со ссылкой на другие справочники, где будут храниться значения этих свойств).
    Примерное количество номенклатур ~ 100 000. Количество вариантов значений для каждого свойства ~ 100.
    Спасибо.

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  21. novka

    Добрый день, в курсе я не услышал упоминания о такой вещи, как зависимость скорости выполнения запроса от порядка условий.
    Я провел эксперимент, в некоторой базе выполнил следующий, простой, запрос:

    ВЫБРАТЬ
        ЗаказПоставщику.Ссылка КАК Заказ
    ИЗ
        Документ.ЗаказПоставщику КАК ЗаказПоставщику

    Но в первом случае указал в условиях

    ГДЕ
    ЗаказПоставщику.Дата МЕЖДУ &ДатаС И &ДатаПо
    И ЗаказПоставщику.Проведен

    Получил время выполнения 0.015 — 0.020 сек

    Во втором случае указал в условиях (поменял условия местами)

    ГДЕ
    ЗаказПоставщику.Проведен
    И ЗаказПоставщику.Дата МЕЖДУ &ДатаС И &ДатаПо

    Получил время выполнения 0.005 — 0.008 сек

    Результат выполнения одинаковый. Подскажите, с чем связано такое поведение системы?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  22. AxiLLes

    Вечер добрый)

    Года 2 назад слушал курсы Кузнецова по запросам и он рассказывал о вреде использования вложенных запросов, т.к. СУБД сложно выбрать оптимальный план запроса. И вообще одна из самых грубых ошибок написания запросов это соединение вложенных запросов.

    Вы согласны с таким мнением? Или же нет большого вреда в использовании вложенных запросов?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  23. spv

    Добрый день

    Вопрос относительно оптимальности текста запроса.

    Предположим, имеются некоторые условия, значения которых известны на момент формирования текста запроса (т.е. не зависят от выбираемых данных) — например, это значения реквизитов формы, констант или опций.
    И в зависимости от этих условий в запросе выбираются различные данные или же накладываются дополнительные условия.

    Например,

    ВЫБРАТЬ

    ВЫБОР
    КОГДА &УчитыватьНДС
    ТОГДА Товары.Сумма * Товары.СтавкаНДС / 100
    ИНАЧЕ Товары.Сумма
    КОНЕЦ

    ИЗ
    Документ.Реализация.Товары КАК Товары

    ГДЕ
    Товары.Ссылка.Склад В (&СписокСкладов) ИЛИ НЕ &ИспользоватьСписокСкладов

    Здесь у запроса есть 2 параметра: &УчитыватьНДС и &ИспользоватьСписокСкладов, которые можно оработать не на уровне запроса, на на момент формирования запроса, т.е. можно изменять в зависимости от их значений сам текст запроса, например, если УчитыватьНДС = ЛОЖЬ и ИспользоватьСписокСкладов = ЛОЖЬ, то текс запроса можно написать в виде:

    ВЫБРАТЬ
    Товары.Сумма * Товары.СтавкаНДС / 100
    ИЗ
    Документ.Реализация.Товары КАК Товары

    Такое преобразование текста запроса представляется более оптимальным, чем включение условий в сам текст запроса, однако в типовых конфигурациях (в частности, в УТ) зачастую встречаю именно такой подход — включаются параметры в запрос, сам текст запроса становится универсальным, но, как я понимаю, менее оптимальным.

    Какой подход вы бы рекомендовали — обрабатывать условия в самом запросе, или, если возможно, до выполнения запроса, модифицируя текст запроса?
    Насколько эффективен и оправдан тот или иной метод?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  24. spv

    Добрый день

    Такая задача: на форме задан список, если в списке выбраны элементы, следует отобрать в запросе именно их, если же список пуст, следует включить в запрос все элементы.

    Помнится, в 7.7, если в запросе была конструкция вида [Товар В Список], в котором [Список] был пустым (не содержал элементов), фактически отключала это условие, т.е. в результат попадали все элементы.

    В языке запросов 1С 8.х, как будут обработаны условия вида [Товар В (&Список)] или [Товар В ИЕРАРХИИ(
    &Список)], если [&Список] — пустой массив или список? Насколько я понимаю, результат запроса в этом случае будет пустым?

    Я в запросах использую конструкцию
    [НЕ &ЕстьОтборПоТоварам ИЛИ Товар В (&СписокТоваров)],

    где
    Запрос.УстановитьПараметр(«ЕстьОтборПоТоварам», СписокТоваров.Количество() > 0)

    Есть ли другой, более оптимальный вариант решения?
    (Тем более учитывая рекомендацию не использовать ИЛИ в предложении ГДЕ запроса)

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

    • Панфилов Александр
      НЕ &ЕстьОтборПоТоварам ИЛИ Товар В (&СписокТоваров)

      (Тем более учитывая рекомендацию не использовать ИЛИ в предложении ГДЕ запроса)

      А я так понял, что рекомендация относится только на проверку ссылочных типов. Булево значение не требует ни SEEK ни SCAN….
      А вот для выражений типа:

      ГДЕ Номенклатура.ВидНоменклатуры=&Товар ИЛИ Номенклатура.ВидНоменклатуры=&Услуга

      СУБД не сможет использовать индекс.

      • Василий Ханевич

        …
        (текст комментария доступен только участникам Мастер-группы)

  25. nick_krsk

    Добрый день!
    Вопрос по уроку «Срез последних на каждую дату» (Query-9-Practice-1). Почему нельзя получить цену на момент продажи из второй временной таблицы (ВТ_Цены)? Не могу понять, для чего делается третий запрос пакета.

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • nick_krsk

        Спасибо за ответ. Еще вопрос. Задача аналогиная примеру: регистр остатков ВзаиморасчетыСКонтрагентами. Измерение: контрагент, ресурс: сумма. Нужно получить дату последнего прихода и его сумму (по каждому контрагенту).
        Пытаюсь сделать в два этапа:
        1. Получаю во временную таблицу максимальные даты приходов:
        ВЫБРАТЬ
        МАКСИМУМ(ВзаиморасчетыСКонтрагентамиОбороты.Период) КАК Период,
        ВзаиморасчетыСКонтрагентамиОбороты.Контрагент
        ПОМЕСТИТЬ ВТ
        ИЗ
        РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(, , Регистратор, ) КАК ВзаиморасчетыСКонтрагентамиОбороты
        ГДЕ
        ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход > 0

        СГРУППИРОВАТЬ ПО
        ВзаиморасчетыСКонтрагентамиОбороты.Контрагент
        ;

        2. Что нужно делать на втором этапе (чтобы получить сумму прихода)? Соединять ВТ с ВзаиморасчетыСКонтрагентамиОбороты по периоду? Но в один момент времени может быть несколько документов и запрос отработает некорректно.

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

  26. spv

    Добрый день

    Требуется выбрать штрихкоды для номенклатуры (только 1 штрихкод для номенклатуры)
    Как оптимальнее – отбор соединением или условием?

    |ВЫБРАТЬ
    | ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
    | МАКСИМУМ(ШтрихкодыНоменклатуры.Штрихкод) КАК Штрихкод
    |
    |ИЗ
    | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
    | ПО РеализацияТоваровУслугТовары.Номенклатура = ШтрихкодыНоменклатуры.Номенклатура
    |
    |ГДЕ
    | РеализацияТоваровУслугТовары.Ссылка = &СсылкаНаДокРеализации
    | И
    | НЕ ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО «»2%»»
    |
    |СГРУППИРОВАТЬ ПО
    | ШтрихкодыНоменклатуры.Номенклатура

    * ИЛИ *

    |ВЫБРАТЬ
    | ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
    | МАКСИМУМ(ШтрихкодыНоменклатуры.Штрихкод) КАК Штрихкод
    |
    |ИЗ
    | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
    | ПО РеализацияТоваровУслугТовары.Номенклатура = ШтрихкодыНоменклатуры.Номенклатура
    | И
    | РеализацияТоваровУслугТовары.Ссылка = &СсылкаНаДокРеализации
    | И
    | НЕ ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО «»2%»»
    |
    |СГРУППИРОВАТЬ ПО
    | ШтрихкодыНоменклатуры.Номенклатура

    * ИЛИ *

    |ВЫБРАТЬ
    | ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
    | МАКСИМУМ(ШтрихкодыНоменклатуры.Штрихкод) КАК Штрихкод
    |
    |ПОМЕСТИТЬ
    | втШтрихкодыНоменклатуры
    |
    |ИЗ
    | РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
    |
    |ГДЕ
    | ШтрихкодыНоменклатуры.Номенклатура В
    | (ВЫБРАТЬ РАЗЛИЧНЫЕ
    | РеализацияТоваровУслугТовары.Номенклатура
    | ИЗ
    | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    | ГДЕ
    | РеализацияТоваровУслугТовары.Ссылка = &СсылкаНаДокРеализации
    | )
    | И
    | НЕ ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО «»2%»»
    |
    |СГРУППИРОВАТЬ ПО
    | ШтрихкодыНоменклатуры.Номенклатура

    Кроме того, при использовании внутреннего соединения,
    есть ли разница, как выбирать:

    ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура

    или

    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  27. spv

    Добрый день

    Есть ли разница по эффективности между этими вариантами отбора по типу:

    ТИПЗНАЧЕНИЯ(ТоварыОрганизацийОстаткиИОбороты.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг))

    или

    ТоварыОрганизацийОстаткиИОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  28. spv

    Добрый день

    Имеется Запрос:

    ВЫБРАТЬ
    ТаблицаЗадолженностей.ДатаПлатежа КАК ДатаНачала,
    ГрафикиРаботы.Дата КАК ДатаОкончания,
    ВЫБОР
    КОГДА ГрафикиРаботы.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
    ИЛИ ГрафикиРаботы.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ КАК РабочийДень

    ПОМЕСТИТЬ Графики

    ИЗ
    ТаблицаЗадолженностей КАК ТаблицаЗадолженностей
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря КАК ГрафикиРаботы
    ПО ГрафикиРаботы.ПроизводственныйКалендарь = &Календарь
    ГДЕ
    ГрафикиРаботы.Дата МЕЖДУ ТаблицаЗадолженностей.ДатаПлатежа И &ДатаОтчета
    И ТаблицаЗадолженностей.ДатаПлатежа ДАТАВРЕМЯ(1, 1, 1)

    Вопрос: не эффективнее ли условие в разделе ГДЕ внести как условие соединения?
    т.е.

    ИЗ
    ТаблицаЗадолженностей КАК ТаблицаЗадолженностей
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря КАК ГрафикиРаботы
    ПО ГрафикиРаботы.ПроизводственныйКалендарь = &Календарь
    И (ГрафикиРаботы.Дата МЕЖДУ ТаблицаЗадолженностей.ДатаПлатежа И &ДатаОтчета)
    И ТаблицаЗадолженностей.ДатаПлатежа ДАТАВРЕМЯ(1, 1, 1)

    Вообще, насколько оптимально включать условия на данные в условие соединения вместо условия запроса (разумеется, при идентичности результатов)

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  29. spv

    Добрый день

    Есть справочник КлючиАналитикиУчетаПоПартнерам
    Реквизиты: Партнер, Контрагент, Организация

    Есть регистр накопления РасчетыСКлиентами
    Измерения: АналитикаУчетаПоПартнерам
    [тип: СправочникСсылка.КлючиАналитикиУчетаПоПартнерам]

    Есть регистр сведений АналитикаУчетаПоПартнерам
    Измерения: Партнер, Контрагент, Организация
    Ресурсы: КлючАналитики [тип: СправочникСсылка.КлючиАналитикиУчетаПоПартнерам]

    Требуется развернуть расчеты с партнерами по Организациям, Партнерам, Контрагентам

    Использую запрос:

    ВЫБРАТЬ
    РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Организация КАК Организация,
    РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
    РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Контрагент КАК Контрагент,
    РасчетыСКлиентами.СуммаКонечныйОстаток КАК ДолгПартнераКонечныйОстаток
    ИЗ
    РегистрНакопления.РасчетыСКлиентами.ОстаткиИОбороты() КАК РасчетыСКлиентами

    В типовой УТ увидел другой подход:

    ВЫБРАТЬ
    РасчетыСКлиентами.АналитикаУчетаПоПартнерам,
    РегистрАналитикаУчетаПоПартнерам.Организация КАК Организация,
    РегистрАналитикаУчетаПоПартнерам.Партнер КАК Партнер,
    РегистрАналитикаУчетаПоПартнерам.Контрагент КАК Контрагент,
    РасчетыСКлиентами.СуммаКонечныйОстаток КАК ДолгПартнераКонечныйОстаток

    ИЗ
    РегистрНакопления.РасчетыСКлиентами.ОстаткиИОбороты() КАК РасчетыСКлиентами
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК РегистрАналитикаУчетаПоПартнерам
    ПО РасчетыСКлиентами.АналитикаУчетаПоПартнерам = РегистрАналитикаУчетаПоПартнерам.КлючАналитики

    Второй вариант чем-то лучше, оптимальнее? Почему?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  30. Vit

    Добрые день,
    Василий помогите разобраться почему запрос1 выполняется гораздо медленнее чем запрос2, несмотря на что в запросе1 используются параметры виртуальной таблицы и надо ли использовать индекс в этих запросах?
    ЗАПРОС1:
    ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура
    ПОМЕСТИТЬ тзНоменклатура
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ГДЕ
    Номенклатура.Ссылка В(&СписокНоменклатуры)

    ИНДЕКСИРОВАТЬ ПО
    Номенклатура
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    СкидкиНаценкиНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    СкидкиНаценкиНоменклатурыСрезПоследних.ПроцентСкидкиНаценки КАК ПроцентСкидки
    ИЗ
    РегистрСведений.СкидкиНаценкиНоменклатуры.СрезПоследних(
    ,
    Номенклатура.Ссылка В
    (ВЫБРАТЬ
    тзНоменклатура.Номенклатура
    ИЗ
    тзНоменклатура КАК тзНоменклатура)) КАК СкидкиНаценкиНоменклатурыСрезПоследних
    ——————————————————————————
    ЗАПРОС2:
    ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура
    ПОМЕСТИТЬ тзНоменклатура
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ГДЕ
    Номенклатура.Ссылка В(&СписокНоменклатуры)

    ИНДЕКСИРОВАТЬ ПО
    Номенклатура
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    СкидкиНаценкиНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    СкидкиНаценкиНоменклатурыСрезПоследних.ПроцентСкидкиНаценки КАК ПроцентСкидки
    ИЗ
    тзНоменклатура КАК тзНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СкидкиНаценкиНоменклатуры.СрезПоследних(, ) КАК СкидкиНаценкиНоменклатурыСрезПоследних
    ПО тзНоменклатура.Номенклатура = СкидкиНаценкиНоменклатурыСрезПоследних.Номенклатура
    ГДЕ
    ЕСТЬNULL(СкидкиНаценкиНоменклатурыСрезПоследних.ПроцентСкидкиНаценки, 0) 0

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  31. MuratN

    Здравствуйте
    Параметры виртуальной таблицы
    ВЫБОР
    КОГДА &Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
    ТОГДА Организация ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
    ИНАЧЕ Организация = &Организация
    КОНЕЦ

    ВЫБОР
    КОГДА &Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
    ТОГДА Не Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
    ИНАЧЕ Организация = &Организация
    КОНЕЦ

    Вопрос говорят что в случае использование конструкции «не» может понижаться оптимизация.
    Пример: Не Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
    Это правда?

    А в случае Организация ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) это тоже происходит или нет?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • MuratN

        Опечатка вышла, имелось ввиду это:
        «ВЫБОР
        КОГДА &Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
        ТОГДА НЕ Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
        ИНАЧЕ Организация = &Организация
        КОНЕЦ»

        Допустим это виртуальная таблица остатков.

        Это на тот случай если в скд использовать вкл/откл параметры — не могу написать правильный синтаксис для параметров в фигурных скобках в параметрах в виртуальных таблиц.

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

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

      • MuratN

        «ТОГДА НЕ Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)»-А в этом случае оптимизация пострадает ?

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

  32. Necessitudo

    Добрый день! Имеет ли значение порядок связей на закладке «Связи», если я к примеру соединяю две временные таблицы, которые были предварительно проиндексированы?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  33. hjkl

    Добрый день.

    Еще вопросы:

    1) В каких случаях не надо индексировать поля временных таблиц?

    2) На сайте ИТС есть рекомендации по работе с запросами для СУБД POSTGRESQL- соединение со срезом последних, полное соединение и т.д. Вы наверно их видели. Там походу есть рекомендации и к другим субд при работе, но точно не помню уже.
    http://its.1c.ru/db/metod8dev#browse:13:-1:1981:1987 если что вот ссылка.

    Насколько имеет смысл следовать этим рекомендациям?

    Вопрос возник потому что разработчики типовых(во всяком случае казахстанских) следуют им чуть более чем никак, да и другие знакомые и незнакомые(но чей код я видел) поступают также. Ведь по идее конфигурация должна работать устойчиво на любых СУБД поддерживаемых платформой, а типовая особенно.
    А как поступаете вы?
    И согласны ли вы с тезисом про устойчивую работу конфигурации на разных СУБД?

    3) Вы рекомендуете помещать обращение к виртуальной таблице во временную, а уже потом временную соединять с чем либо, по той причине что виртуальная таблица по сути своей вложенный запрос а соединение с вложенным запросом может быть сделано не очень оптимально оптимизатором запроса?

    4) Я вот не очень понял, допустим:
    У регистра бухгалтерии 20 видов регистраторов.
    У 10 из них есть реквизит ИмяХ.
    Формируется запрос по виртуальной таблице оборотов этого регистра, с периодичностью регистратор и за определенный период.
    Одно из полей Регистратор.ИмяХ.
    В выборку попали 10 регистраторов различных видов. У 5 из них есть реквизит ИмяХ.

    Вопрос такой — неявное обращение будет ко всем таблицам документов, которые являются регистраторами этого регистра или только к 10, потому что 10 регистраторов различных видов попали в выборку.

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • hjkl

        Добрый день.

        Василий Ханевич.

        «4. Будет неявное обращение ко всем таблицам документов, которые являются регистраторами регистра. Все эти таблицы помещены в текст запроса, который будет передан платформой в СУБД. Когда реквизита ИмяХ у документа нет, то значение поля в результате запроса будет NULL. Разобрать такие ситуации можно при помощи консоли запросов с сайта ИТС, включив возможность выводить план запроса.» С этим понятно, спасибо большое.

        А если: формируется запрос по виртуальной таблице оборотов этого регистра, с периодичностью регистратор и за определенный период и помещается во временную таблицу. Затем строиться запрос по этой временной таблице и одно из полей Регистратор.ИмяХ. Остальные условия прежние.

        Сколько таблиц документов будет добавлено неявным левым соединением?

        Если вас не затруднит пожалуйста дайте ответ на этот вопрос в условиях серверной базы, в идеале конечно работающей под PostgreSQL или МS SQL.

        Я могу посмотреть только в файловой базе, но файловая меня не интересует — там все шустро работает. На серверной базе не могу посмотреть там линукс стоит и консоль запросов сообщает что не может показать план выполнения запросов на линуксе и PostgreSQL.

        Вопросы на засыпку:
        1) Как можно посмотреть этот самый план на линуксе? Если это в принципе возможно то есть ли готовые средства для этого например обработки(мб вам известны такие которые находятся в открытом доступе) или нужно создавать свои?
        2) В файловой базе план выполнения запроса формируется на языке встроенной в платформу СУБД?
        3) Чисто теоретически может ли запрос долго исполняться если неправильно настроена сама СУБД?
        Я конечно понимаю что это вопрос больше из области вашего курса по оптимизации 1С, но все же хотя бы скажите да или нет.
        Я так понимаю, что вы Василий ведете или являетесь автором или как то иначе связаны с курсом по оптимизации 1С, в связи с этим скажите пожалуйста — после прохождения курса по оптимизации 1С насколько могут повыситься шансы доказать админу что он настроил СУБД неверно или в случае чего самому настроить/ донастроить СУБД под работу с 1С? Это особенно касается СУБД которые не МS SQL.

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

          • hjkl

            Добрый вечер.

            Если подытожить то получается в случае когда нужно обращение к полю Регистратор.ИмяПоля в виртуальной таблице регистра оптимальнее положить результат обращения к виртуальной таблице без разыменования ссылочных полей (таких как регистратор или многотипное измерение) во временную таблицу, а уже в следующем запросе из временной таблицы производить разыменования ссылочных полей, поскольку это может сократить количество неявных левых соединений, так?

            Василий это последний вопрос в рамках этого курса т.к. завтра для меня закрывается мастер группа. Спасибо за ваши ответы, они позволили мне прояснить ряд очень тонких моментов.

            Надеюсь что можно будет оставить отзыв о курсе, не имея доступа в мастер группу.

            • Василий Ханевич

              …
              (текст комментария доступен только участникам Мастер-группы)

  34. hjkl

    Добрый день.

    Интересует запросы ролей, приведу пример(вчера химичил):

    Текст запроса для права добавление к справочнику:

    Номенклатура ИЗ Справочник.Номенклатура КАК Номенклатура
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    ТИПЗНАЧЕНИЯ(НастройкиПравДоступа.ТипОбъектов) КАК ТипЗначенияСсылки
    ИЗ
    РегистрСведений.НастройкиПравДоступа КАК НастройкиПравДоступа
    ГДЕ
    НастройкиПравДоступа.ЗначениеПрава
    И НастройкиПравДоступа.Пользователь = &ТекущийПользователь
    И НастройкиПравДоступа.Право = ЗНАЧЕНИЕ(Перечисление.ВидыПравДоступа.Добавление)) КАК ВложенныйЗапрос
    ПО (ТИПЗНАЧЕНИЯ(Номенклатура.Ссылка) = ВложенныйЗапрос.ТипЗначенияСсылки).

    РегистрСведений.НастройкиПравДоступа — непериодический регистр сведений.
    Пользователь(спр ссылка Пользовательи, Право(перечисления), ТипОбъектов(спр и док ссылка — программно пишется всегда пустое значение) — измерения.

    1) В шаблонах ролей часто (в типовых тоже) используются вложенные запросы — это потому что временные таблицы хотя их можно добавлять контр продуктивны с точки зрения
    производительности в ролевых запросах? С вашей точки зрения в подобных запросах тоже оптимальнее использовать временные таблицы?

    2) Например для права добавления нельзя указать конкретное поле — интерактивно во всяком случае. В такой ситуации значение права определяется пустотой результата
    запроса?

    3) Такой текст запроса возьмет все ссылки в справочнике — что есть не очень хорошо — их может быть много поскольку здесь идет связь на равенство типов
    очень пригодилось бы выбрать первые 1 это было бы достаточно — т.к. тип ссылок в таблице спр всегда будет одинаковый. Может вам известна какая нибудь не документированная особенность — или иной способ оптимизации?

    4) Что можно использовать в качестве параметров запроса у ролей — параметры сеанса — &ТекущийПользователь. Говорят что можно использовать функциональные опции — это правда? Если да можно ли это делать в не управляемом интерфейсе? Что еще можно использовать в качестве параметров запроса у ролей?

    5) Не слишком ли подобный запрос будет напрягать систему — и м.б. такую задачу оптимальнее решать через подписку на события «Перед записью» — «Если Условие тогда отказ; КонецЕсли;». Ведь запрос в ролях не панацея и иногда оптимальнее решить вопрос кодом.

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • hjkl

        Добрый день. Василий. Спасибо за пример с ролевого запроса.

        Относительно ролевых запросов появились еще вопросы:

        1) А можно ли как нибудь унифицировать ваш пример ролевого запроса с целью его использования шаблоне — как то передавать тип текущей таблицы, (если такое вообще возможно):

        ТекущаяТаблица из #ТекущаяТаблица КАК ТекущаяТаблица
        ГДЕ
        1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1
        ИЗ
        РегистрСведений.НастройкиПравДоступа КАК НастройкиПравДоступа
        ГДЕ
        ТипЗначения(НастройкиПравДоступа.Объект) = &ТипТекущейТаблицы
        И НастройкиПравДоступа.Пользователь = &ТекущийПользователь
        И НастройкиПравДоступа.Право = ЗНАЧЕНИЕ(Перечисление.ВидыПравДоступа.Добавление))

        2)А также наткнулся в типовых шаблонах на следующую не очень мне понятную ситуацию:
        1) Вызов шаблона
        #ОрганизацияСтруктурноеПодразделениеДляДокументов_Запись(«Организация», «СтруктурноеПодразделение»)
        2)В тексте шаблона встречаются
        1 // Параметр 1 — имя реквизита «Организация»
        // Параметр 2 — имя реквизита «СтруктурноеПодразделение»
        2 «…ТОГДА ТекущаяТаблица.#Параметр(1)» и » ТОГДА ТекущаяТаблица.#Параметр(2) …».
        Можно ли передавать сюда не имена реквизитов? Например число или ссылку?
        Я так понимаю это реквизиты текущей таблицы но как она может быть связана в такой ситуации:
        …
        (ВЫБРАТЬ ПЕРВЫЕ 1 1
        ИЗ
        РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей ПО НастройкиПравДоступаПользователей.ОбъектДоступа = ВЫБОР

        ##Если &ИспользоватьОграничениеПоОрганизации ##Тогда
        КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации) ТОГДА ТекущаяТаблица.#Параметр(1) ##КонецЕсли

        ##Если &ИспользоватьОграничениеПоСтруктурныеПодразделения ##Тогда
        КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.СтруктурныеПодразделения)
        ТОГДА ТекущаяТаблица.#Параметр(2)
        ##КонецЕсли
        КОНЕЦ

        И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа
        И НастройкиПравДоступаПользователей.ОбластьДанных = ВЫБОР

        ##Если &ИспользоватьОграничениеПоОрганизации ##Тогда
        КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
        ТОГДА ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ОрганизацииДанные)
        ##КонецЕсли

        ##Если &ИспользоватьОграничениеПоСтруктурныеПодразделения ##Тогда
        КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.СтруктурныеПодразделения)
        ТОГДА ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.СтруктурныеПодразделенияДанные)
        ##КонецЕсли
        КОНЕЦ

        И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей
        И НастройкиПравДоступаПользователей.Запись = ИСТИНА ГДЕ
        НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
        И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа В
        (##Если &ИспользоватьОграничениеПоОрганизации ##Тогда
        ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
        ##КонецЕсли

        ##Если &ИспользоватьОграничениеПоСтруктурныеПодразделения ##Тогда
        ##Если &ИспользоватьОграничениеПоОрганизации ##Тогда
        ,##КонецЕсли
        ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.СтруктурныеПодразделения)
        ##КонецЕсли)
        И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL)))
        …
        Это часть шаблона — вложенный запрос в условии текущий таблицы, но каким боком здесь ТекущаяТаблица.#Параметр(1) ведь ТекущаяТаблица не фигурирует в этом вложенном запросе.

        Чем ## отличается от #?

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

  35. FreeArcher

    Добрый день!

    Хочу уточнить вопрос с использованием подзапросов.
    Как правило задачу можно решить через подзапросы или через последовательность временных таблиц.

    Правильно ли я понял, что подзапросы вредны, только когда с ними будет в дальнейшем соединение?

    А если соединений нет, то подзапросы предпочтительнее временных таблиц из-за экономии памяти?

    p.s.
    Вопрос применительно к задачам на подобии №31 (это где последовательность дат надо получить).

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

    • Панфилов Александр

      Использование временных таблиц:
      1) упрощает чтение запроса — более очевидны данные, получаемые на каждом шаге
      2) облегчает отладку запроса — данные полученные подзапросом невозможно посмотреть после выполнения запроса, а данные временной таблицы можно «выдернуть» из менеджера в, например, таблицу значений, которую можно просмотреть в отладчике не меня кода, особенно типового. Для этого использую экспортную функцию, которая по переданному запросу и имени вт возвращает таблицу значений. Ставлю точку останова после строки

      РезультатЗапроса = Запрос.Выполнить()

      и по Shift+F9 просматриваю значение, возвращаемое моей функцией.

      • Василий Ханевич

        …
        (текст комментария доступен только участникам Мастер-группы)

  36. FreeArcher

    Добрый день!

    Скажите, а как происходит выбор левой таблицы при левом соединении?
    Например, мы соединим ЗаказыКлиентовОстатки с таблицей документа ЗаказКлиента.Товары по номенклатуре. На первую таблицу будут условия наложены, а на вторую нет. При этом будет ли оптимально работать запрос или таблица ЗаказКлиента.Товары сначала вся полностью будет прочитана SQL сервером, а только потом наложится отбор соединением?

    Я провел эксперимент, если обрамить ЗаказКлиента.Товары во временную таблицу, то запрос выполняется значительно дольше чем когда соединение сразу сделано, но сомнения остались, нужно ли дополнительно ограничивать вторую таблицу (периодом, например).

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  37. barneotec

    Добрый день, Василий, вопрос по индексам:
    допустим у нас есть некая таблица с колонками: Период, Номенклатура, Количество; и кластерный индекс по колонкам Период и Номенклатура. Как будет осуществляться поиск: сначала по Периоду найдутся искомые записи, затем по ним будет произведен поиск по Номенклатуре? Или для нее существует отдельное дерево? В голове не укладывается как это организовано

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  38. SergeyD

    Добрый день, Василий.
    1) Наткнулся на пример «ручного» управления блокировкой http://v8.1c.ru/overview/Term_000000642.htm В котором меня смущает конструкция «ДЛЯ ИЗМЕНЕНИЯ» в запросе, работающая только в автоматическом управлении блокировками данных раз, а во вторых заменяемая в управленческом режиме установкой ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный.
    Я правильно понимаю, что в этом примере «ДЛЯ ИЗМЕНЕНИЯ» не должно быть или что-то путаю?

    2) В режиме управления блокировкой данных «Управляемый», если нет «ручного» управления блокировкой, описанного разработчиком, то дальнейшее управление блокировками СРАЗУ отдается СУБД невзирая на определенные риски целостности и непротиворечивости данных? Или всё таки платформа может сама расставлять блокировки в Управляемом режиме, например, смотря на объекты участвующие в неявных транзакциях и блокируя их?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  39. AleksSF

    Здравствуйте.
    Не совсем понял про «Использование ИЛИ в условиях».
    У Вас сказано: «Простого универсального способа переписать запрос без использования ИЛИ не существует.» А разве вместо «А ИЛИ В» нельзя написать «НЕ(НЕ А И НЕ В). Или я не прав.

    ВЫБРАТЬ
        Номенклатура.ВидНоменклатуры,
        Номенклатура.Наименование
    ИЗ
        Справочник.Номенклатура КАК Номенклатура
    ГДЕ
        Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
        ИЛИ Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
    ВЫБРАТЬ
        Номенклатура.ВидНоменклатуры,
        Номенклатура.Наименование
    ИЗ
        Справочник.Номенклатура КАК Номенклатура
    ГДЕ
        НЕ (НЕ (Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар))
        И НЕ (Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)))

    По заданию: 4409 и 198

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  40. 13jaguar

    Здравствуйте.
    В методичке (стр.249) написано: При использовании автоматических блокировок применяется уровень изоляции транзакций Serializable, поэтому существуют блокировки диапазона ключа индекса, пустая таблица в этом случае окажется заблокированной целиком. Избежать таких блокировок можно, удалив программный код записи движений из пустой табличной части.
    Хотелось бы поподробнее об этом, формулировка не совсем понятна. Что значит «удалить программный код…»?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • 13jaguar

        Значит, перед попыткой записи в такой регистр надо проверить его на пустоту и отказаться от записи до начала транзакции? Например, установить Отказ = Истина в обработчике события «ПередЗаписью()» менеджера набора записей?

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

  41. codexa

    Добрый день!
    В методическом материале дается рекомендация не использовать функции от параметров запроса.
    «НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)
    СУБД не поймет, что это «константа» – значение типа Дата.»
    Не могли бы Вы объяснить подробнее, с чем связано такое ограничение? СУБД не сможет определить тип или не поймет, что это «константа»? Будет пытаться искать несуществующую таблицу?
    А если, например, мне нужно от параметра вычислить 3 значения?
    ДОБАВИТЬКДАТЕ(&Дата, МЕСЯЦ, 1)
    ДОБАВИТЬКДАТЕ(&Дата, МЕСЯЦ, 2)
    ДОБАВИТЬКДАТЕ(&Дата, МЕСЯЦ, 3)
    Получается, что их надо будет передавать тремя параметрами &Дата1 &Дата2 &Дата3, заранее вычисленными во встроенном языке?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  42. Yarsan

    Добрый день!
    Вопрос по заданию 30.
    Сделал замер производительности, но в нем показывается что строка обращения к номенклатуре через ссылку занимает 2.7 секунды, но не показывает что практически все остальное время занимает сообщение.
    Для наглядности я бы предложил делать так

    Процедура Сформировать1НаСервере()
    НачДата = ТекущаяУниверсальнаяДатаВМиллисекундах();

    Запрос = Новый Запрос;
    Запрос.Текст =
    «ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура»;

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ТекНаименование = ВыборкаДетальныеЗаписи.Ссылка.Наименование;
    КонецЦикла;

    КонДата = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ДатаИтог = КонДата-НачДата;
    Сообщить(«Всего, в запросе Ссылка-«+ДатаИтог+» секунд»);
    КонецПроцедуры

    ssilka.PNGnaimenovanie.PNG

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Yarsan

        Для ВыборкаДетальныеЗаписи.Ссылка.Наименование
        2650, 3640, 3420-миллисекунд
        Для ВыборкаДетальныеЗаписи.Наименование
        20, 20, 30-миллисекунд

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

  43. is69

    Добрый день ! Скажите, а в каких ваших видеоуроках (курсах) есть развёрнутый материал по блокировкам (S, U, X, управляемые, автоматические и пр.) ?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  44. is69

    Добрый день ! Требования к индексам в запросах для получения максимальной производительности при получении данных из регистров понятны. А есть аналогичные требования, правила к индексам в запросах для максимальной производительности при получении данных из документов и справочников ?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  45. mtv911

    Добрый день!

    В методических материалах курса в главе «Не использовать запрос в цикле» (стр. 245) есть абзац:
    «Если же отказаться от запроса в цикле нельзя, то нужно вынести создание запроса за пределы цикла, а в цикле изменять только параметры запроса. Это позволит избежать многократной синтаксической проверки текста запроса».

    У меня вопрос: «В какой момент происходит синтаксическая проверка текста запроса?».

    Если синтаксическая проверка текста запроса происходит при выполнении метода Запрос.Выполнить(), то вышеприведенная рекомендация: «…вынести создание запроса за пределы цикла…» некорректна. Ведь метод Запрос.Выполнить() все равно выполняется в теле цикла.

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Панфилов Александр

        1) в версии методического пособия на сентябрь 2015 года текст тот же.
        2) 1с работает как интерпретатор, насколько я понял, часть работы по разбору текста запроса выполняется в момент выполнения команды:

        Запрос.Текст = "Выбрать ....";

        Ведь мы ещё до команды Запрос.Выполнить() уже используем, например, Запрос.НайтиПараметры() !!!
        И именно поэтому существуют рекомендации: при «динамической» сборке текст запроса сначала получить окончательный текст запроса, а уже затем передавать его в объект типа запрос.

        ТекстЗапроса = "Выбрать * Из "+ИмяТаблицы;
        ....
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбора", "Организация=&Организация и Контрагент=&Контрагент");
        ....

        Запрос.Текст = ТекстЗапроса;

        Так что некоторый выигрыш в производительности должен быть…

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

  46. marivgo

    Добрый день!
    Вопрос по блокировкам. В таблице совместимости блокировок говорится о том, какие блокировки совместимы друг с другом. Но не совсем понятно, как они влияют на чтение данных, которое выполняется вне транзакций (или в рамках транзакции обработки проведения, но без наложения блокировки). По S и U понятно — поскольку они совместимы с блокировкой чтения S, то не должны препятствовать чтению данных, выполняемому без блокировок. А как насчет Х? (Х — это то же самое, что и исключительная блокировка в 1С?) Может ли быть такая ситуация, что после наложения Х-блокировки (или исключительной в управляемом режиме) кто-то другой до наложения своей блокировки считает заблокированные ей данные, а потом начнет свою транзакцию, дождавшись окончания Х-блокировки, без повторного считывания данных? Другими словами, решается ли проблема «грязного чтения» установкой исключительной блокировки (так, что она не дает эти данные вообще никому прочитать), или это задача того, кто выполняет чтение, наложить свою исключительную блокировку до чтения, если он планирует начать изменять эти данные и хочет, чтобы они оставались неизменными с момента чтения?

    Я пыталась читать про блокировки в разных источниках, но нигде не нашла полностью понятного описания. Наверное, с этим связаны проблемы понимания этой темы у многих. Если по другим темам обычно есть материалы с нуля, то когда доходит до транзакций и блокировок, то считается, что разработчик уже и так опытный, и обычно сразу начинают использоваться более продвинутые термины, как «уровень изоляции транзакции», но не всегда понятно, от каких именно действий эта изоляция, то есть нет простого исчерпывающего описания возможных ситуаций (мне кажется, что таких ситуаций должно быть не так уж много, поэтому можно было бы их перечислить).

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • marivgo

        Спасибо большое за подробный ответ! Да, теперь стало намного понятнее. Я получила ответ на свой главный вопрос — по поводу блокировки Х. Она запрещает чтение только в рамках транзакции. То есть если другой разработчик планирует изменять данные после выполнения какой-то проверки, то он должен обязательно читать данные в рамках своей транзакции, а не вне ее. В принципе, логично и можно было бы самостоятельно догадаться:) Но всегда приятно, когда есть четкое описание поведение системы. И еще видимо остается вероятность, хотя и маленькая, считывания в отчетах данных, которые записала еще не завершенная транзакция, поскольку исключительная блокировка позволяет читать данные вне транзакции, что может происходить в отчетах. Спасибо за ссылку, обязательно посмотрю, хотя мой основной вопрос уже снят.

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

  47. Максим

    Добрый день!
    По оптимизации, к сожалению, не хватает теории.
    В процессе прохождения курса, я выяснил, в частности, что есть механизмы соединения таблиц nested loops и merge (не знаю, все это механизмы или ещё какие есть). Из общих понятий, знаю, что есть механизм поиска, так называемый, table scan, а есть более продвинутые методы поиска (даже не помню как называется). На этом все мои понятия теории закончились :) Насколько я знаю, всех этих понятий не очень много, не могли бы вы более подробно раскрыть эту тему, рассказать что есть, и как это работает на более детальном уровне?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Максим

        Я конечно подозревал что мои вопросы совсем чуть-чуть выходят за рамки курса… :)
        Спасибо за ссылки :)
        Там ниже есть ещё один мой вопрос про блокировки, в принципе на большую часть вопроса вы уже ответили, но есть некоторые вопросы-уточнения. Возможно, это действительно выходит за рамки курса, но не могли бы вы тот вопрос разобрать до логического конца? А я постараюсь больше не задавать вопросы, которые выходят за рамки этого курса :)

  48. Максим

    Добрый день!
    С блокировками запутался.
    Давайте по порядку. Я скажу всё, что понял, поправьте, пожалуйста, где не прав.
    s — блокировка: разделяемая блокировка. Устанавливается (если сможет установиться) в момент чтения данных из таблицы, чтобы другая транзакция ничего не изменила до окончания текущей транзакции.
    x — блокировка: исключительная блокировка. Накладывается для изменения данных. блокировка может быть наложена, только если нет ни одной другой блокировки на эти данные (в том числе отсутствуют s-блокировки). Нужна для того, чтобы изменить данные в таблице. Требует отсутствия s-блокировок для того, чтобы данные в других транзакциях были актуальными.
    u-блокировка: блокировка обновления. Нужна, чтобы решить конфликт блокировок, когда две s-блокировки одновременно пытаются наложить x-блокировку. В какой вообще момент и кем накладывается u-блокировка? И какая будет последовательность действий, если две s-блокировки захотят наложить x-блокировку на одни и те же данные?

    И мы сейчас говорим про автоматические блокировки, или и про автоматические и про управляемые? В управляемых блокировках есть только два режима блокировок — разделяемый и исключительный (режим задается соответствующим свойством). Где u-блокировка?
    Когда в запросе мы пишем «для изменения», как я понял, накладывается исключительная блокировка. Как поведёт себя система, если другой транзакцией была наложена другая блокировка?
    В 8.2 для регистров появилось поле «блокировать для изменения». Это касается только управляемых блокировок. В этом случае тоже накладывается исключительная блокировка?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Максим

        >>Вот тут на помощь как раз и приходит U-блокировка, которая совместима с разделяемой (S) блокировкой, но с самой собой уже не совместима, установить такую блокировку параллельно сможет только одна транзакция. Чтобы использовалась U-блокировка, в текст запроса на языке 1С необходимо использовать конструкцию ДЛЯ ИЗМЕНЕНИЯ.

        Хорошо. T1 установила U-блокировку. Видимо далее T1 будет пытаться установить x-блокировку, но ей не удастся до тех пора, пока есть s-блокировка у Т2. Как в это время поведёт себя T2, которая тоже хочет установить U-блокировку, но у неё это не получается? Если происходит освобождение ресурса у т2, тогда эта транзакция откатывается?
        И что будет, если появится Т3, которая хочет наложить s-блокировку на данные, на которых уже u-блокировка? По таблице совместимости у неё получится это сделать. И если и третья транзакция наложит s-блокировку на данные, то теоретически u-блокировка никогда не станет x-блокировкой. Или как происходит процесс в этом случае?

        >>В управляемом режиме рассматриваемой проблемы не существует

        Почему? Как тогда управляемый режим обходится без u-блокировок? там другая таблица совместимости блокировок?
        И я правильно понимаю, что при автоматическом режиме блокировок сами блокировки накладывает только субд, а не платформа? А в управляемом режиме — блокировки накладываются уже на стороне сервера 1с и транслируются в субд?

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

  49. marivgo

    Добрый день!
    У меня вопрос по поводу попадания в индекс. Если в секции ПО или ГДЕ запроса используются поля, входящие в составной индекс и, возможно, еще другие поля, и при этом все условия соединяются логическим И, имеет ли значение порядок задания этих условий разработчиком? Или платформа сама может поменять поля местами в порядке их следования в индексе?

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

  50. venvlad

    Добрый день. Подскажите, пожалуйста, как оптимизировать запрос:

    ВЫБРАТЬ
    Регистр.Документ1
    Регистр.Документ2
    ИЗ
    РегистрСведений.ДанныеАналитики КАК Регистр
    ГДЕ
    (Регистр.Документ1 В (&СписокДоков)
    ИЛИ Регистр.Документ2 В (&СписокДоков))

    • Василий Ханевич

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Панфилов Александр

        Так как у нас используется невзаимоисключающее условие: (Регистр.Документ1 В (&СписокДоков) ИЛИ Регистр.Документ2 В (&СписокДоков)), то необходимо использовать объединение «ОБЪЕДИНИТЬ» вместо «ОБЪЕДИНИТЬ ВСЕ» во избежание дублирования записей!

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

      • vista77219

        Добрый день!

        Извините и думаете поможет?

        Смысл избавляться от одного ИЛИ Когда у ВАС

        «ГДЕ Регистр.Документ1 В (&СписокДоков) Источник: ©Курсы-по-1С.рф »

        В (&СписокДоков) это тот же ИЛИ.

        Все равно будет сканирование кластеризованного индекса

        Или я ошибаюсь?

        Спасибо

        • Василий Ханевич

          …
          (текст комментария доступен только участникам Мастер-группы)

Комментарии закрыты