8.х УТ Сегменты запрета отгрузки

Тема в разделе ""1С:Управление торговлей УТ"", создана пользователем roofless, 19 сен 2014.

  1. TopicStarter Overlay
    roofless
    Offline

    roofless Опытный в 1С

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

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    В настройках отчета разве нельзя задать пользовательское поле с нужными вычислениями?
  3. TopicStarter Overlay
    roofless
    Offline

    roofless Опытный в 1С

    Регистрация:
    27 июн 2014
    Сообщения:
    260
    Симпатии:
    7
    Баллы:
    29
    настройках отчета или настройках формирования сегмента?
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Судя по скриншоту - в настройках формирования сегмента, через редактирование схемы компоновки
  5. TopicStarter Overlay
    roofless
    Offline

    roofless Опытный в 1С

    Регистрация:
    27 июн 2014
    Сообщения:
    260
    Симпатии:
    7
    Баллы:
    29
    для меня этот пакетный запрос очень труден для понимания, из конструктора не понятно, на каком шаге формируются итоговые данные. В последнем запросе пакета?
    Добавить поле я смог, но в отчет оно не попадает(
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    В пакетном запросе, данные для отчета формирует последний запрос.
    Итоговые данные могут формироваться не запросом, а вычисляемыми полями СхемыКомпоновкиДанных.
    Поле добавляли в запросе? На закладке "Компоновка" данных его так же необходимо добавить на закладке "Поля", потом добавить это поле в "Ресурсы".
    roofless нравится это.
  7. TopicStarter Overlay
    roofless
    Offline

    roofless Опытный в 1С

    Регистрация:
    27 июн 2014
    Сообщения:
    260
    Симпатии:
    7
    Баллы:
    29
    спасибо, ваша помощь очень кстати. В итоге получилось это
    Код:
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
        АналитикиПартнера.Партнер КАК Партнер,
        СУММА(ВЫБОР
                КОГДА ВложенныйЗапрос.СуммаОстаток < 0
                    ТОГДА -ВложенныйЗапрос.СуммаОстаток * ЕСТЬNULL(КурсыВалютыРасчетовВывод.Курс, 1) * ЕСТЬNULL(КурсыВалютыУпрВывод.Кратность, 1) / (ЕСТЬNULL(КурсыВалютыУпрВывод.Курс, 1) * ЕСТЬNULL(КурсыВалютыРасчетовВывод.Кратность, 1))
                ИНАЧЕ 0
            КОНЕЦ) КАК НашДолг,
        СУММА(ВЫБОР
                КОГДА ВложенныйЗапрос.СуммаОстаток > 0
                    ТОГДА ВложенныйЗапрос.СуммаОстаток * ЕСТЬNULL(КурсыВалютыРасчетовВывод.Курс, 1) * ЕСТЬNULL(КурсыВалютыУпрВывод.Кратность, 1) / (ЕСТЬNULL(КурсыВалютыУпрВывод.Курс, 1) * ЕСТЬNULL(КурсыВалютыРасчетовВывод.Кратность, 1))
                ИНАЧЕ 0
            КОНЕЦ) КАК ДолгПартнера,
        МАКСИМУМ(ЕСТЬNULL(ЗадолженностьПоПартнерамВывод.КоличествоДней, 0)) КАК КоличествоДнейПросрочки,
        МАКСИМУМ(ЕСТЬNULL(ЗадолженностьПоПартнерамВывод.ДолгКлиентаПросроченоВВалютеУпр, 0)) КАК ДолгКлиентаПросроченоВВалютеУпр,
        МАКСИМУМ(ЕСТЬNULL(ЗадолженностьПоПартнерамВывод.ДолгКлиентаПросроченоВВалютеРегл, 0)) КАК ДолгКлиентаПросроченоВВалютеРегл,
        МАКСИМУМ(ЕСТЬNULL(ЗадолженностьПоПартнерамВывод.ДолгКлиентаПросроченоВВалютеУпр, 0)) - СУММА(ВЫБОР
                КОГДА ВложенныйЗапрос.СуммаОстаток < 0
                    ТОГДА -ВложенныйЗапрос.СуммаОстаток * ЕСТЬNULL(КурсыВалютыРасчетовВывод.Курс, 1) * ЕСТЬNULL(КурсыВалютыУпрВывод.Кратность, 1) / (ЕСТЬNULL(КурсыВалютыУпрВывод.Курс, 1) * ЕСТЬNULL(КурсыВалютыРасчетовВывод.Кратность, 1))
                ИНАЧЕ 0
            КОНЕЦ) КАК Сальдо
    {ВЫБРАТЬ
        Партнер.* КАК ПартнерСегмента,
        НашДолг КАК ТекущийНашДолг,
        ДолгПартнера КАК ТекущийДолгПартнера,
        КоличествоДнейПросрочки,
        ДолгКлиентаПросроченоВВалютеУпр,
        ДолгКлиентаПросроченоВВалютеРегл,
        Сальдо}
    ИЗ
        КурсыВалютыУпрВывод КАК КурсыВалютыУпрВывод,
        (ВЫБРАТЬ
            РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам,
            РасчетыСКлиентамиОстатки.СуммаОстаток КАК СуммаОстаток,
            РасчетыСКлиентамиОстатки.ЗаказКлиента КАК ЗаказКлиента,
            РасчетыСКлиентамиОстатки.Валюта КАК Валюта
        ИЗ
            РегистрНакопления.РасчетыСКлиентами.Остатки(
                    ,
                    АналитикаУчетаПоПартнерам.Партнер В
                        (ВЫБРАТЬ
                            СоставСегмента.Партнер
                        ИЗ
                            СоставСегмента КАК СоставСегмента)) КАК РасчетыСКлиентамиОстатки) КАК ВложенныйЗапрос
            ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалютыРасчетовВывод КАК КурсыВалютыРасчетовВывод
            ПО ВложенныйЗапрос.Валюта = КурсыВалютыРасчетовВывод.Валюта
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикиПартнера
                ЛЕВОЕ СОЕДИНЕНИЕ ЗадолженностьПоПартнерамВывод КАК ЗадолженностьПоПартнерамВывод
                ПО АналитикиПартнера.Партнер = ЗадолженностьПоПартнерамВывод.Партнер
            ПО (АналитикиПартнера.КлючАналитики = ВложенныйЗапрос.АналитикаУчетаПоПартнерам)
    
    СГРУППИРОВАТЬ ПО
        АналитикиПартнера.Партнер
    
    УПОРЯДОЧИТЬ ПО
        Партнер
    работает, выводит правильно

Поделиться этой страницей