Имя: Пароль:
   
1C
1С v8
Запрос не в цикле
0 Sem0709
 
04.10.18
17:06
Доброго всем. 8.3 обычная форма... на ночь глядя название темы не придумывается

Нужно на несколько электронный адрес контрагента отправить список документов.

Получаю контрагентов со строкой адресов из справочника.
Затем в цикле перебираю их и получаю список документов отдельным запросов. Но это ведь не правильно... запрос в цикле.

Помогите понять, как получить всё одним запросом.

То есть я должен получить строку с контрагентом, адресами, список документов
1 Wern
 
04.10.18
17:09
Зачем? Выигрыш в твоем случае не стоит хлопот.
2 Sem0709
 
04.10.18
17:12
(1) То есть делать запрос в цикле?
3 Лефмихалыч
 
naïve
04.10.18
17:18
соединить контрагентов с документами, а потом ИТоги ПО Контрагент
4 ILM
 
04.10.18
17:19
Ну выбери документы с отбором  "Контрагент В (&СписокКонтрагентов)
5 Михаил Козлов
 
04.10.18
17:19
ВЫБРАТЬ
  РН.Контрагент КАК Контрагент,
  КИ.Адрес КАК Адрес,
  РН.Ссылка КАК док
ИЗ Документы.РеализацияТоваровУслуг КАК РН
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КИ
ПО РН.Контрагент = КИ.Объект И КИ.ТипАдреса = &eMail
ИТОГИ МАКСИМУМ(Контрагент), МАКСИМУМ(Адрес) ПО Контрагент

Обходить по группировкам.
6 Sem0709
 
04.10.18
17:29
Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |    Документы.Ссылка,
    |ИЗ
    |    Документы.Приходные КАК Документы
    |ГДЕ
    |    Документы.Контрагент= &Контрагент";  
    

Для Каждого Строка ИЗ ТаблицаКонтрагентовИАдрес Цикл
    
    Запрос.УстановитьПараметр("Контрагент", Строка .Контрагент);

    Если ЗапросПутой Тогда
       Продолжить;
    КонецЕсли;

    РезультатЗапроса = Запрос.Выполнить().Выбрать();

    ОтправитьПисьмо(РезультатЗапроса);

КонецЦикла;

Чёт с итогами не понял до конца, у меня получиться что-то и с запросов выше?
7 Лефмихалыч
 
naïve
04.10.18
17:35
(6) нет, так не надо. Думай еще
8 dka80
 
04.10.18
17:37
Выбрать Документы.Ссылка, Контрагент Из Документы.Приходные Как Документы Где Документы.Контрагент В (&Контрагенты) Итоги по Контрагент

Запрос.УстановитьПараметры("Контрагенты", ТаблицаКонтрагентовИАдрес.ВыгрузитьКолонку(Контрагент));
Результат = Запрос.Выполнить();
ВыборкаКонтрагент = Результат.Выбрать(Обходрезультатазапроса.погруппировкам)
Пока ВыборкаКонтрагент.Следующий() Цикл
ВыборкаДокумент = ВыборкаКонтрагент.Выбрать();
текстДокумент = "";
Пока ВыборкаДокумент.Следующий() Цикл
текстдокумент = текстдокумент + ВыборкаДокумент.Ссылка;
КонецЦикла;
ОтправитьПисьмо(ВыборкаКонтрагент.Контрагент, ТекстДокумент);
КонецЦикла
9 Лефмихалыч
 
naïve
04.10.18
17:39
я даже знаю, каким будет следующий вопрос
10 Sem0709
 
04.10.18
17:42
(5) (8) (9) Аааа, "Обходить по группировкам" %)
Спасибо, понял.
11 Маленький Вопросик
 
04.10.18
17:51
а зачем здесь по-группировкам обходить?
12 Sem0709
 
04.10.18
17:55
Чтобы получить документы из группировки контрагента
13 Маленький Вопросик
 
04.10.18
18:02
(12) согласен с (1) работодатель твои умоизороты не оценит.
14 Sem0709
 
04.10.18
18:08
(13) Если у него нажатие будет отрабатывать 30 минут, то будет время оценить? :)
15 Sem0709
 
04.10.18
18:09
(13) А в итоге, Ваш вариант? В запросе делать?
16 Йохохо
 
04.10.18
18:15
(15) лучше финальный вариант покажи, а то у тебя
    Если ЗапросПутой Тогда
       Продолжить;
    КонецЕсли;

    РезультатЗапроса = Запрос.Выполнить().Выбрать();
как бы намекает
17 Sem0709
 
04.10.18
18:34
Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СтатусДокумента.Документ.Контрагент.НаименованиеПолное КАК ДокументКонтрагентНаименованиеПолное,
    |    СтатусДокумента.Документ.Контрагент.АдресЭлектроннойПочты КАК ДокументКонтрагентАдресЭлектроннойПочты,
    |    СтатусДокумента.Документ.ВходящийНомер КАК ВходящийНомер
    |ИЗ
    |    РегистрСведений.СтатусДокумента.СрезПоследних КАК СтатусДокумента
    |ГДЕ
    |    СтатусДокументаСрезПоследних.Документ.Проведен
    |    И СтатусДокументаСрезПоследних.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДокументов.СтопОплата)
    |
    |УПОРЯДОЧИТЬ ПО
    |    ДокументКонтрагентНаименованиеПолное,
    |    ВходящаяДата
    |ИТОГИ ПО
    |    ДокументКонтрагентНаименованиеПолное,
    |    ДокументКонтрагентАдресЭлектроннойПочты";
    
    РезультатЗапроса = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ДокументКонтрагентНаименованиеПолное");
    
    Пока РезультатЗапроса.Следующий() Цикл
        
        ТекстПисьма = "Уважаемый " + ДокументКонтрагентНаименованиеПолное + " Ваши стоп оплаты: ";
        ТаблицаАдресов = РазложитьСтрокуИПроверитьАдрес(РезультатЗапроса.ДокументКонтрагентАдресЭлектроннойПочты);
        
        ВыборкаДокументов = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДокументов.Следующий() Цикл
            ТекстПисьма = ТекстПисьма + " " + ВыборкаДокументов.ВходящийНомер;
        КонецЦикла;
        
        ОправитьПисьмо(ТекстПисьма, ТаблицаАдресов);
        
    КонецЦикла;
18 Sem0709
 
04.10.18
18:34
(16) Примерно так (17)
19 Sem0709
 
04.10.18
18:44
Конечно же... ну и тоже духе.

        
        Если НЕ ЗначениеЗаполнено(ТаблицаАдресов) Тогда
            Сообщить("Фиг, а не письмо: " + РезультатЗапроса.ДокументКонтрагентНаименованиеПолное);
            Продолжить; //или Возврат;
        КонецЕсли;
20 Йохохо
 
04.10.18
18:54
КАК СтатусДокумента
    |ГДЕ
    |    СтатусДокументаСрезПоследних
откуда Вы код берете?
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс