RE: Как модифицировать запрос для системы компоновки данных в 1С?

#33280
bot_avaOdin — Одинэсник
Участник

    Для использования данного запроса в системе компоновки данных (СКД) в 1С необходимо:

    1. Убрать комментарии из текста запроса (СКД не поддерживает комментарии в запросе).
    2. Заменить параметры на параметры СКД (например, &НаименованиеОперации).
    3. Убедиться, что все функции и конструкции поддерживаются СКД (функция ЕСТЬNULL поддерживается, ВЫБОР тоже).
    4. В СКД запросы пишутся в обычном синтаксисе 1С, но с некоторыми ограничениями.

    Ниже приведён пример модифицированного запроса для СКД с параметром НаименованиеОперации:

    bsl
    ВЫБРАТЬ
      НАЧАЛОПЕРИОДА(ЭМИСменноеЗадание.Дата, ДЕНЬ) КАК Дата,
      ЭМИСменноеЗаданиеСостав.НаименованиеОперации КАК Операция,
      СУММА(ЭМИСменноеЗаданиеСостав.Количество) КАК КоличествоПоПлану,
      СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) КАК КоличествоФакт,
      ЕСТЬNULL(Нормативы.КоличествоПоНормативу, 0) КАК КоличествоПоНормативу,
      (СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) - ЕСТЬNULL(Нормативы.КоличествоПоНормативу, 0)) КАК Отклонение,
      ВЫБОР
        КОГДА СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) > ЕСТЬNULL(Нормативы.КоличествоПоНормативу, 0)
          ТОГДА "Выше нормы"
        КОГДА СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) < ЕСТЬNULL(Нормативы.КоличествоПоНормативу, 0)
          ТОГДА "Ниже нормы"
        ИНАЧЕ "Соответствует норме"
      КОНЕЦ КАК СтатусВыполнения
    ИЗ
      Документ.ЭМИСменноеЗадание КАК ЭМИСменноеЗадание
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭМИСменноеЗадание.Состав КАК ЭМИСменноеЗаданиеСостав
        ПО ЭМИСменноеЗадание.Ссылка = ЭМИСменноеЗаданиеСостав.Ссылка
        ЛЕВОЕ СОЕДИНЕНИЕ
          (ВЫБРАТЬ
             НормативыЗагрузкиПроизводстваСрезПоследних.Операция КАК Операция,
             НормативыЗагрузкиПроизводстваСрезПоследних.Количество КАК КоличествоПоНормативу
           ИЗ
             РегистрСведений.НормативыЗагрузкиПроизводства.СрезПоследних КАК НормативыЗагрузкиПроизводстваСрезПоследних
           ГДЕ
             НормативыЗагрузкиПроизводстваСрезПоследних.Операция = &НаименованиеОперации
          ) КАК Нормативы
        ПО ЭМИСменноеЗаданиеСостав.НаименованиеОперации = Нормативы.Операция
    ГДЕ
      ЭМИСменноеЗадание.Проведен
      И ЭМИСменноеЗаданиеСостав.НаименованиеОперации = &НаименованиеОперации
    ГРУППИРОВАТЬ ПО
      НАЧАЛОПЕРИОДА(ЭМИСменноеЗадание.Дата, ДЕНЬ),
      ЭМИСменноеЗаданиеСостав.НаименованиеОперации
    УПОРЯДОЧИТЬ ПО
      Дата
    

    **Особенности для СКД:**

    — Параметр `&НаименованиеОперации` нужно добавить в параметры отчёта в СКД.
    — В СКД нельзя использовать вложенные запросы в FROM, поэтому левое соединение с подзапросом может не работать напрямую. В этом случае можно вынести нормативы в отдельный набор данных и связать их через механизм связей наборов данных в СКД.
    — Если требуется объединить данные из нескольких наборов данных, то в СКД создают несколько наборов данных и связывают их по ключам.

    ### Рекомендации по реализации в СКД:

    1. Создайте два набора данных:

    — Первый набор данных — запрос по документу ЭМИСменноеЗадание и его составу (без нормативов).
    — Второй набор данных — запрос по регистру сведений НормативыЗагрузкиПроизводства.СрезПоследних.

    2. В схеме компоновки данных создайте связь между наборами данных по полю Операция.

    3. В отчёте используйте вычисляемые поля для расчёта отклонения и статуса выполнения, например:

    bsl
    Отклонение = КоличествоФакт - КоличествоПоНормативу
    СтатусВыполнения = ВЫБОР
      КОГДА КоличествоФакт > КоличествоПоНормативу ТОГДА "Выше нормы"
      КОГДА КоличествоФакт < КоличествоПоНормативу ТОГДА "Ниже нормы"
      ИНАЧЕ "Соответствует норме"
    КОНЕЦ
    

    4. Параметр `НаименованиеОперации` добавьте в параметры отчёта.

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

    Рекомендую посмотреть здесь: https://infostart.ru/public/1896711/

    База знаний 1С