Имя: Пароль:
1C
1С v8
Запрос по РС КонтактнаяИнформация
,
0 animatic
 
20.05.15
13:29
Добрый день нужно получить таблицу в которой будут продажи по контрагентам с их адресами, при этом если есть адрес доставки, то выводится этот адрес, если его нет, то выводится адрес фактический, если и его нет - то адрес юридический.  
Пока думаю получать всех контрагентов со всеми видами адресов, а потом уже в коде через Если и Поиск выводить нужное. Хотелось бы более красивый способ найти. Можно ли одним запросом такую информацию получить?
1 D_E_S_131
 
20.05.15
13:41
Можно.
2 s_ustinov
 
20.05.15
13:44
Операция выбора в языке запросов

Оператор проверки значения на NULL
3 animatic
 
20.05.15
13:46
Вроде получилось, вот такой код, есть ли получше способ?

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

ОБЪЕДИНИТЬ ВСЕ

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

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

СГРУППИРОВАТЬ ПО
    КонтактнаяИнформация.Объект
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТПродажи.ВидОперации,
    ВТПродажи.Документ,
    ВТПродажи.ДатаДокумента КАК ДатаДокумента,
    ВТПродажи.НомерДокумента КАК НомерДокумента,
    ВТПродажи.ВалютаДокумента,
    ВТПродажи.Контрагент,
    ВТПродажи.КодКонтрагента,
    ВТПродажи.ИННКонтрагента,
    ВТПродажи.Организация,
    ВТПродажи.Номенклатура,
    ВТПродажи.КодНоменклатуры,
    ВТПродажи.Количество,
    ВТПродажи.Стоимость,
    ВТПродажи.НомерДокументаОснования,
    ВТПродажи.КодСклада,
    ВЫБОР
        КОГДА ВТАдреса.АдресДоставкиКонтрагента <> ""
            ТОГДА ВТАдреса.АдресДоставкиКонтрагента
        ИНАЧЕ ВЫБОР
                КОГДА ВТАдреса.ФактАдресКонтрагента <> ""
                    ТОГДА ВТАдреса.ФактАдресКонтрагента
                ИНАЧЕ ВЫБОР
                        КОГДА ВТАдреса.ЮрАдресКонтрагента <> ""
                            ТОГДА ВТАдреса.ЮрАдресКонтрагента
                        ИНАЧЕ "Адрес не введен в учетную систему"
                    КОНЕЦ
            КОНЕЦ
    КОНЕЦ КАК АдресКонтрагента
ИЗ
    ВТПродажи КАК ВТПродажи
        ЛЕВОЕ СОЕДИНЕНИЕ ВТАдреса КАК ВТАдреса
        ПО ВТПродажи.Контрагент = ВТАдреса.Объект

УПОРЯДОЧИТЬ ПО
    ДатаДокумента,
    НомерДокумента
АВТОУПОРЯДОЧИВАНИЕ
4 D_E_S_131
 
20.05.15
13:49
Наверное все это очень не быстро работает...
5 animatic
 
20.05.15
13:50
(4) да пока нормально, но на больших объемах не тестировал, поэтому и интересно есть ли более лучший или правильный способ.
6 animatic
 
20.05.15
13:51
(4) в принципе тут еще не предусмотрен случай, когда склад указывается в табличной части и он отличен от склада шапки, но у нас такого не бывает, поэтому не стал еще усложнять запрос.
7 FIXXXL
 
20.05.15
14:05
(0) отчет "Как проще всего слить базу"? :)
8 animatic
 
20.05.15
14:06
(7) не я его придумал( Вот выкручиваюсь как могу
9 D_E_S_131
 
20.05.15
14:13
Соединять Продажи с 3-мя копиями таблицы РС, но меняя условия соединения по виду и типу информации. Проверять на NULL при определении "какой адрес выводить".
10 animatic
 
20.05.15
14:20
(9) попробую, а три копии таблицы быстрее чем то, что выше?
11 D_E_S_131
 
20.05.15
14:22

ВЫБРАТЬ
    Контрагенты.Ссылка КАК КонтрагентСсылка,
    ВЫБОР
        КОГДА НЕ КИ_АдресДоставки.Объект ЕСТЬ NULL
            ТОГДА ВЫРАЗИТЬ(КИ_АдресДоставки.Представление КАК СТРОКА(1000))
        КОГДА НЕ КИ_АдресФакт.Объект ЕСТЬ NULL
            ТОГДА ВЫРАЗИТЬ(КИ_АдресФакт.Представление КАК СТРОКА(1000))
        КОГДА НЕ КИ_АдресЮр.Объект ЕСТЬ NULL
            ТОГДА ВЫРАЗИТЬ(КИ_АдресЮр.Представление КАК СТРОКА(1000))
        ИНАЧЕ ""
    КОНЕЦ КАК АдресКонтрагента
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация.СрезПоследних КАК КИ_АдресДоставки
        ПО Контрагенты.Ссылка = КИ_АдресДоставки.Объект
            И (КИ_АдресДоставки.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.АдресДоставкиКонтрагента))
            И (КИ_АдресДоставки.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация.СрезПоследних КАК КИ_АдресФакт
        ПО Контрагенты.Ссылка = КИ_АдресФакт.Объект
            И (КИ_АдресФакт.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
            И (КИ_АдресФакт.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ФактАдресКонтрагента))
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация.СрезПоследних КАК КИ_АдресЮр
        ПО Контрагенты.Ссылка = КИ_АдресЮр.Объект
            И (КИ_АдресЮр.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
            И (КИ_АдресЮр.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента))
ГДЕ
    Контрагенты.Ссылка В ИЕРАРХИИ(&ГруппаКонтрагентов)


Попробуй и расскажешь быстрее или нет.
12 animatic
 
20.05.15
14:29
(11) спасибо буду тестить
13 animatic
 
20.05.15
15:33
(11) короче по времени практически одинаково получается, хотя супер объемных данных нет. Там все время занимает сам запрос получения продаж, а потом получение адресов хоть тем, хоть этим способом общей роли не играет. Например, запрос без адреса за 11,92 сек. выполнился, с адресом по моему способу 14,82, по твоему - 14,50. Все на одинаковых данных.