Продвинутый курс. Домашнее задание №8

Третье задание по 1-му блоку продвинутого курса.

Для выполнения рекомендуется изучить следующие главы 1-го блока.
Глава 6. Построитель отчета и построитель запроса.
Глава 7. Запросы.

В этой же теме необходимо написать отчет о выполнении задания.

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

комментариев 85 на “Продвинутый курс. Домашнее задание №8”

  1. Александр Горлов 14.12.2010 в 20:12

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

    • Да, Александр, такой день нужно учитывать.
      Модифицировал пример, спасибо.

  2. Выполнено. Немного поотстал, нагоняю.

  3. Выполнено

  4. Мне трудно это понять ;) Я всегда читаю текст запроса, чтобы понять, что он делает, а конструктор использую не более чем помогалку визуальную. Но вы, судя по урокам, наоборот – текст используете как помогалку ;)
    Если бы я сам не увидел, никогда бы не поверил, что так можно писать запросы. Повторюсь, я под впечатлением!

    • Александр Горлов 14.12.2010 в 20:19

      Работая с SQL в Oracle я тоже волей-неволей научился читать текст запроса глазами. Должен сказать, что это весьма небесполезный навык при работе с запросами 1С.
      Однако при разработке конструктора запросов в платформе ребята потрудились на славу! Надо отдать должное разработчикам платформы – теперь действительно в текст запроса можно не заглядывать – он отлично собирается/разбирается конструктором. Вместо печатания текста сосредотачиваешься на мышлении уровня таблиц, а не написания синтаксических конструкций.
      Посмею предположить, что до создания СКД это был самый грандиозный прорыв в визуализации на платмформе 1С:Предприятие 8.

      • Вот еще бы реализовали пожелание, которому уже 6 лет:
        Сохранение коментов в запросе при использовании конструктора..

        • Присоединяюсь. Очень полезная была бы штука!

  5. Выполнил.  Крутое домашнее задание – заставляет и без Nuts  врубать мозг. Жду ответного хода от Евгения.

  6. ДЗ 8 Выполнил
    1. Считаю что регистре “ГрафикиРаботы” определены рабочие дни без учета выходных и праздничных дней. Соединив график с остатками и оборотами полученный результат еще раз с остатками и оборотами. В вообщем получил рабочие дни с остатками. Далее соединив с продажи обороты считаю, что если в данный день есть или остаток или оборот по продаже, то это наш день т.е. 1. Дальше просто количество дней есть оборот тоже.
    2. Делал на регистре взаиморасчеты типовой УПП. На основе остатков и оборотов по дням, получил таблицу, соединив саму с собой получил таблицу с остатками и количеством дней сколько был данный остаток. Скорректировал количество дней в конце периода т.е. +1 . Дальше просто положительные остатки в одну колонку, отрицательные в другую ну и не забыть умножить на количество дней.

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

     

    • Задание 2 выполнил.
      Выполнял на типовой конфигурации.
      ВЫБРАТЬ
      Взаиморасчеты.Период,
      Взаиморасчеты.Контрагент КАК Контрагент,
      ВЫБОР
      КОГДА Взаиморасчеты.СуммаВзаиморасчетовКонечныйОстаток > 0
      ТОГДА Взаиморасчеты.СуммаВзаиморасчетовКонечныйОстаток * РАЗНОСТЬДАТ(Взаиморасчеты.Период, МИНИМУМ(ВЫБОР
      КОГДА ВзаиморасчетыДоп.Период ЕСТЬ NULL
      ТОГДА ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 1)
      ИНАЧЕ ВзаиморасчетыДоп.Период
      КОНЕЦ), ДЕНЬ)
      ИНАЧЕ 0
      КОНЕЦ КАК УровеньДебиторскойЗадолженности,
      ВЫБОР
      КОГДА Взаиморасчеты.СуммаВзаиморасчетовКонечныйОстаток < 0
      ТОГДА Взаиморасчеты.СуммаВзаиморасчетовКонечныйОстаток * РАЗНОСТЬДАТ(Взаиморасчеты.Период, МИНИМУМ(ВЫБОР
      КОГДА ВзаиморасчетыДоп.Период ЕСТЬ NULL
      ТОГДА ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 1)
      ИНАЧЕ ВзаиморасчетыДоп.Период
      КОНЕЦ), ДЕНЬ)
      ИНАЧЕ 0
      КОНЕЦ КАК УровеньКредиторскойЗадолженности
      ИЗ
      РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК Взаиморасчеты
      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК ВзаиморасчетыДоп
      ПО Взаиморасчеты.Период < ВзаиморасчетыДоп.Период

      СГРУППИРОВАТЬ ПО
      Взаиморасчеты.Период,
      Взаиморасчеты.Контрагент,
      Взаиморасчеты.СуммаВзаиморасчетовКонечныйОстаток
      ИТОГИ
      СУММА(УровеньДебиторскойЗадолженности),
      СУММА(УровеньКредиторскойЗадолженности)
      ПО
      ОБЩИЕ,
      Контрагент
       

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

    СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Номенклатура
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ГрафикиРаботы.Дата
    ПОМЕСТИТЬ График
    ИЗ
    РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
    ГДЕ
    ГрафикиРаботы.ТипГрафика = &ТипГрафика
    И ГрафикиРаботы.Дата >= &Начало
    И ГрафикиРаботы.Дата <= &Конец
    И ГрафикиРаботы.Значение = 1
    ;

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

    СГРУППИРОВАТЬ ПО
    ОстаткиТоваровОстаткиИОбороты.Номенклатура
    ;

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

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТ.Контрагент,
    ВТ.Период,
    ВТ.СуммаНачальныйОстаток,
    МАКСИМУМ(ВТ1.Период) КАК Период1
    ПОМЕСТИТЬ ВТ2
    ИЗ
    ВТ КАК ВТ
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
    ПО ВТ.Контрагент = ВТ1.Контрагент
    И ВТ.Период > ВТ1.Период

    СГРУППИРОВАТЬ ПО
    ВТ.Контрагент,
    ВТ.Период,
    ВТ.СуммаНачальныйОстаток
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТ2.Контрагент,
    ВЫБОР
    КОГДА ВТ2.СуммаНачальныйОстаток > 0
    ТОГДА РАЗНОСТЬДАТ(ВТ2.Период1, ВТ2.Период, ДЕНЬ) * ВТ2.СуммаНачальныйОстаток
    ИНАЧЕ 0
    КОНЕЦ КАК Дебиторка,
    ВЫБОР
    КОГДА ВТ2.СуммаНачальныйОстаток < 0
    ТОГДА РАЗНОСТЬДАТ(ВТ2.Период, ВТ2.Период1, ДЕНЬ) * ВТ2.СуммаНачальныйОстаток
    ИНАЧЕ 0
    КОНЕЦ КАК ПолученныеКредиты
    ИЗ
    ВТ2 КАК ВТ2

  9. Филимонов Юрий 12.12.2010 в 20:55

    Задание выполнено.
    Задача  №1. Пришлось помучиться – в результате получилось решить пакетным запросом. Получение остатков на каждый день реализовал перебором физической таблицы регистра. Думаю это не слишком оптимально, жду решения Мастера.
    Задача №2. Получилось все достаточно легко, однако “физический” смысл полученных показателей не очень понятен. Но для учебной задачи вполне интересно

  10. Вопрос по первому заданию  – если не использовать партионку, то каким образом определить срок нахождения на складе для товара  поступившего двумя партиями ? Например поступил товар А скажем 5 и 10 числа , а продан 20 числа весь . Какой будет срок нахождения на складе ? Я рискнул предположить что средний –  в данном случае  выходит : (15 +10 )/2 = 12,5 .
     
     

    • Вы не указали количество. Пусть будет по 10 штук поступление 5-го и 10-го.
      С 5-го по 10-е (пусть будет 5 дней) на складе было 10 штук товара.
      С 10-го по 20-е (8 дней с учетом выходных) на складе было 20 штук товара.
      Средняя скорость:
      30 штук/13 дней = 2.3 штуки в день.

      • В условиях задачи написано  – “Где “Колво” – общий объем реализации за указанный период” , в данном случае количество продажи за период =  20  а не 30 , тогда средняя скорость равна 20/13 , или я что то недопонял ??

        • Да, все верно. Я ошибся.
          Скорость = 20/13.

      • И ещё небольшая непонятка с заданием 1 . В тексте задания сказано – “Дни –
        количество дней за период, когда указанный товар был на складе” .
        Период задаётся в диалоге , значит ” Дни ” – число дней  которые товар лежал на складе считая  от начала периода в диалоге ?

        • Именно так.
          Сейчас в тексте задания сделаю пример, чтобы было понятно что требуется получить.

          • Спасибо , пример помог ) А то я сначала грешным делом подумал что надо отслеживать сколько КАКАЯ партия товара лежала на складе .

  11. progr-2008 10.12.2010 в 23:28

    Сделала 1-е задание.
     Пробовала разные варианты, решила через пакетный запрос с формированием временных таблиц.
     1) ВТПродажиОбороты из ПродажиОбороты за период, указанный в параметрах виртуальной таблицы
    2)ВТОстаткиДнейГрафика через связь ОстаткиИОбороты.Период=ГрафикиРаботы.Дата
      для указанного типа графика, его значения = 1 и ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток > 0
    3)Потом запрос по этим таблицам связью через номенклатуру и расчетом
    ВТПродажиОбороты.Количество / ВТОстаткиДнейГрафика.ДнейПродаж

    • progr-2008 11.12.2010 в 11:56

      Сделала 2-е задание.
      Скопировала из базы 1 блока регистр накопления Взаиморасчеты, ПКО, РКО
      Сделала пакетный запрос с формированием временной таблицы ВТОстаткиДата
      ВТ сформирована из виртуальной таблицы РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты
      Использовала соединение с этой же таблицей по условиям равенства контрагентов и
      Период первой < Период второй
      МИНИМУМ(ВзаиморасчетыОстаткиИОбороты1.Период) КАК ПериодСлед
      с группировкой по контрагентам, периоду, СуммаКонечныйОстаток
      Потом запрос к этой ВТ с проверкой  больше или меньше 0, соответственно
      с плюс или минус ВТОстаткиДата.Остатки * на  РАЗНОСТЬДАТ за период с группировкой по контрагентам

  12. Задание выполнил. Хороший опыт пакетных запросов.

  13. Задача 1

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

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

    Получилось довольно сложно. Разбиралась долго.
    Вторую задачу решила мгновенно.
    ВЫБРАТЬ
     ВзаиморасчетыОстаткиИОбороты.Контрагент,
     ВзаиморасчетыОстаткиИОбороты.Период,
     ВзаиморасчетыОстаткиИОбороты.СуммаНачальныйОстаток,
     ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток
    ПОМЕСТИТЬ Долги
    ИЗ
     РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&Начало, &Конец, День, ДвиженияИГраницыПериода, ) КАК ВзаиморасчетыОстаткиИОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     Долги.Контрагент,
     Долги.Период КАК Нач,
     МИНИМУМ(Долги1.Период) КАК Кон
    ПОМЕСТИТЬ Даты
    ИЗ
     Долги КАК Долги
      ЛЕВОЕ СОЕДИНЕНИЕ Долги КАК Долги1
      ПО Долги.Период < Долги1.Период
       И Долги.Контрагент = Долги1.Контрагент
    СГРУППИРОВАТЬ ПО
     Долги.Контрагент,
     Долги.Период
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ВзаиморасчетыОстаткиИОбороты.Контрагент,
     РАЗНОСТЬДАТ(Даты.Нач, Даты.Кон, ДЕНЬ) * ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток КАК Показатель
    ПОМЕСТИТЬ Показатели
    ИЗ
     РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&Начало, &Конец, День, ДвиженияИГраницыПериода, ) КАК ВзаиморасчетыОстаткиИОбороты
      ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты
      ПО ВзаиморасчетыОстаткиИОбороты.Период >= Даты.Нач
       И ВзаиморасчетыОстаткиИОбороты.Контрагент = Даты.Контрагент
       И ВзаиморасчетыОстаткиИОбороты.Период < Даты.Кон
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     Показатели.Контрагент КАК Контрагент,
     СУММА(ВЫБОР
       КОГДА Показатели.Показатель > 0
        ТОГДА Показатели.Показатель
       ИНАЧЕ 0
      КОНЕЦ) КАК Дебиторка,
     СУММА(ВЫБОР
       КОГДА Показатели.Показатель < 0
        ТОГДА Показатели.Показатель
       ИНАЧЕ 0
      КОНЕЦ) КАК Авансы
    ИЗ
     Показатели КАК Показатели
    СГРУППИРОВАТЬ ПО
     Показатели.Контрагент
    ИТОГИ
     СУММА(Дебиторка),
     СУММА(Авансы)
    ПО
     ОБЩИЕ

  14. Александр Горлов 10.12.2010 в 04:17

    Задание 2.
    Решение оказалось еще проще, чем 1-е.
    1. Получаем из регистра взаиморасчетов конечные остатки по дням в разрезе контрагентов за указанный период. К полям выходной таблицы Контрагент/День/Сумма добавляем поле “Вид кредита”, принимающее 2 значения:
    – “Выданный кредит”, если сумма < 0
    – “Полученный кредит”, если сумма > 0
    КредитыПоДням
    2. Выбираем из КредитыПоДням поля Контрагент / Вид кредита / Сумма, сворачивая по полям Контрагент / Вид кредита и суммируя Сумма. Сумму уже берем без знака.
    Вуаля!
    На выходе нужная нам таблица с уровнем дебиторки и полученных кредитных средств.
    Так просто!
    Ведь за каждый день сумма выданного или полученного кредита включается в соответствующую группу кредитов в размере этой суммы. А значит, можно не искать количество дней между изменением состояния взаиморасчетов, а просто взять сумму долга на каждый день и сложить эти суммы.

  15. Александр Горлов 10.12.2010 в 04:00

    Вопрос по заданию 2.
    Я что-то пропустил? Откуда появился регистр “Взаиморасчеты”? Он может являться частью разработки при решении этого ДЗ или он уже был в базе с прошлых ДЗ?

    • Его не было в прошлых ДЗ.
      Придется добавлять :)

      • Александр Горлов 10.12.2010 в 13:35

        Тогда, видимо, еще и появляются документы оплаты мы/нам.
        Ага, вот он – Продвинутый курс! Об архитектуре пришло время думать самостоятельно… :)

      • Вопрос по заданию 1  – напрашивается партионный учет , разрешено ли по условию задачи модифицировать регистры и документы – например ввести документ партии в регистр остатки и сделать простейший механизм партионного учета ?

        • Партионного учета для решения этой задачи не требуется..

  16. Александр Горлов 10.12.2010 в 01:24

    Задание 1.
    Решает пакетный запрос.
    1. Получаем продажи за указанный период. ПродажиЗаПериод
    2. Из регистра остатков получаем дни наличия остатков на складе. ДниНаличияТовараНаСкладе
    Здесь есть маленькие хитрости:
    а) использовать виртуальную таблицу ОстаткиИОбороты регистра с периодом развертки «День» или измерением «ПериодДень» – тогда платформа сама развернет остатки и обороты по каждому дню
    б) днем наличия остатка на складе считаем день, когда хотя бы одно из значений ресурса «Количество» ненулевое: НачальныйОстаток, Приход, Расход, КонечныйОстаток. Выбираем их в результирующую таблицу – тогда платформа сама скроет нулевые остатки и движения.
    3. Получаем рабочие дни по выбранному графику за указанный период из регистра. РабочиеДниПоГрафику
    Важно: лучше сделать такую промежуточную таблицу, чтобы записей в ней для последующего соединения с остатками было поменьше.
    4. Внутреннее соединение ДниНаличияТовараНаСкладе и РабочиеДниПоГрафику. При этом сразу применяем к результату группировку по номенклатуре с применением количество различных дней.  РабочихДнейНаличияТоваровНаСкладе
    5. Финальный аккорд. Соединяем ПродажиЗаПериод и РабочихДнейНаличияТоваровНаСкладе по номенклатуре, при этом делим продажи на число дней. Получаем требуемую скорость продаж по каждой номенклатуре.

  17. ДЗ № 8 выполнила.
    Задание сложное. Голову пришлось поломать основательно. Особенно в первом задании.
    1) Получился пакет запросов, смысл которого – получение остатков по товарам; вычисление рабочих дней за указанный период; затем вычисление дней, когда не было остатков по товарам;  получение оборотов продаж;  вычисление скорости продаж как частное оборотов продаж за период и разности общего количества рабочих дней в периоде и дней, когда не было остатков.
    2) Использовала регистр бухгалтерии РегистрУправленческий. Получился пакет из 3 запросов.
    Оформила результаты выполнения заданий в виде отчетов на СКД.

  18. spec20091c 09.12.2010 в 11:59

    Задание выполнил.
    Запрос 1.
    Пакетный запрос из 5 временных таблиц
    1) Дни за указанный период, исключая выходные и праздничные дни (ВТДаты).
    2) Остатки за период по дням, когда были движения (ВТОстатки).
    3) Левое внешнее соединение 2-х временных таблиц: ВТДаты и ВТОстатки,
    условие связи Дата >= Период из таблицы ВТОстатки. Это необходимо для получения максимальной
    даты из таблицы остатков на каждый день из таблицы дат (ВТДатыОстатков).
    4) Внутреннее соединение таблицы ВТОстатки к таблице ВТДатыОстатков для получения остатков на каждый
    день.
    5) Подсчет количества дней для каждой номенклатуры (ВТКоличествоДней)
    6) Левое внешнее соединение таблицы ПродажиОбороты и таблицы ВТКоличествоДней
    и расчет скорости продажи
    ВЫБРАТЬ
    ГрафикиРаботы.Дата КАК Дата
    ПОМЕСТИТЬ ВТДаты
    ИЗ
    РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
    ГДЕ
    ГрафикиРаботы.Дата МЕЖДУ &НачПериода И &КонПериода
    И ГрафикиРаботы.Значение > 0
    И ГрафикиРаботы.ТипГрафика = &ТипГрафика
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ОстаткиТоваровОстаткиИОбороты.Период,
    ОстаткиТоваровОстаткиИОбороты.Номенклатура,
    ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток,
    ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток,
    ОстаткиТоваровОстаткиИОбороты.КоличествоОборот
    ПОМЕСТИТЬ ВТОстатки
    ИЗ
    РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&НачПериода, &КонПериода, День, , ) КАК ОстаткиТоваровОстаткиИОбороты
    ;

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

    СГРУППИРОВАТЬ ПО
    ВТДаты.Дата,
    ВТОстатки.Номенклатура
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТДатыОстатков.Дата,
    ВТДатыОстатков.Период,
    ВТДатыОстатков.Номенклатура,
    ВТОстатки.КоличествоНачальныйОстаток,
    ВТОстатки.КоличествоОборот,
    ВТОстатки.КоличествоКонечныйОстаток,
    ВЫБОР
    КОГДА ВТОстатки.КоличествоКонечныйОстаток > 0
    ИЛИ ВТОстатки.КоличествоКонечныйОстаток = 0
    И ВТОстатки.КоличествоНачальныйОстаток > 0
    ИЛИ ВТОстатки.КоличествоКонечныйОстаток = 0
    И ВТОстатки.КоличествоНачальныйОстаток = 0
    И ВТОстатки.КоличествоОборот > 0
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ КАК ЕстьОстаток
    ПОМЕСТИТЬ ВТОстаткиПоДням
    ИЗ
    ВТДатыОстатков КАК ВТДатыОстатков
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТОстатки КАК ВТОстатки
    ПО ВТДатыОстатков.Период = ВТОстатки.Период
    И ВТДатыОстатков.Номенклатура = ВТОстатки.Номенклатура
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТОстаткиПоДням.Номенклатура,
    СУММА(ВТОстаткиПоДням.ЕстьОстаток) КАК КолДней
    ПОМЕСТИТЬ ВТКоличествоДней
    ИЗ
    ВТОстаткиПоДням КАК ВТОстаткиПоДням

    СГРУППИРОВАТЬ ПО
    ВТОстаткиПоДням.Номенклатура
    ;

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

    Запрос 2.
    1) Из виртуальной таблицы Остатки и обороты регистра Взаиморасчеты отбираются остатки на каждый
    день, когда были движения
    2) Полученная таблица соединяется сама с собой по условию ВтВзаиморасчеты.Контрагент = ВтВзаиморасчеты1.Контрагент
    И ВтВзаиморасчеты.Период < ВтВзаиморасчеты1.Период и рассчитывается разность дат
    3) Рассчитываются показатели

  19. Илья Чернов 09.12.2010 в 00:51

    Сделал.
    Задание 1.
    4-х этажный получился запрос
    1. Получаем из регистра остатки,  конечный остаток по каждому движению на дату документа.
    2. Выбирает из регистра график работ все рабочие дни.
    3. Связываем  полученные таблицы в п. 1 и 2, получаем таблицу с датами изменений на каждый день за период. (промежуточная таблица для дальнейшей связи с остатками)
    4. Связываем таблицу 3 еще раз с таблицей 1 для получения остатков на каждый день. И здесь же связываем с таблицей продаж, группируем и вычисляем необходимые поля.
    Задание 2.
    1. Получаем из регистра взаиморасчеты сумму остатка при каждом движении на дату документа.
    2. Соединяем таблицу 1 с самой собой. С условием что период в первой меньше периода во второй. И выбираем минимальный период, который соответствует следующему изменению в регистре. Тут же считаем разность дат.
    3. Рассчитываем необходимые показатели и группируем таблицу.

  20. Леонид 08.12.2010 в 18:24

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

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТВзаиморасчеты.Субконто1 КАК Контрагент,
    ВТВзаиморасчеты.СуммаНачальныйОстаток,
    ВТВзаиморасчеты.Период КАК Период,
    МАКСИМУМ(ВТВзаиморасчеты1.Период) КАК ПредПериод
    ПОМЕСТИТЬ ВТСуммыИДаты
    ИЗ
    ВТВзаиморасчеты КАК ВТВзаиморасчеты
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТВзаиморасчеты КАК ВТВзаиморасчеты1
    ПО ВТВзаиморасчеты.Субконто1 = ВТВзаиморасчеты1.Субконто1
    И ВТВзаиморасчеты.Период > ВТВзаиморасчеты1.Период

    СГРУППИРОВАТЬ ПО
    ВТВзаиморасчеты.Субконто1,
    ВТВзаиморасчеты.Период,
    ВТВзаиморасчеты.СуммаНачальныйОстаток
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТСуммыИДаты.Контрагент КАК Контрагент,
    ВЫБОР
    КОГДА ВТСуммыИДаты.СуммаНачальныйОстаток > 0
    ТОГДА РАЗНОСТЬДАТ(ВТСуммыИДаты.ПредПериод, ВТСуммыИДаты.Период, ДЕНЬ) * ВТСуммыИДаты.СуммаНачальныйОстаток
    ИНАЧЕ 0
    КОНЕЦ КАК Выданых,
    ВЫБОР
    КОГДА ВТСуммыИДаты.СуммаНачальныйОстаток < 0
    ТОГДА РАЗНОСТЬДАТ(ВТСуммыИДаты.ПредПериод, ВТСуммыИДаты.Период, ДЕНЬ) * -ВТСуммыИДаты.СуммаНачальныйОстаток
    ИНАЧЕ 0
    КОНЕЦ КАК Полученных
    ИЗ
    ВТСуммыИДаты КАК ВТСуммыИДаты

    УПОРЯДОЧИТЬ ПО
    Контрагент
    ИТОГИ
    СУММА(Выданых),
    СУММА(Полученных)
    ПО
    ОБЩИЕ

  21. Леонид 08.12.2010 в 15:46

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

    ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    ДатаПоступления,
    ДатаПолнойПродажи
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТОстаткиСДатами.Номенклатура КАК Номенклатура,
    ВТОстаткиСДатами.ДатаПоступления КАК ДатаПоступления,
    МИНИМУМ(ЕСТЬNULL(ВТОстаткиСДатами1.ДатаПолнойПродажи, &КонПериода)) КАК ДатаПолнойПродажи
    ПОМЕСТИТЬ ВТОстаткиПериод
    ИЗ
    ВТОстаткиСДатами КАК ВТОстаткиСДатами
    ЛЕВОЕ СОЕДИНЕНИЕ ВТОстаткиСДатами КАК ВТОстаткиСДатами1
    ПО ВТОстаткиСДатами.Номенклатура = ВТОстаткиСДатами1.Номенклатура
    И ВТОстаткиСДатами.ДатаПоступления <= ВТОстаткиСДатами1.ДатаПолнойПродажи
    ГДЕ
    (НЕ ВТОстаткиСДатами.ДатаПоступления ЕСТЬ NULL )

    СГРУППИРОВАТЬ ПО
    ВТОстаткиСДатами.Номенклатура,
    ВТОстаткиСДатами.ДатаПоступления

    ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    ДатаПоступления,
    ДатаПолнойПродажи
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТОстаткиПериод.Номенклатура КАК Номенклатура,
    СУММА(ГрафикиРаботы.Значение) КАК Значение
    ПОМЕСТИТЬ ВТДниОстатков
    ИЗ
    ВТОстаткиПериод КАК ВТОстаткиПериод
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
    ПО ВТОстаткиПериод.ДатаПолнойПродажи >= ГрафикиРаботы.Дата
    И ВТОстаткиПериод.ДатаПоступления <= ГрафикиРаботы.Дата
    ГДЕ
    ГрафикиРаботы.ТипГрафика = &ТипГрафика

    СГРУППИРОВАТЬ ПО
    ВТОстаткиПериод.Номенклатура
    ИНДЕКСИРОВАТЬ ПО
    Номенклатура
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТДниОстатков.Номенклатура,
    ВЫБОР
    КОГДА ВТДниОстатков.Значение ЕСТЬ NULL
    ТОГДА 0
    КОГДА ВТДниОстатков.Значение = 0
    ТОГДА 0
    ИНАЧЕ ПродажиОбороты.КоличествоОборот / ВТДниОстатков.Значение
    КОНЕЦ КАК СкоростьПродаж
    ИЗ
    ВТДниОстатков КАК ВТДниОстатков
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&НачПериода, &КонПериода, , ) КАК ПродажиОбороты
    ПО ВТДниОстатков.Номенклатура = ПродажиОбороты.Номенклатура

  22. Андрей Медведев 08.12.2010 в 09:37

    В отчете 1 использовал прием связи таблицы самой с собой – для таблицы «Остатки и обороты товаров», а затем группировал даны окончания при помощи агрегатной функции «Минимум». Таким образом определял даты, в которых было изменение количества, а также периоды с какой-то даты по какую-то, в котором количество было больше 0.
    Количество рабочих дней в интервале определял через таблицу регистра сведений «График работы»: отбирал по измерению «ТипГрафика». День считаем рабочим, если в графике ресурс значение больше 0.
    Из таблицы оборотов регистра «Продажи» брал количество проданного товара.
    Реализовано в рамках пакета запросов. 
    ВЫБРАТЬ                        ОстаткиТоваровОстаткиИОбороты.Номенклатура КАК Номенклатура,
                            ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
                            ОстаткиТоваровОстаткиИОбороты.Период КАК Дата,
                            ВЫБОР
                                                   КОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток > 0
                                                                                                  ИЛИ ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток + ОстаткиТоваровОстаткиИОбороты.КоличествоПриход >= ОстаткиТоваровОстаткиИОбороты.КоличествоРасход
                                                                                                                          И ОстаткиТоваровОстаткиИОбороты.КоличествоПриход > 0
                                                                           ТОГДА ИСТИНА
                                                   ИНАЧЕ ЛОЖЬ
                            КОНЕЦ КАК флЕстьНачальныйОстаток,
                            ВЫБОР
                                                   КОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток > 0
                                                                           ТОГДА ИСТИНА
                                                   ИНАЧЕ ЛОЖЬ
                            КОНЕЦ КАК флЕстьКонечныйОстаток
    ПОМЕСТИТЬ Остатки
    ИЗ
                            РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты({(&ДатаНач)}, {(&ДатаКон)}, День, , ) КАК ОстаткиТоваровОстаткиИОбороты
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
                            ГрафикРаботы.Дата
    ПОМЕСТИТЬ РабочиеДни
    ИЗ
                            РегистрСведений.ГрафикРаботы КАК ГрафикРаботы
    ГДЕ
                            ГрафикРаботы.Значение > 0
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
                            вЗ.Номенклатура,
                            МИНИМУМ(вЗ.ДатаНач) КАК ДатаНач,
                            вЗ.ДатаКон
    ПОМЕСТИТЬ ПериодыНаличия
    ИЗ
                            (ВЫБРАТЬ
                                                   Остатки.Номенклатура КАК Номенклатура,
                                                   Остатки.Дата КАК ДатаНач,
                                                   МИНИМУМ(ЕСТЬNULL(Остатки1.Дата, &ДатаКон)) КАК ДатаКон
                            ИЗ
                                                   Остатки КАК Остатки
                                                                           ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки1
                                                                           ПО Остатки.Номенклатура = Остатки1.Номенклатура
                                                                                                  И Остатки.Дата <= Остатки1.Дата
                                                                                                  И ((НЕ Остатки1.флЕстьКонечныйОстаток))
                                                                                                  И (Остатки.флЕстьНачальныйОстаток
                                                                                                                          ИЛИ Остатки.флЕстьКонечныйОстаток)
                            ГДЕ
                                                   (Остатки.флЕстьНачальныйОстаток
                                                                                                  ИЛИ Остатки.флЕстьКонечныйОстаток)
                           
                            СГРУППИРОВАТЬ ПО
                                                   Остатки.Номенклатура,
                                                   Остатки.Дата) КАК вЗ
     
    СГРУППИРОВАТЬ ПО
                            вЗ.Номенклатура,
                            вЗ.ДатаКон
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
                            ПериодыНаличия.Номенклатура КАК Номенклатура,
                            КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РабочиеДни.Дата) КАК КоличествоДней
    ПОМЕСТИТЬ ДнейНаличия
    ИЗ
                            ПериодыНаличия КАК ПериодыНаличия
                                                   ВНУТРЕННЕЕ СОЕДИНЕНИЕ РабочиеДни КАК РабочиеДни
                                                   ПО ПериодыНаличия.ДатаНач <= РабочиеДни.Дата
                                                                           И ПериодыНаличия.ДатаКон >= РабочиеДни.Дата
     
    СГРУППИРОВАТЬ ПО
                            ПериодыНаличия.Номенклатура
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
                            ПродажиОбороты.Номенклатура КАК Номенклатура,
                            ПродажиОбороты.КоличествоОборот КАК КоличествоПродажи,
                            ВЫБОР
                                                   КОГДА ДнейНаличия.КоличествоДней ЕСТЬ NULL
                                                                                                  И ДнейНаличия.КоличествоДней = 0
                                                                           ТОГДА 0
                                                   ИНАЧЕ ПродажиОбороты.КоличествоОборот / ДнейНаличия.КоличествоДней
                            КОНЕЦ КАК СкоростьПродажи
    ИЗ
                            РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
                                                   ЛЕВОЕ СОЕДИНЕНИЕ ДнейНаличия КАК ДнейНаличия
                                                   ПО ПродажиОбороты.Номенклатура = ДнейНаличия.Номенклатура
     
    В отчет 2 использовал метод аналогичный использованному в отчете 1 метод получения интервала, в течение которого суммовой остаток в регистре не изменялся. Запрос во второй задаче проще, так как изначальных источником данных является одна таблица.
     
    ВЫБРАТЬ
                            ВЫРАЗИТЬ(РегистрУправленческийОстаткиИОбороты.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
                            РегистрУправленческийОстаткиИОбороты.Период КАК Дата,
                            ВЫБОР
                                                   КОГДА РегистрУправленческийОстаткиИОбороты.СуммаКонечныйОстаток > 0
                                                                           ТОГДА РегистрУправленческийОстаткиИОбороты.СуммаКонечныйОстаток
                                                   ИНАЧЕ 0
                            КОНЕЦ КАК ДебиторкаКон,
                            ВЫБОР
                                                   КОГДА РегистрУправленческийОстаткиИОбороты.СуммаКонечныйОстаток < 0
                                                                           ТОГДА -РегистрУправленческийОстаткиИОбороты.СуммаКонечныйОстаток
                                                   ИНАЧЕ 0
                            КОНЕЦ КАК КредиторкаКон,
                            РегистрУправленческийОстаткиИОбороты.Счет
    ПОМЕСТИТЬ Расчеты
    ИЗ
                            РегистрБухгалтерии.РегистрУправленческий.ОстаткиИОбороты(
                                                                           &ДатаНач,
                                                                           &ДатаКон,
                                                                           День,
                                                                           ДвиженияИГраницыПериода,
                                                                           Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики)
                                                                                                  ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели),
                                                                           ,
                                                                           ) КАК РегистрУправленческийОстаткиИОбороты
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
                            Расчеты.Контрагент КАК Контрагент,
                            Расчеты.ДебиторкаКон КАК ДебиторкаКон,
                            Расчеты.КредиторкаКон КАК КредиторкаКон,
                            Расчеты.Дата КАК ДатаНач,
                            МИНИМУМ(ЕСТЬNULL(Расчеты1.Дата, &ДатаКон)) КАК ДатаКон,
                            Расчеты.Счет
    ПОМЕСТИТЬ РасчетыИДаты
    ИЗ
                            Расчеты КАК Расчеты
                                                   ЛЕВОЕ СОЕДИНЕНИЕ Расчеты КАК Расчеты1
                                                   ПО Расчеты.Контрагент = Расчеты1.Контрагент
                                                                           И Расчеты.Дата < Расчеты1.Дата
                                                                           И Расчеты.Счет = Расчеты1.Счет
    ГДЕ
                            (НЕ Расчеты.Дата = &ДатаКон)
     
    СГРУППИРОВАТЬ ПО
                            Расчеты.Контрагент,
                            Расчеты.Дата,
                            Расчеты.ДебиторкаКон,
                            Расчеты.КредиторкаКон,
                            Расчеты.Счет
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
                            РасчетыИДаты.Счет КАК Счет,
                            РасчетыИДаты.Контрагент КАК Контрагент,
                            РасчетыИДаты.ДебиторкаКон КАК Дебиторка,
                            РасчетыИДаты.КредиторкаКон КАК Кредиторка,
                            РасчетыИДаты.ДебиторкаКон * РАЗНОСТЬДАТ(РасчетыИДаты.ДатаНач, РасчетыИДаты.ДатаКон, ДЕНЬ) КАК УровеньДебиторки,
                            РасчетыИДаты.КредиторкаКон * РАЗНОСТЬДАТ(РасчетыИДаты.ДатаНач, РасчетыИДаты.ДатаКон, ДЕНЬ) КАК УровеньКредиторки,
                            РАЗНОСТЬДАТ(РасчетыИДаты.ДатаНач, РасчетыИДаты.ДатаКон, ДЕНЬ) КАК РазностьДат,
                            РасчетыИДаты.ДатаНач,
                            РасчетыИДаты.ДатаКон
    ИЗ
                            РасчетыИДаты КАК РасчетыИДаты

  23. Кудрявцев Олег 08.12.2010 в 07:53

    Задание выполнил. Узнал действительно много нового про запросы. Тексты запросов приводить не буду… Но вроде данные получаются верные.
    P.S. до 17 декабря в отпуске, поэтому следующие домашние задания буду выполнять после 17 числа

  24. зад 1.
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот КАК Количество
    ПОМЕСТИТЬ ТабПродажи
    ИЗ
    РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, , ) КАК ПродажиОбороты
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ОстаткиТоваровОстаткиИОбороты.Номенклатура,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ОстаткиТоваровОстаткиИОбороты.Период) КАК Дни
    ПОМЕСТИТЬ ТабДни
    ИЗ
    РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&ДатаНач, &ДатаКон, День, , ) КАК ОстаткиТоваровОстаткиИОбороты
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
    ПО ОстаткиТоваровОстаткиИОбороты.Период = ГрафикиРаботы.Дата
    ГДЕ
    ГрафикиРаботы.Значение = 1
    И ГрафикиРаботы.ТипГрафика = &ТипГрафика
    И ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток > 0

    СГРУППИРОВАТЬ ПО
    ОстаткиТоваровОстаткиИОбороты.Номенклатура
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ТабДни.Номенклатура,
    ТабДни.Дни,
    ТабПродажи.Количество,
    ТабПродажи.Количество / ТабДни.Дни КАК скорость
    ИЗ
    ТабПродажи КАК ТабПродажи
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТабДни КАК ТабДни
    ПО ТабПродажи.Номенклатура = ТабДни.Номенклатура
    зад.2 в процессе

  25. Задание выполнено:
    Пункт 1:
    1. Берем обороты по регистру продажи с учетом того, что дни продаж попадают в выборку дней из графика.
    Выборка дней из графика – даты с фильтром на интервал и график, где значение = 1.
    2. Берем дни (группируем по номенклатуре – количество различных дней) с условием, что конечный остаток>0
    3. Соединяем эти таблицы по номенлкатуре и получаем ОбъемПродаж\КоличествоДней
    Пункт 2:
    1. Получаем остатки по регистру взаиморасчеты с группировкой по дням. Здесь же, соединивишись с собой по условию (Контрагент = с_Контрагент и Период <= с_Период (для равенства с учетом момента времени)).
    Группировка по Контрагенту, Остатку, ДатеОперации – Минимум(ДатаСледОперации)
    Получаем таблицу вида – Контрагент, Остаток, ДатаОперации, ДатаСледОперации (если дата след. операции равна NULL, подставляем дату конца месяца)
    2. Выбираем данные из таблицы и накладываем группировку
    СУММА(ВЫБОР
    КОГДА Таб_Остатки.Остаток > 0
    ТОГДА Таб_Остатки.Остаток * РАЗНОСТЬДАТ(Таб_Остатки.ДатаОперации, Таб_Остатки.ДатаСледОперации, ДЕНЬ)
    ИНАЧЕ 0
    КОНЕЦ) КАК ВыданныйКредит,
    СУММА(ВЫБОР
    КОГДА Таб_Остатки.Остаток < 0
    ТОГДА -Таб_Остатки.Остаток * РАЗНОСТЬДАТ(Таб_Остатки.ДатаОперации, Таб_Остатки.ДатаСледОперации, ДЕНЬ)
    ИНАЧЕ 0
    КОНЕЦ) КАК ПолученныйКредит
    Задание выполнено:Пункт 1: 1. Берем обороты по регистру продажи с учетом того, что дни продаж попадают в выборку дней из графика.Выборка дней из графика – даты с фильтром на интервал и график, где значение = 1.2. Берем дни (группируем по номенклатуре – количество различных дней) с условием, что конечный остаток>0 3. Соединяем эти таблицы по номенлкатуре и получаем ОбъемПродаж\КоличествоДней
    Пункт 2:1. Получаем остатки по регистру взаиморасчеты с группировкой по дням. Здесь же, соединивишись с собой по условию (Контрагент = с_Контрагент и Период <= с_Период (для равенства с учетом момента времени)). Группировка по Контрагенту, Остатку, ДатеОперации – Минимум(ДатаСледОперации)Получаем таблицу вида – Контрагент, Остаток, ДатаОперации, ДатаСледОперации (если дата след. операции равна NULL, подставляем дату конца месяца)2. Выбираем данные из таблицы и накладываем группировкуСУММА(ВЫБОР КОГДА Таб_Остатки.Остаток > 0 ТОГДА Таб_Остатки.Остаток * РАЗНОСТЬДАТ(Таб_Остатки.ДатаОперации, Таб_Остатки.ДатаСледОперации, ДЕНЬ) ИНАЧЕ 0 КОНЕЦ) КАК ВыданныйКредит, СУММА(ВЫБОР КОГДА Таб_Остатки.Остаток < 0 ТОГДА -Таб_Остатки.Остаток * РАЗНОСТЬДАТ(Таб_Остатки.ДатаОперации, Таб_Остатки.ДатаСледОперации, ДЕНЬ) ИНАЧЕ 0 КОНЕЦ) КАК ПолученныйКредит

    • Александр Горлов 10.12.2010 в 04:22

      В задании 1 у Вас ошибка.
      Продажи берутся за весь период, даже если они происходили в выходной день.
      А выходные вычитаются из числа дней, в которые товар был на складе (был – это не только остался на конец дня, но и пришел/ушел или был, но продался к концу дня под ноль).

  26. 1. Обороты по Дням из рег.Продажи, Дни = Дням из рег.ГрафикиРаботы.
    2. ВЫБРАТЬ
     таб.Период КАК Период,
     таб.Контрагент КАК Контрагент,
     МИНИМУМ(таб1.Период) КАК ПериодСлед,
     ВЫБОР
      КОГДА РасчетыСКонтрагентами.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
       ТОГДА РасчетыСКонтрагентами.Сумма
      ИНАЧЕ -РасчетыСКонтрагентами.Сумма
     КОНЕЦ КАК Ост
    Поместить ВТ 
    ИЗ
     РегистрНакопления.РасчетыСКонтрагентами.ОстаткиИОбороты(&Дата1, &Дата2, День, , ) КАК таб
      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РасчетыСКонтрагентами.ОстаткиИОбороты(&Дата1, &Дата2, День, , ) КАК таб1
      ПО таб.Контрагент = таб1.Контрагент
       И таб.Период < таб1.Период
      ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.РасчетыСКонтрагентами КАК РасчетыСКонтрагентами
      ПО таб.Контрагент = РасчетыСКонтрагентами.Контрагент
       И таб.Период = РасчетыСКонтрагентами.Период
    СГРУППИРОВАТЬ ПО
     таб.Контрагент,
     таб.Период,
     таб.СуммаКонечныйОстаток,
     РасчетыСКонтрагентами.Сумма,
     ВЫБОР
      КОГДА РасчетыСКонтрагентами.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
       ТОГДА РасчетыСКонтрагентами.Сумма
      ИНАЧЕ -РасчетыСКонтрагентами.Сумма
     КОНЕЦ
    ;
    //////////////////////////////////////////////////////////////////////////////// 
    ВЫБРАТЬ
     ВТ.Контрагент,
     СУММА(ВЫБОР
       КОГДА ВТ.Ост > 0
        ТОГДА ВТ.Ост * РАЗНОСТЬДАТ(ВТ.Период, ВТ.ПериодСлед, ДЕНЬ)
       ИНАЧЕ 0
      КОНЕЦ) КАК УровеньДт,
     СУММА(ВЫБОР
       КОГДА ВТ.Ост < 0
        ТОГДА -1 * ВТ.Ост * РАЗНОСТЬДАТ(ВТ.Период, ВТ.ПериодСлед, ДЕНЬ)
       ИНАЧЕ 0
      КОНЕЦ) КАК УровеньКт
    ИЗ
     ВТ КАК ВТ
    СГРУППИРОВАТЬ ПО
     ВТ.Контрагент
    УПОРЯДОЧИТЬ ПО
     ВТ.Контрагент

  27. Вторую часть задания выполнил. Не уверен, что корректно.

  28. Домашнее задание №8.
     
    Задача1.
    ВЫБРАТЬ
                ПродажиОбороты.Номенклатура,
                ПродажиОбороты.КоличествоОборот КАК Колво
    ПОМЕСТИТЬ Продажи
    ИЗ
                РегистрНакопления.Продажи.Обороты(&Дата1, &Дата2, , ) КАК ПродажиОбороты
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
                ОстаткиТоваровОстаткиИОбороты.Номенклатура,
                КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ОстаткиТоваровОстаткиИОбороты.Период) КАК Дни
    ПОМЕСТИТЬ ОстаткиДни
    ИЗ
                РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&Дата1, &Дата2, День, , ) КАК ОстаткиТоваровОстаткиИОбороты
                            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
                            ПО ОстаткиТоваровОстаткиИОбороты.Период = ГрафикиРаботы.Дата
                                       И (ГрафикиРаботы.Значение > 0)
    ГДЕ
                ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток > 0
                И ГрафикиРаботы.ТипГрафика = &ТипГрафика
     
    СГРУППИРОВАТЬ ПО
                ОстаткиТоваровОстаткиИОбороты.Номенклатура
    ;
     
    //////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
                Продажи.Номенклатура КАК Номенклатура,
                Продажи.Колво / ОстаткиДни.Дни КАК СкоростьПродажи
    ИЗ
                Продажи КАК Продажи
                            Внутреннее СОЕДИНЕНИЕ ОстаткиДни КАК ОстаткиДни
                            ПО Продажи.Номенклатура = ОстаткиДни.Номенклатура
     
    УПОРЯДОЧИТЬ ПО
                Номенклатура
     
     
     
    Задача 2.
    ВЫБРАТЬ
                ВзаиморасчетыОстаткиИОбороты.Период КАК Период,
                ВзаиморасчетыОстаткиИОбороты.Контрагент КАК Контрагент,
                ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток КАК Ост,
                МИНИМУМ(ВзаиморасчетыОстаткиИОбороты1.Период) КАК ПериодСлед
    ПОМЕСТИТЬ ВТ1
    ИЗ
                РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&Дата1, &Дата2, День, , ) КАК ВзаиморасчетыОстаткиИОбороты
                            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&Дата1, &Дата2, День, , ) КАК ВзаиморасчетыОстаткиИОбороты1
                            ПО ВзаиморасчетыОстаткиИОбороты.Период < ВзаиморасчетыОстаткиИОбороты1.Период
                                       И ВзаиморасчетыОстаткиИОбороты.Контрагент = ВзаиморасчетыОстаткиИОбороты1.Контрагент
     
    СГРУППИРОВАТЬ ПО
                ВзаиморасчетыОстаткиИОбороты.Контрагент,
                ВзаиморасчетыОстаткиИОбороты.Период,
                ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
                ВТ1.Контрагент,
                СУММА(ВЫБОР
                                       КОГДА ВТ1.Ост > 0
                                                   ТОГДА ВТ1.Ост * РАЗНОСТЬДАТ(ВТ1.Период, ВТ1.ПериодСлед, ДЕНЬ)
                                       ИНАЧЕ 0
                            КОНЕЦ) КАК УровеньДт,
                СУММА(ВЫБОР
                                       КОГДА ВТ1.Ост < 0
                                                   ТОГДА -1 * ВТ1.Ост * РАЗНОСТЬДАТ(ВТ1.Период, ВТ1.ПериодСлед, ДЕНЬ)
                                       ИНАЧЕ 0
                            КОНЕЦ) КАК УровеньКт
    ИЗ
                ВТ1 КАК ВТ1
     
    СГРУППИРОВАТЬ ПО
                ВТ1.Контрагент
     
    УПОРЯДОЧИТЬ ПО
                ВТ1.Контрагент
     

  29. Задача 1
    Пакет запросов.
    Запрос 1:.Выбираем номенклатуру и количество оборот из  Таблицы «ПродажиОборот».
    Запрос 2:Рабочие дни из графика по типу графика
    Запрос 3:Соединяем таблицу остатков между собой по номенклатуре, по которой были отгрузки
    (таблица из запроса1).Еще связи :
    Остаткииобороты.КоличествоКонечныйОстаток = Остаткииобороты1КоличествоНачальныйОстаток;
    Остаткииобороты .КоличествоконечныйОстаток>0
    Остаткииобороты .Период< Остаткииобороты .Период
    Группировка по Номенклатуре и Дате из Остаткииобороты Суммируемое поле НАЧАЛОПЕРИОДА(ОстаткиИОбороты1.Период, ДЕНЬ)-Минимум.
    Получаем интервалы  дат по номенклатуре, когда товар был на складе.
    Запрос 4: Связь таблицы из запроса 2 и запроса 3 внутренним соединением по условию дни по графику в интервале дней по остаткам.  Группировка номенклатуре функция по дням графика  «Количество различных». Получаем количество рабочих дней по номенклатуре, когда товар был на остатке.
    Запрос 5: Таблица 4 с таблицей1, делим количество продажи на число дней.
     
    Задача 2
    Запрос 1  Получение всех взаиморасчетов с группировкой День – помещаю в таблицу ВтВзаиморасчеты
    Запрос 2
    Соединение таблица сама с собой получаю для каждой даты периода следующую дату операции
    МИНИМУМ(ВтВзаиморасчеты1.Период) КАК Период1
    Связь по условию
    ВтВзаиморасчеты КАК ВтВзаиморасчеты
    ЛЕВОЕ СОЕДИНЕНИЕ ВтВзаиморасчеты КАК ВтВзаиморасчеты1
    ПО ВтВзаиморасчеты.Контрагент = ВтВзаиморасчеты1.Контрагент
    И ВтВзаиморасчеты.Период < ВтВзаиморасчеты1.Период
     
    В итоге в таблице у меня для каждой строки есть дата текущей операции, дата следующей операции, и конечный остаток на дату операции.
    Так как у меня есть дата следующей операции – по разности дат определяю количество дней, за которые не было изменений по регистру и ориентируясь на знак «+» или «-« помещаю информацию в нужную колонку
     
    РАЗНОСТЬДАТ(ВтВзаиморасчеты.Период, ДатыСледующейОперации.Период1, ДЕНЬ) КАК КвоДней,
    ВЫБОР
    КОГДА ВтВзаиморасчеты.СуммаКонечныйОстаток > 0
    ТОГДА ВтВзаиморасчеты.СуммаКонечныйОстаток
    ИНАЧЕ 0
    КОНЕЦ КАК ДебетСумма,
    ВЫБОР
    КОГДА ВтВзаиморасчеты.СуммаКонечныйОстаток < 0
    ТОГДА ВтВзаиморасчеты.СуммаКонечныйОстаток
    ИНАЧЕ 0
    КОНЕЦ КАК КредитСумма
    На основании этих данных определяю уровни УровеньДебиторки или Уровень Кредиторки
    СУММА(ТаблицаДК.ДебетСумма * ТаблицаДК.КвоДней) КАК УровеньДебиторки,
    СУММА(-1 * ТаблицаДК.КредитСумма * ТаблицаДК.КвоДней) КАК УровеньКредиторки
     

  30. Скорость продаж посчитал.
    Пришлось обращаться к физической таблице остатков для получения остатков на каждый день. И левым соединением с графиками, а затем суммировал приход и отнимал расход.
    По какой-то причине, механизм, описанны на диске ИТС (Периодами) не дает желаемого результата

  31. Задачи были сложными для меня, хотя с запросами работаю давно и плотно.  Жду “официального” решения… Особенно получение остатка на каждый день…

  32. Так как на выходных времени не было заниматься заданием, сделал только сегодня.

    Сложно писать отчет к построению запроса, но все же.

    Первая часть задания:
    – выбираем обороты продаж за указанный период, помещаем в ТЗПродажи;
    – выбираем график работы за указанный период и определнным типом графика, помещаем в ТЗГрафикРабот;
    – выбираем остатки на каждый день, помещаем в ТЗОстаткиНаДень;
    – выбираем данные из ТЗОстаткиНаДень, левым соединением ТЗГрафикРабот с условием, ДеньОстатков<=График.Дата, в полученной таблице выбираем максимальную дату ДеньОстатков, помещаем в Таблицу ТЗОстаткиВТ;
    – выбираем данные из ТЗОстаткиВТ внутренним соединением ТЗОстаткиНаДень с условием равенства номенклатуры, и даты остатков, в полученной таблице если не выходной и кол-во остатка больше 0 тогда 1 иначе 0 в поле НаЭтотДеньОстаткиЕсть, помещаем в таблицу ТЗОстаткиНаКаждыйДеньЕсть;
    – выбираем данные из ТЗОстаткиНаКаждыйДеньЕсть внутренним соединением ТЗПродажи с условием равенства номенклатуры, группируем и получаем колво дней когда есть остаток, помещаем в ТЗПоследняяВТ;
    – выбираем данные ТЗПоследняяВТ, Оборот/КолвоДнейЕстьОстаток;
    – результат: http://s51.radikal.ru/i131/1012/5b/a8cb42c6af3a.jpg

    Вторая часть задания:
    – выбираем взаиморасчеты за период с указанием только конечной даты, помещаем данные в ТЗВзаиморасчеты;
    – выбираем данные из ТЗВзаиморасчеты, левым соединением ТЗВзаиморасчеты, с условием равенства Контрагентов и ТЗВзаиморасчеты.ДатаВзаиморасчетов >ТЗВзаиморасчеты1.Даты ИЛИ если равенство то ТЗВзаиморасчеты.Регистратор.МоментВремени>ТЗВзаиморасчеты1.Регистратор.МоментВремени помещаем в ТЗВзаиморасчетыСПоследнимРегистратором;
    – выбираем данные из ТЗВзаиморасчетыСПоследнимРегистратором, выбираем Максимум(ДатаПоследнегоДвижения) помещаем в ТЗВзаиморасчетыДаты;
    – выбираем ТЗВзаиморасчеты, внутренним соединением ТЗВзаиморасчетыДаты с условием равенства Контрагента, Периода, Регистратора, получаем разность дат между ДатаДвижения и ДатаПоследнегоДвижения, полученную разность умножаем на НачальныйОстаток КАК УровеньДебиторки, помещаем в ТЗПоследняя;
    – выбираем данные из ТЗПоследняя, если УровеньДебиторки >0 тогда ВыданныеКредиты, иначеЕсли <0 тогда ПолученныеКредиты;
    – результат : http://i040.radikal.ru/1012/47/837e0c32f2c3.jpg

    • А я вот никак не пойму, как Вы делаете
      >выбираем остатки на каждый день, помещаем в ТЗОстаткиНаДень;

    • Естественно без использования СКД

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

      • Могу скинуть прям запрос целиком, укажи ящик.

        • Но, таким образом, при соединении с Графиком будут значения NULL там, где не было движений. Я смог найти два способа – первый с использованием физической таблицы, что приводит к необходимости группировки прихода и расхода. А второй – с использованием двух виртуальных таблиц ОстаткиИОбороты – кстати второй работает, но осознать КАК не могу, получился в процессе долгих изысканий. Но оба запроса возвращают остатки на каждую дату. А просто соединение ну никак не хочет. Даже использование рекомендации, предложенной на ИТС-е (ПЕРИОДАМИ) не помогает.

          • Предложение ПЕРИОДАМИ не изменяет результат запроса, оно влияет лишь на обход выборки.

          • NULL будет если соединять эти таблицы по Равенству периодов, в том и прикол что надо не по равенству соединять, а по знаку сравнения (> или <).
            “левым соединением ТЗГрафикРабот с условием, ДеньОстатков<=График.Дата, в полученной таблице выбираем максимальную дату ДеньОстатков, помещаем в Таблицу ТЗОстаткиВТ”

  33. Сергей Калмыков 06.12.2010 в 08:13

    Ниже приведены тексты запросов. На моей простейшей базе выводит результаты, похожие на правду. Раньше пакетные запросы не применял – использовал вложенные таблицы. Теперь обязательно буду использовать.
    Для упрощения задачи ВТ не индексировал 
    Задача 1
    ВЫБРАТЬ
     ОстаткиТоваровОстаткиИОбороты.Номенклатура КАК Номенклатура1,
     ОстаткиТоваровОстаткиИОбороты.Период КАК Период,
     ОстаткиТоваровОстаткиИОбороты.Номенклатура
    ПОМЕСТИТЬ ВТНаличие
    ИЗ
     РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&Нп, &Кп, День, , ) КАК ОстаткиТоваровОстаткиИОбороты
    ГДЕ
     ЕСТЬNULL(ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток, 0) > 0
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ОстаткиТоваровОстаткиИОбороты.Период КАК Период,
     ОстаткиТоваровОстаткиИОбороты.Номенклатура
    ПОМЕСТИТЬ ВТОтсутствие
    ИЗ
     РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&Нп, &Кп, День, , ) КАК ОстаткиТоваровОстаткиИОбороты
    ГДЕ
     ЕСТЬNULL(ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток, 0) <= 0
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ВТНаличие.Номенклатура,
     ВТНаличие.Период КАК ПериодНаличие,
     ВТОтсутствие.Период КАК ПериодОтсутствие
    ПОМЕСТИТЬ ВтСвод
    ИЗ
     ВТНаличие КАК ВТНаличие
      ЛЕВОЕ СОЕДИНЕНИЕ ВТОтсутствие КАК ВТОтсутствие
      ПО ВТНаличие.Период < ВТОтсутствие.Период
       И ВТНаличие.Номенклатура = ВТОтсутствие.Номенклатура
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ВтСвод.Номенклатура,
     ВтСвод.ПериодНаличие,
     МИНИМУМ(ВтСвод.ПериодОтсутствие) КАК ПериодОтсутствие
    ПОМЕСТИТЬ ВТсвод2
    ИЗ
     ВтСвод КАК ВтСвод
    СГРУППИРОВАТЬ ПО
     ВтСвод.ПериодНаличие,
     ВтСвод.Номенклатура
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ВТсвод2.Номенклатура КАК Номенклатура,
     МИНИМУМ(ВТсвод2.ПериодНаличие) КАК ПериодНаличие,
     ЕСТЬNULL(ВТсвод2.ПериодОтсутствие, &Кп) КАК ПериодОтсутствие
    ПОМЕСТИТЬ ВтСвод3
    ИЗ
     ВТсвод2 КАК ВТсвод2
    СГРУППИРОВАТЬ ПО
     ВТсвод2.Номенклатура,
     ЕСТЬNULL(ВТсвод2.ПериодОтсутствие, &Кп)
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ВтСвод3.Номенклатура КАК Номенклатура,
     СУММА(РАЗНОСТЬДАТ(ВтСвод3.ПериодНаличие, ВтСвод3.ПериодОтсутствие, ДЕНЬ)) КАК СрокВДнях
    ПОМЕСТИТЬ ВТСвод4
    ИЗ
     ВтСвод3 КАК ВтСвод3
    СГРУППИРОВАТЬ ПО
     ВтСвод3.Номенклатура
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ГрафикиРаботы.Дата,
     ГрафикиРаботы.Значение
    ПОМЕСТИТЬ ВТГрафик
    ИЗ
     РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
    ГДЕ
     ГрафикиРаботы.ТипГрафика = &ТипГрафика
     И ГрафикиРаботы.Значение = 0
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ВТсвод2.Номенклатура КАК Номенклатура,
     КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТГрафик.Дата) КАК Дата
    ПОМЕСТИТЬ ВТВыходные
    ИЗ
     ВТсвод2 КАК ВТсвод2
      ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТГрафик КАК ВТГрафик
      ПО (ВТГрафик.Дата МЕЖДУ ВТсвод2.ПериодНаличие И ЕСТЬNULL(ВТсвод2.ПериодОтсутствие, &Кп))
    СГРУППИРОВАТЬ ПО
     ВТсвод2.Номенклатура
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ВТСвод4.Номенклатура,
     ВТСвод4.СрокВДнях – ВТВыходные.Дата КАК СрокВДнях
    ПОМЕСТИТЬ ВТСрокВДнях
    ИЗ
     ВТСвод4 КАК ВТСвод4
      ЛЕВОЕ СОЕДИНЕНИЕ ВТВыходные КАК ВТВыходные
      ПО ВТСвод4.Номенклатура = ВТВыходные.Номенклатура
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ПродажиОбороты.Номенклатура,
     ПродажиОбороты.КоличествоОборот,
     ВТСрокВДнях.СрокВДнях,
     ПродажиОбороты.КоличествоОборот / ВТСрокВДнях.СрокВДнях КАК СкоростьПродажи
    ИЗ
     РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
      ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТСрокВДнях КАК ВТСрокВДнях
      ПО ПродажиОбороты.Номенклатура = ВТСрокВДнях.Номенклатура

    Задача 2
    ВЫБРАТЬ
     РегистрУправленческийОстаткиИОбороты.Субконто1 КАК Субконто1,
     РегистрУправленческийОстаткиИОбороты.Период,
     СУММА(РегистрУправленческийОстаткиИОбороты.СуммаКонечныйОстаток) КАК СуммаКонечныйОстаток,
     РегистрУправленческийОстаткиИОбороты.Счет
    ПОМЕСТИТЬ ВТ1
    ИЗ
     РегистрБухгалтерии.РегистрУправленческий.ОстаткиИОбороты(&Нп, &Кп, День, ДвиженияИГраницыПериода, Счет В (&Счета), , ) КАК РегистрУправленческийОстаткиИОбороты
    СГРУППИРОВАТЬ ПО
     РегистрУправленческийОстаткиИОбороты.Субконто1,
     РегистрУправленческийОстаткиИОбороты.Период,
     РегистрУправленческийОстаткиИОбороты.Счет
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ВТ1.Субконто1,
     ВТ11.Период КАК Период1,
     МИНИМУМ(ВТ1.Период) КАК Период,
     СУММА(ВТ11.СуммаКонечныйОстаток) КАК СуммаКонечныйОстаток
    ПОМЕСТИТЬ ВТ2
    ИЗ
     ВТ1 КАК ВТ1
      ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ11
      ПО ВТ1.Период > ВТ11.Период
       И ВТ1.Счет = ВТ11.Счет
    СГРУППИРОВАТЬ ПО
     ВТ1.Субконто1,
     ВТ11.Период
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     ВТ2.Субконто1,
     РАЗНОСТЬДАТ(ВТ2.Период1, ВТ2.Период, ДЕНЬ) * ВТ2.СуммаКонечныйОстаток КАК Поле1
    ПОМЕСТИТЬ вт3
    ИЗ
     ВТ2 КАК ВТ2
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
     вт3.Субконто1,
     СУММА(ВЫБОР
       КОГДА вт3.Поле1 > 0
        ТОГДА вт3.Поле1
       ИНАЧЕ 0
      КОНЕЦ) КАК НамДолжны,
     СУММА(ВЫБОР
       КОГДА вт3.Поле1 < 0
        ТОГДА -вт3.Поле1
       ИНАЧЕ 0
      КОНЕЦ) КАК МыДолжны
    ИЗ
     вт3 КАК вт3
    СГРУППИРОВАТЬ ПО
     вт3.Субконто1

  34. Шумаев Алексей 05.12.2010 в 04:48

    ***** УРОВЕНЬ ДЕБИТОРКИ (КРЕДИТОКИ) *****
    1. Получаем таблицу долгов
    2. Получаем таблицу дат операций
    3. Соединяем таблицу долгов и таблицей дат операция по условию дата операции больше даты долга. И здесь же группируем данные по каждому долгу и получаем минимальную(ближайшую) операцию.
    4. Вычисляем искомые значения
    ВЫБРАТЬ
    ВзаиморасчетыОстаткиИОбороты.Контрагент КАК Контрагент,
    НАЧАЛОПЕРИОДА(ВзаиморасчетыОстаткиИОбороты.Период, ДЕНЬ) КАК Период,
    ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток КАК Долг
    ПОМЕСТИТЬ ВТ_Долги
    ИЗ
    РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, Регистратор, , {(Контрагент)}) КАК ВзаиморасчетыОстаткиИОбороты
    ГДЕ
    ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток > 0
    ИНДЕКСИРОВАТЬ ПО
    Контрагент,
    Период
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВзаиморасчетыОбороты.Контрагент КАК Контрагент,
    НАЧАЛОПЕРИОДА(ВзаиморасчетыОбороты.Период, ДЕНЬ) КАК Период
    ПОМЕСТИТЬ ВТ_СледующаяОперация
    ИЗ
    РегистрНакопления.Взаиморасчеты.Обороты(
    &ДатаНачала,
    &ДатаОкончания,
    Регистратор,
    Контрагент В
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_Долги.Контрагент
    ИЗ
    ВТ_Долги КАК ВТ_Долги) {(Контрагент)}) КАК ВзаиморасчетыОбороты
    ИНДЕКСИРОВАТЬ ПО
    Контрагент,
    Период
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТ_Долги.Контрагент КАК Контрагент,
    ВТ_Долги.Долг,
    ВТ_Долги.Период КАК ДатаДолга,
    МИНИМУМ(ВТ_СледующаяОперация.Период) КАК ДатаСледующейОперации
    ПОМЕСТИТЬ ВТ_ДолгиПоПериодам
    ИЗ
    ВТ_Долги КАК ВТ_Долги
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СледующаяОперация КАК ВТ_СледующаяОперация
    ПО ВТ_Долги.Контрагент = ВТ_СледующаяОперация.Контрагент
    И ВТ_Долги.Период < ВТ_СледующаяОперация.Период
    СГРУППИРОВАТЬ ПО
    ВТ_Долги.Контрагент,
    ВТ_Долги.Период,
    ВТ_Долги.Долг
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТ_ДолгиПоПериодам.Контрагент,
    СУММА(ВТ_ДолгиПоПериодам.Долг * РАЗНОСТЬДАТ(ЕСТЬNULL(ВТ_ДолгиПоПериодам.ДатаСледующейОперации, &ДатаОкончания), ВТ_ДолгиПоПериодам.ДатаДолга, ДЕНЬ)) КАК Уровень
    ИЗ
    ВТ_ДолгиПоПериодам КАК ВТ_ДолгиПоПериодам
    СГРУППИРОВАТЬ ПО
    ВТ_ДолгиПоПериодам.Контрагент
    ИТОГИ ПО
    ОБЩИЕ

    ***** УРОВЕНЬ ДЕБИТОРКИ (КРЕДИТОКИ) *****
     
    1. Получаем таблицу долгов
    2. Получаем таблицу дат операций
    3. Соединяем таблицу долгов и таблицей дат операция по условию дата операции больше даты долга. И здесь же группируем данные по каждому долгу и получаем минимальную(ближайшую) операцию.
    4. Вычисляем искомые значения
     
    ВЫБРАТЬ
    ВзаиморасчетыОстаткиИОбороты.Контрагент КАК Контрагент,
    НАЧАЛОПЕРИОДА(ВзаиморасчетыОстаткиИОбороты.Период, ДЕНЬ) КАК Период,
    ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток КАК Долг
    ПОМЕСТИТЬ ВТ_Долги
    ИЗ
    РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, Регистратор, , {(Контрагент)}) КАК ВзаиморасчетыОстаткиИОбороты
    ГДЕ
    ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток > 0
     
    ИНДЕКСИРОВАТЬ ПО
    Контрагент,
    Период
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВзаиморасчетыОбороты.Контрагент КАК Контрагент,
    НАЧАЛОПЕРИОДА(ВзаиморасчетыОбороты.Период, ДЕНЬ) КАК Период
    ПОМЕСТИТЬ ВТ_СледующаяОперация
    ИЗ
    РегистрНакопления.Взаиморасчеты.Обороты(
    &ДатаНачала,
    &ДатаОкончания,
    Регистратор,
    Контрагент В
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_Долги.Контрагент
    ИЗ
    ВТ_Долги КАК ВТ_Долги) {(Контрагент)}) КАК ВзаиморасчетыОбороты
     
    ИНДЕКСИРОВАТЬ ПО
    Контрагент,
    Период
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТ_Долги.Контрагент КАК Контрагент,
    ВТ_Долги.Долг,
    ВТ_Долги.Период КАК ДатаДолга,
    МИНИМУМ(ВТ_СледующаяОперация.Период) КАК ДатаСледующейОперации
    ПОМЕСТИТЬ ВТ_ДолгиПоПериодам
    ИЗ
    ВТ_Долги КАК ВТ_Долги
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СледующаяОперация КАК ВТ_СледующаяОперация
    ПО ВТ_Долги.Контрагент = ВТ_СледующаяОперация.Контрагент
    И ВТ_Долги.Период < ВТ_СледующаяОперация.Период
     
    СГРУППИРОВАТЬ ПО
    ВТ_Долги.Контрагент,
    ВТ_Долги.Период,
    ВТ_Долги.Долг
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТ_ДолгиПоПериодам.Контрагент,
    СУММА(ВТ_ДолгиПоПериодам.Долг * РАЗНОСТЬДАТ(ЕСТЬNULL(ВТ_ДолгиПоПериодам.ДатаСледующейОперации, &ДатаОкончания), ВТ_ДолгиПоПериодам.ДатаДолга, ДЕНЬ)) КАК Уровень
    ИЗ
    ВТ_ДолгиПоПериодам КАК ВТ_ДолгиПоПериодам
     
    СГРУППИРОВАТЬ ПО
    ВТ_ДолгиПоПериодам.Контрагент
    ИТОГИ ПО
    ОБЩИЕ

  35. Шумаев Алексей 05.12.2010 в 04:44

    ***** СКОРОСТЬ ПРОДАЖИ *****
    1. Сначала получаем периоды, в которых изменялось значение остатка, и остаток был больше 0.
    2. Получаем таблицу заполненную рабочими днями из графика
    3. Соединяем таблицы по условию вхождения рабочих дней в период остатка
    4. Выбираем различное количество рабочих дней
     
    ВЫБРАТЬ
    ОстаткиТоваровОстаткиИОбороты.Номенклатура КАК Номенклатура,
    НАЧАЛОПЕРИОДА(ОстаткиТоваровОстаткиИОбороты.Период, ДЕНЬ) КАК НачПериода,
    НАЧАЛОПЕРИОДА(ОстаткиТоваровОстаткиИОбороты1.Период, ДЕНЬ) КАК КонПериода
    ПОМЕСТИТЬ ВТ_ОстаткиПоПериодам
    ИЗ
    РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, День, , {(Номенклатура)}) КАК ОстаткиТоваровОстаткиИОбороты
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, День, , {(Номенклатура)}) КАК ОстаткиТоваровОстаткиИОбороты1
    ПО ОстаткиТоваровОстаткиИОбороты.Номенклатура = ОстаткиТоваровОстаткиИОбороты1.Номенклатура
    И ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток = ОстаткиТоваровОстаткиИОбороты1.КоличествоНачальныйОстаток
    И (ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток > 0)
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ГрафикРаботы.Дата
    ПОМЕСТИТЬ ВТ_График
    ИЗ
    РегистрСведений.ГрафикРаботы КАК ГрафикРаботы
    ГДЕ
    ГрафикРаботы.ТипГрафика = &ТипГрафика
    И ВЫБОР
    КОГДА ГрафикРаботы.Значение ЕСТЬ NULL
    ТОГДА 0
    КОГДА ГрафикРаботы.Значение = 0
    ТОГДА 0
    ИНАЧЕ 1
    КОНЕЦ = 1
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТ_ОстаткиПоПериодам.Номенклатура КАК Номенклатура,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_График.Дата) КАК ДнейНаСкладе
    ПОМЕСТИТЬ ВТ_ОстаткиВНаличии
    ИЗ
    ВТ_ОстаткиПоПериодам КАК ВТ_ОстаткиПоПериодам
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_График КАК ВТ_График
    ПО (ВТ_График.Дата >= ВТ_ОстаткиПоПериодам.НачПериода)
    И (ВТ_График.Дата <= ВТ_ОстаткиПоПериодам.КонПериода)
     
    СГРУППИРОВАТЬ ПО
    ВТ_ОстаткиПоПериодам.Номенклатура
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот / ВТ_ОстаткиВНаличии.ДнейНаСкладе КАК СкоростьПродажи
    ИЗ
    РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ПродажиОбороты
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ОстаткиВНаличии КАК ВТ_ОстаткиВНаличии
    ПО ПродажиОбороты.Номенклатура = ВТ_ОстаткиВНаличии.Номенклатура
     

  36. Задание выполнено.
    На решение первой задачи “пошло” пять пакетов, на решение второй – 3. Вторая задача проверялась на регистре взаиморасчетов типовой конфигурации.

  37. Здравствуйте Евгений!
    что уровень выданных кредитов 10 000 руб.* 10 дней = 100 000, поскольку сумму 10 000 рублей клиент должен был нам с 10 по 20 января.
    Как это  реализовать мне почти понятно, совсем не  понятно практический смысл этих вычислений или это чисто учебная задача!? ( Просто интересно на 7.7 много экономических коэфицентов считал по дебиторки и кредиторки но с таким не сталкивался..)

    • Это учебная задача.
      Но она основана на “реальных событиях”.
      Есть задача, когда нужно определять стоимость привлеченных денег.
      Например, стоимость 1 привлеченного рубля составляет 24 коп. в год (24% ставка кредитования банками).
      И на основании полученных цифр можно посчитать сколько получила или проиграла компания за некоторый период.
      На основании результата можно поменять стратегию работы с клиентами..

  38. Спасибо, Евгений!
    Сумрак слегка развеялся! :)

  39. Алексей Иванов 03.12.2010 в 21:59

    Задание выполнил.
    Задача 1
    Создал пакет запросов.
    Запрос 1: Получаем остатки номенклатуры при помощи виртуальной таблицы остатки и обороты. Периодичность – день. В поля выводим признаки ненулевого остатка на начало и на конец дня. Также поля – номенклатура и дата. Выгружаем во временнут таблицу.
    Запрос 2: Получаем интервалы дат, в которые товар был в наличии. Делаем внутренний запрос, в котором связываем таблицу запроса 1 саму с собой левым соединением. Связь делаем по номенклатуре, датам (дата в левой таблице меньше или равна дате правой). Еще одно условие соединения – ненулевой остаток в левой таблице и нулевой конечный остаток в правой. Группируем по номенклатуре и дате из левой таблицы (это будет дата начала). Для даты из правой таблицы (дата окончания) используем выражение «ЕСТЬNULL(Остатки1.Дата, &ДатаКон)» и устанавливаем агр. Функцию «МИНИМУМ». . Во внешний запрос выводим поля номенклатура, дата начала, дата окончания. Во внешнем запросе группируем поля по номенклатуре и дате окончания, а для даты начала вычисляем минимум. Таким образом получаем интервалы дат, в которые товар был на складе с учетом того, что он мог оставаться на складе на дату окончания.
    Запрос 3: Получаем рабочие дни из графика.
    Запрос 4: Связываем таблицы запроса 2 и запроса 3 внутренним соединением, условие связи дата рабочего дня из графика должна быть внутри интервала дат, когда номенклатура есть в наличии. Выводим в поля номенклатуру и дату из графика, используем  агрегатную функцию «Количество различных» для дат из графика. Получаем количество рабочих дней, в которых был остаток по каждой номенклатуре
    Запрос 5: Связываем продажи с таблицей запроса 4, делим количество продажи на число дней.
     
    Задача 2.
    Создал пакет запросов.
    Запрос 1. из регистра бухгалтерии (Вирт. Таблица «Остатки и обороты», период – по дням, отбор по счетам 60 и 62) вытаскиваю дебиторку и кредиторку. Поля запроса: счет, контрагент, Дата, дебиторка (положительный остаток суммы), кредиторка (модуль отрицательного остатка суммы).
    Запрос 2. Связываю таблицу запроса 1 саму с собой левым соединением по счету, контрагенту, а также условию, что дата запроса 1 меньше даты запроса 2.
    Вывожу поля: счет, контрагент, дата нач. (дата из таблицы 1), дата кон (дата из таблицы 2), сумма дебиторки, сумма кредиторки. Также замечу, что дату из таблицы 2 получаю выражением «ЕСТЬNULL(Расчеты1.Дата, &ДатаКон)».
    Для даты из таблицы 2 использую агрегатную функцию «Минимум», по остальным полям группирую
    Таким образом получаем интервалы времени, в которые задолженность контрагента по виду взаиморасчетов была постоянной.
    Запрос 3. из таблицы запроса 3 получаю счет, контрагента, а также произведение дебиторки или кредиторки и разности дат.
    Общие итоги, итоги по счету и контрагентам по «Уровню дебиторки/кредиторки» вывожу в отчет при помощи компоновки данных.

  40. в тексте задания, непонятность:
    Для этого необходимо оценить, сколько дней и какая сумма сумма была перечислена авансом (мы должен)
    Я лично не понял, что за параметр “сколько дней”? И что означают цифры в примере 100 тыс. и 160 тыс. Они получились как произведение дней на рубли. Это какой-то финансовый показатель? Я что-то совсем не понял, к сожалению, даже то – какую смысловую нагрузку дают эти сотни тысяч :(

    • Текст задания обновил. См. запись.
      Сейчас стало все понятно?

      • Да, все стало понятно. Задание выполнил – получились портянки пакетных запросов, похожие на аналогичные портянки коллег.
        Во время просмотра 7 главы, видя как Вы, Евгений, накручиваете конструктором запрос, выполняете его,  видите ошибку, несмотря в текст запроса, возвращаетесь в конструктор и там правите – возник вопрос:  как вам удается анализировать запрос по закладкам конструктора? У вас там по 7-8 запросов в одной портянке, и вы даже в текст получаемых запросов не смотрите!? Я под впечатлением ;)

        • Все зависит от рода ошибки.
          Иногда приходится и в текст запроса заглянуть, чтобы понять несоответствие :)