Имя: Пароль:
1C
1С v8
Выбрать пару контактных лиц контрагентов.
,
0 Падаван в среде 1с
 
09.12.13
15:39
Добрый день. Помогите советом, как в запросе отобрать контактных лиц контрагентов.
Ситуация следующая:
За период отбираются документы продажи, из каждого документа берется контрагент и необходимо вывести по 2 контактных для каждого.

Суть в том, что на данный момент у кого-то 10 контактных лиц, у кого-то меньше. Выводить всех - нет необходимости. Достаточно 2-х.

Хотел в запросе поставить параметр ПЕРВЫЕ 2. Но в этом случае выборка вернет всего 2 записи. Как правильнее сделать, посоветуйте.
1 Ёпрст
 
09.12.13
15:43
Нам отсюда не видно, как хотел и что получилось.. Текст запроса показывай.
2 wms
 
09.12.13
15:43
в запросе никак
3 Ёпрст
 
09.12.13
15:45
(2) та ну ?
:))
4 bootini
 
09.12.13
15:48
Соединяй с Контактными лицами два раза, в одном поставь функцию в группировке максимум, в другом минимум.
5 mikecool
 
09.12.13
15:50
(0) выпирай первые 2 для каждого конрагента, я не против )
6 catena
 
09.12.13
15:52
(4)Зачем два раза?
7 mikecool
 
09.12.13
15:54
(6) да хоть три раза )))
8 wms
 
09.12.13
15:54
ну искл. извращения типа (4)
9 Падаван в среде 1с
 
09.12.13
15:55
Вот это изначальный запрос, возвращающий всех контактных лиц.

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

Хотел сделать так:

Нет кода как хотел.

Снова повис я - даже выразить не могу то,что в голове крутиться.

(4) мысль нравится, минимум и максимум - первого и последнего по-логике получим. Связать достаточно один раз вроде.
10 wms
 
09.12.13
15:58
через день захотят 3 контактных выводить среднее будем выводить?
а если 4? :-)
цикл в цикле сразу делай
11 Падаван в среде 1с
 
09.12.13
16:00
(10)Это логично... Но иначе как?! Вне запроса обработать можно было бы, но у меня отчет... Поэтому все желательно именно в запросе сделать.
12 wms
 
09.12.13
16:01
(11)Если СКД, то можно функцию вызывать из общего модуля и там выбирать нужное количество
13 Падаван в среде 1с
 
09.12.13
16:04
В СКД есть настройка - кол-во записей. В ней можно ограничить кол-во записей в каждой группировке
14 bootini
 
09.12.13
16:09
ВЫБРАТЬ
    Контрагенты.Ссылка,
    ВложенныйЗапрос.Ссылка КАК Ссылка1,
    ВложенныйЗапрос.Наименование,
    ВложенныйЗапрос.Должность,
    ВложенныйЗапрос.Комментарий,
    ВложенныйЗапрос.КонтактноеЛицо,
    ВложенныйЗапрос.Владелец
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 2
            КонтактныеЛицаКонтрагентов.Ссылка КАК Ссылка,
            КонтактныеЛицаКонтрагентов.Наименование КАК Наименование,
            КонтактныеЛицаКонтрагентов.Должность КАК Должность,
            КонтактныеЛицаКонтрагентов.Комментарий КАК Комментарий,
            КонтактныеЛицаКонтрагентов.КонтактноеЛицо КАК КонтактноеЛицо,
            КонтактныеЛицаКонтрагентов.Владелец КАК Владелец
        ИЗ
            Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов) КАК ВложенныйЗапрос
        ПО Контрагенты.Ссылка = ВложенныйЗапрос.Владелец
15 Падаван в среде 1с
 
09.12.13
17:35
Увы, данный код отбирает всего 2 первые записи из контактныхЛиц, и далее пытается связаться с КОнтрагентами.В итоге имеем, что записей нет.


Мой вариант с ограничением в СКД - оказался проблемным. Не все записи попадают(Вроде в запросе стоит Левое соединение у реализации, но тем не менее записи с пустыми контактными лицами в отчет не попали), плюс ограничение уровня ограничивает и данные(некоторые данные могут быть ниже, а их не увидим)
16 The_SpecialOne
 
09.12.13
18:09
Вот пример. По каждому контрагенту отбирается 2 контактных лица:
ВЫБРАТЬ
    Контрагенты.Ссылка КАК Контрагент,
    КонтактныеЛицаКонтрагентов.Ссылка КАК КонтактноеЛицо
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
        ПО (КонтактныеЛицаКонтрагентов.Ссылка В
                (ВЫБРАТЬ ПЕРВЫЕ 2
                    КонтактныеЛицаКонтрагентов.Ссылка
                ИЗ
                    Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
                ГДЕ
                    КонтактныеЛицаКонтрагентов.Владелец = Контрагенты.Ссылка))
17 Падаван в среде 1с
 
09.12.13
21:06
(16) премного благодарен. Значительно лучше выглядит, нежели как сделал я(минимум и максимум)