Имя: Пароль:
1C
1С v8
Отправка почты, помогите с текстом письма
0 Айвонттубифри
 
12.03.20
15:51
Добрый день!

В таблице значений ТЗ1 собрала информацию о графике отпусков сотрудников всех подразделений. Теперь надо, чтобы каждый руководитель получал единое письмо с перечнем графиком отпусков сотрудников только своего подразделения. Причем, чтобы текст письма выводился так (можно:
- Иванов: запланирован отпуск с 01.01.2020 по 10.01.2020
- Петров: запланирован ...
- Сидоров: запланирован ...


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


Процедура ПодготовитьПисьмоРуководителю(ТЗ1, ТЗ2)
    
    мОтобранныеСтроки = Новый Массив;
    ТекПодразделение = "";
    
    //ТЗ1 и ТЗ2 - идентичные таблицы значений, в которой хранится информация об отпусках сотрудников всех подразделений
    //ниже, я делаю отбор по подразделению, чтобы руководитель получил график отпусков только своего подразделения
    
    Для каждого СтрокаТЗ ИЗ ТЗ1 Цикл
        
        ТекПодразделение = СтрокаТЗ.ТекущееПодразделение;
        СтруктураОтбора = Новый Структура;
        СтруктураОтбора.Вставить("ТекущееПодразделение", ТекПодразделение);
        СтруктураОтбора.Вставить("ДатаНачала", СтрокаТЗ.ДатаНачала);
        мОтобранныеСтроки = ТЗ2.НайтиСтроки(СтруктураОтбора);
        
        ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение); //руководитель получает в одном письме информацию о графике отпусков своего подразделения
        мОтобранныеСтроки.Очистить();
        
    КонецЦикла;
    
КонецПроцедуры


Процедура ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение);
    
    ПараметрыПисьма = Новый Структура;
    ПараметрыПисьма.Вставить("Кому",  ПочтовыйАдресРуководителя);
    ПараметрыПисьма.Вставить("Тема", "Рассылка по графику отпусков");    
    
    Для Каждого Строка ИЗ мОтобранныеСтроки Цикл;
        ТелоТекста = Строка.Сотрудник + " - запланирован отпуск с " + Формат(Строка.ДатаНачала, "ДФ=dd.MM.yyyy") +"г. по "+ Формат(Строка.ДатаОкончания, "ДФ=dd.MM.yyyy") + "г." + Символы.ВК;
        //вот здесь мне надо, чтобы текст письма выводился так:
        //Иванов - запланирован отпуск с 01.01.2020 по 10.01.2020
        //Петров - запланирован ...
        //Сидоров - запланирован ...
    КонецЦикла;
    
    ПараметрыПисьма.Вставить("Тело", ТелоТекста);
    
    ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
    
КонецПроцедуры
1 Айвонттубифри
 
12.03.20
15:52
+(0) Код некрасиво вставился, дублирую:

Процедура ПодготовитьПисьмоРуководителю(ТЗ1, ТЗ2)
    
    мОтобранныеСтроки = Новый Массив;
    ТекПодразделение = "";
    
    //ТЗ1 и ТЗ2 - идентичные таблицы значений, в которой хранится информация об отпусках сотрудников всех подразделений
    //ниже, я делаю отбор по подразделению, чтобы руководитель получил график отпусков только своего подразделения
    
    Для каждого СтрокаТЗ ИЗ ТЗ1 Цикл
        
        ТекПодразделение = СтрокаТЗ.ТекущееПодразделение;
        СтруктураОтбора = Новый Структура;
        СтруктураОтбора.Вставить("ТекущееПодразделение", ТекПодразделение);
        СтруктураОтбора.Вставить("ДатаНачала", СтрокаТЗ.ДатаНачала);
        мОтобранныеСтроки = ТЗ2.НайтиСтроки(СтруктураОтбора);
        
        ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение); //руководитель получает в одном письме информацию о графике отпусков своего подразделения
        мОтобранныеСтроки.Очистить();
        
    КонецЦикла;
    
КонецПроцедуры

Процедура ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение);
    
    ПараметрыПисьма = Новый Структура;
    ПараметрыПисьма.Вставить("Кому",  ПочтовыйАдресРуководителя);
    ПараметрыПисьма.Вставить("Тема", "Рассылка по графику отпусков");    
    
    Для Каждого Строка ИЗ мОтобранныеСтроки Цикл;
        ТелоТекста = Строка.Сотрудник + " - запланирован отпуск с " + Формат(Строка.ДатаНачала, "ДФ=dd.MM.yyyy") +"г. по "+ Формат(Строка.ДатаОкончания, "ДФ=dd.MM.yyyy") + "г." + Символы.ВК;
        //вот здесь мне надо, чтобы текст письма выводился так:
        //Иванов - запланирован отпуск с 01.01.2020 по 10.01.2020
        //Петров - запланирован ...
        //Сидоров - запланирован ...
    КонецЦикла;
    
    ПараметрыПисьма.Вставить("Тело", ТелоТекста);
    
    ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
    
КонецПроцедуры
2 8 bit
 
12.03.20
16:04
> Для Каждого Строка ИЗ мОтобранныеСтроки Цикл;
        ТелоТекста = Строка.Сотрудник + " - запланирован


ТелоТекста = "";

Для Каждого Строка ИЗ мОтобранныеСтроки Цикл;
        ТелоТекста = ТелоТекста + Строка.Сотрудник + " - запланирован...........

тут условие еще неплохо бы:
Если не последняя строка таблицы мОтобранныеСтроки тогда
ТелоТекста = ТелоТекста + символпереводастроки;
КонецЕсли;
3 dka80
 
12.03.20
17:42
О! У меня прям есть такая штука один в один, которая формирует текст письма в виде HTML
Только я вам ее на дам ))
4 dka80
 
12.03.20
17:44
Но идея такая: отбираются предстоящие отпуска, добавляются руководители. Далее это все выгружается в дерево для анализа, а затем дерево обходится по строкам первого уровня, где руководители, а затем по строкам второго уровня, где сотрудники
5 8 bit
 
12.03.20
17:50
(3)(4) умничка, возьми с полочки пирожочек вкусненький.
Только в (0) у чувака одна маленькая проблема - он перезатирает в цикле единственную строку, следовательно, в тело письма попадает последняя строка из той ТЗ, которую он передает в процедуру ОтправитьПисьмоРуководителю. И твой опыт ему ну никак не поможет.
6 pechkin
 
12.03.20
17:57
юзай типовой механизм рассылки отчетов. зачем свое изобретать?
7 Айвонттубифри
 
12.03.20
19:56
(0) Вобщем сделала так, вроде выводит все как мне надо,:

ТекстПисьма = "  Здравствуйте, " + ДанныеСтруктуры.Руководитель + "!" + "
    |<br />
    |<br />
    |<br />  Скоро начинается отпуск у сотрудника(ов) департамента: " + "
    |";

ТекстПисьма = ТекстПисьма + "<table border='1px'><th>ФИО</th><th>Дата начала</th><th>Дата окончания</th>";

Для каждого Строка Из мОтобранныеСтроки Цикл
    ТекстПисьма = ТекстПисьма + "<tr>";
    ТекстПисьма = ТекстПисьма + "<td>" + Строка.Сотрудник + "</td>";
    ТекстПисьма = ТекстПисьма + "<td>" + Формат(Строка.ДатаНачала, "ДФ=dd.MM.yyyy") + "г.</td>";
    ТекстПисьма = ТекстПисьма + "<td>" + Формат(Строка.ДатаОкончания, "ДФ=dd.MM.yyyy") + "г.</td>";
    ТекстПисьма = ТекстПисьма + "</tr>";
КонецЦикла;
ТекстПисьма = ТекстПисьма + "</table>";

ТекстПисьма = ТекстПисьма + "
    |<br />
    |<br />
    |<br />  Просим проконтролировать передачу заявления на отпуск (не позднее, чем за 2 недели до начала отпуска). " + "
    |<br />  Если даты отпуска поменяются, оповестите нас, пожалуйста. " + "
    |";

Текст = Письмо.Тексты.Добавить(ТекстПисьма);
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
Программист всегда исправляет последнюю ошибку.