Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Как заставить Общий модуль УправлениеЭлектроннойПочтой вставлять электронный адрес Контрагента из документа?          
Vzonder Подменю пользователя
сообщение 26.01.17, 21:32
Сообщение #1

Общительный
**
Группа: Пользователи
Сообщений: 38
Спасибо сказали: 1 раз
Рейтинг: 0


1C 8.2 УТ 10.3

Если отправлять письмо из ФормыЭлемена Контрагента, то все отлично.
В Кому вписывается адрес из представления Адрес электронной почты контрагента для обмена электронными документами.
Причем отлично работает как на встроенном клиенте, так и на внешнем (outlook)
Если нужно отправить письмо из документа, то тут проблема.
Пустое поля.
Прошарил инет: есть способ, который подходит для УП 10.3, но не подходит для нас, т.к у нас своя форма печати, в ней процедура:
Процедура ДействияФормыОтправитьПоEmail(Кнопка)
    РасширениеФайла = "";
    ТипПересылаемогоФайла = Неопределено;
    Если Кнопка.Имя = "ОтправитьКакMXL" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.MXL;
        РасширениеФайла = ".mxl";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакHTML" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.HTML;
        РасширениеФайла = ".html";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакXLS" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.XLS97;
        РасширениеФайла = ".xls";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакPDF" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.PDF;
        РасширениеФайла = ".pdf";
    Иначе
        Возврат;
    КонецЕсли;
    
    
    
    НаименованиеПечатнойФормы = СтрЗаменить(ОбъектПредставление,".","_");
    // сохраним ПФ во временный каталог
    ИмяФайлаСообщения = КаталогВременныхФайлов() + НаименованиеПечатнойФормы + РасширениеФайла;
    Если ТипЗнч(ТипПересылаемогоФайла) = Тип("ТипФайлаТабличногоДокумента") Тогда
        ЭлементыФормы.ТабличныйДокумент.Записать(ИмяФайлаСообщения, ТипПересылаемогоФайла);
    КонецЕсли;

    Если НЕ Константы.ИспользованиеВстроенногоПочтовогоКлиента.Получить() Тогда
        СтруктураПараметров = Новый Структура();
        СтруктураПараметров.Вставить("Тема", НаименованиеПечатнойФормы);
            УправлениеЭлектроннойПочтой.ОткрытьПисьмоПочтовогоКлиентаОперационнойСистемы(СтруктураПараметров);
    Иначе
        СтруктураНовогоПисьма = Новый Структура();
        СтруктураНовогоПисьма.Вставить("Тема",НаименованиеПечатнойФормы);
        СтруктураПисьма = УправлениеЭлектроннойПочтой.НаписатьПисьмо(глЗначениеПеременной("глТекущийПользователь"), СтруктураНовогоПисьма,,,,,,);
        Если СтруктураПисьма = Неопределено Тогда
            Возврат
        КонецЕсли;
        ВложенияПисьмаТЗ = СтруктураПисьма.Форма.ВложенияПисьмаТЗ.Добавить();
        Файл = Новый Файл(ИмяФайлаСообщения);
        ВложенияПисьмаТЗ.ИмяФайла = Файл.Имя;
        ВложенияПисьмаТЗ.Наименование = ОбъектПредставление;
        Попытка
            ВложенияПисьмаТЗ.Данные = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайлаСообщения), Новый СжатиеДанных);
        Исключение
            ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки());
        КонецПопытки;
        УдалитьФайлы(ИмяФайлаСообщения);
    КонецЕсли;
КонецПроцедуры    //    ДействияФормыОтправитьПоEmail()


Все великолепно работает, кроме вышеописанной проблемки.

Поковыряв, своими неопытными рученками нашел где формируется адрес:


Общий модуль УправлениеЭлектроннойПочтой:



// Функция определяет адрес электронной почты объекта
//
// Параметры
//  Объект - СправочникСсылка, для которого необходимо определить адрес электронной почты
//
Функция ОпределитьАдресПолучателя(Объект) Экспорт

    Запрос = Новый Запрос;
    
    Запрос.УстановитьПараметр("Объект", Объект);
    Запрос.УстановитьПараметр("Тип"   , Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
    
    Запрос.Текст = "
    |ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |    КонтактнаяИнформация.Представление,
    |    КонтактнаяИнформация.ЗначениеПоУмолчанию
    |ИЗ
    |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |    КонтактнаяИнформация.Объект = &Объект
    |    И
    |    КонтактнаяИнформация.Тип = &Тип
    |";
    
    Адрес = "";
    ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
    ТаблицаЗапроса.Индексы.Добавить("ЗначениеПоУмолчанию");
    Если ТаблицаЗапроса.Количество() > 0 Тогда
        СтрокаПоУмолчанию = ТаблицаЗапроса.Найти(Истина, "ЗначениеПоУмолчанию");
        Если СтрокаПоУмолчанию <> Неопределено Тогда
            Адрес = СтрокаПоУмолчанию.Представление;
        Иначе
            Адрес = ТаблицаЗапроса[0].Представление;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Адрес;

КонецФункции



Пожалуйста, помогите, изменить запрос так, чтобы вписывался адрес электронки текущего Контрагента из заказа покупателя.
И если возможно, и из РеализацииТоваровУслуг.
А если возможно, то Ваще из любого документа имеющего Контрагента.

logist Подменю пользователя
сообщение 26.01.17, 22:08
Сообщение #2

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Мне кажется, что использовать функцию НаписатьПисьмо не получится, т.к. она заточена под типовые документы, вам надо дорабатывать и её, или писать свою (или нет?).
Адрес можно получить так:
Емэйл = УправлениеКонтактнойИнформацией.ПолучитьEmailИзКонтактнойИнформации(Контрагент);



Signature
Личные бесплатные консультации не даю, для этого есть форум!

Flexy Подменю пользователя
сообщение 26.01.17, 22:14
Сообщение #3

Танцор с Бубном
Иконка группы
Группа: Местный
Сообщений: 1121
Из: Днепра
Спасибо сказали: 230 раз
Рейтинг: 0

Что такое УП 10.3? РФ?

Vzonder Подменю пользователя
сообщение 26.01.17, 22:50
Сообщение #4

Общительный
**
Группа: Пользователи
Сообщений: 38
Спасибо сказали: 1 раз
Рейтинг: 0

Flexy @ Сегодня, 23:14 * ,
УП 10.3 - очипятка, УТ 10.3

Vofka Подменю пользователя
сообщение 27.01.17, 10:38
Сообщение #5

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Я наверное что-то не понял. Откуда вы сейчас вызываете функцию ОпределитьАдресПолучателя() ? В том контексте, откуда она вызывается есть ссылка на документ (конкретный заказ или реализация)? Я полагаю, что должна быть, поэтому нужно просто вызвать функцию с нужным параметром, вроде:

Емейл = ОпределитьАдресПолучателя(ДокументСсылка.Контрагент);

Flexy Подменю пользователя
сообщение 27.01.17, 11:01
Сообщение #6

Танцор с Бубном
Иконка группы
Группа: Местный
Сообщений: 1121
Из: Днепра
Спасибо сказали: 230 раз
Рейтинг: 0

Vzonder @ Вчера, 22:50 * ,
УТ для Украины 2.3.
Будет работать только если в контексте формы отправки E-mail есть ссылка на документа или контрагента.
Если у Вас отправка происходит из общей формы "ПечатьДокументов", то не взлетит. Я давненько такое допиливал под УТП. Пришлось допиливать код в 3 или 4-х участках конфигурации.
Процедура ДействияФормыОтправитьПоEmail(Кнопка)
    РасширениеФайла = "";
    ТипПересылаемогоФайла = Неопределено;
    Если Кнопка.Имя = "ОтправитьКакMXL" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.MXL;
        РасширениеФайла = ".mxl";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакHTML" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.HTML;
        РасширениеФайла = ".html";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакXLS" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.XLS97;
        РасширениеФайла = ".xls";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакPDF" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.PDF;
        РасширениеФайла = ".pdf";
    Иначе
        Возврат;
    КонецЕсли;
    
    
    
    НаименованиеПечатнойФормы = СтрЗаменить(ОбъектПредставление,".","_");
    // сохраним ПФ во временный каталог
    ИмяФайлаСообщения = КаталогВременныхФайлов() + НаименованиеПечатнойФормы + РасширениеФайла;
    Если ТипЗнч(ТипПересылаемогоФайла) = Тип("ТипФайлаТабличногоДокумента") Тогда
        ЭлементыФормы.ТабличныйДокумент.Записать(ИмяФайлаСообщения, ТипПересылаемогоФайла);
    КонецЕсли;

    //Flexy
    Адрес = ОпределитьАдресПолучателя(ДокументСсылка.Контрагент);
    //--

    Если НЕ Константы.ИспользованиеВстроенногоПочтовогоКлиента.Получить() Тогда
        СтруктураПараметров = Новый Структура();
        СтруктураПараметров.Вставить("Тема", НаименованиеПечатнойФормы);
        
        // Flexy
        СтруктураПараметров.Вставить("Адрес", Адрес);
        //--
  
        УправлениеЭлектроннойПочтой.ОткрытьПисьмоПочтовогоКлиентаОперационнойСистемы(СтруктураПараметров);
    Иначе
        СтруктураНовогоПисьма = Новый Структура();
        СтруктураНовогоПисьма.Вставить("Тема",НаименованиеПечатнойФормы);
        
        // Flexy
        спПолучатели = Новый СписокЗначений;
        спПолучатели.Добавить(Адрес, "Адрес");
        СтруктураНовогоПисьма.Вставить("Кому", спПолучатели);
        //--  

        СтруктураПисьма = УправлениеЭлектроннойПочтой.НаписатьПисьмо(глЗначениеПеременной("глТекущийПользователь"), СтруктураНовогоПисьма,,,,,,);
        Если СтруктураПисьма = Неопределено Тогда
            Возврат
        КонецЕсли;
        ВложенияПисьмаТЗ = СтруктураПисьма.Форма.ВложенияПисьмаТЗ.Добавить();
        Файл = Новый Файл(ИмяФайлаСообщения);
        ВложенияПисьмаТЗ.ИмяФайла = Файл.Имя;
        ВложенияПисьмаТЗ.Наименование = ОбъектПредставление;
        Попытка
            ВложенияПисьмаТЗ.Данные = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайлаСообщения), Новый СжатиеДанных);
        Исключение
            ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки());
        КонецПопытки;
        УдалитьФайлы(ИмяФайлаСообщения);
    КонецЕсли;
КонецПроцедуры    //    ДействияФормыОтправитьПоEmail()


Сообщение отредактировал Flexy - 27.01.17, 11:12

Vzonder Подменю пользователя
сообщение 27.01.17, 14:31
Сообщение #7

Общительный
**
Группа: Пользователи
Сообщений: 38
Спасибо сказали: 1 раз
Рейтинг: 0

Flexy @ Сегодня, 12:01 * ,

Насколько я могу понимать, наименование контрагента имеется в табличной части, в представлении.
Возможно его от туда вытащить?
В макете он выражен так: <ТекстПокупатель> <ПредставлениеПолучателя>
На всякий - прилагаю весть код:





///////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
Перем Объект Экспорт;                        // Объект, который печатается
Перем ОбъектПредставление Экспорт;            // Представление объекта. Используется для формирования заголовка, имен сохраняемых файлов и т.п. Если не задано, то будет построено по "Объект"
Перем ДополнительноКПредставлению Экспорт;    // Строка, которая будет выведена дополнительно в конец заголовка формы
Перем Принтеры;                                // Список установленных в системе принтеров
Перем ИмяТекПринтера;                        // Имя принтера (как оно установлено в системе) на который будет осуществляться вывод


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

Функция ПолучитьПредставление(Объект)
    
    //+CRM
    Если Объект = Неопределено Тогда
        Возврат "";
    КонецЕсли;
    //-CRM
    
    // Определим тип переданного нам объекта (для всех "объектов" получим ссылки на них)
    Попытка
        ТипЗнчОбъекта = ТипЗнч(Объект.Ссылка);
    Исключение
        ТипЗнчОбъекта = ТипЗнч(Объект);
    КонецПопытки;
    
    // Определим представление в зависмоти от типа переданного нам объекта
    Представление = "";
    Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнчОбъекта) Тогда
        Представление = дкПолучитьПредставление(Объект);
    ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(ТипЗнчОбъекта) Тогда
        Представление = Объект.Метаданные().Синоним;
    КонецЕсли;
    
    Возврат Представление;
КонецФункции

// Приводит произвольную строку к идентификатору, который затем можно использовать как ключ структуры
// Преобразование выполняется разрушающим способом (обратное преобразование невозможно)
Функция обСтрокуКID(Стр) Экспорт
    Ст=обСтрокаПоМаске(Стр,"_0123456789
                           |ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
                           |АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя");
    Возврат ?(Найти("0123456789",Лев(Ст,1))>0,"_"+Ст,Ст);
КонецФункции // обСтрокуКID()

// Функция возвращает строку символов, полученную из исходной <Стр> GOAN
// заменой всех символов, не входящих в <Маска> на символ <Симв>
Функция обСтрокаПоМаске(Стр,Маска="",Симв="") Экспорт
    Ст=""; Если ПустаяСтрока(Маска) Тогда Возврат Ст; КонецЕсли;
    Для Сч=1 По СтрДлина(Стр) Цикл
        Сим=Сред(Стр,Сч,1);
        Если Найти(Маска,Сим)>0 Тогда Ст=Ст+Сим; Иначе Ст=Ст+Симв; КонецЕсли;
    КонецЦикла;
    Возврат Ст;
КонецФункции // обСтрокаПоМаске

// Возвращает представление для документа
// Параметры
// ЭтотОбъект - <ДокументСсылка> или <ДокументОбъект>
// АльтернативноеНазвание - Строка, используется, если хотим заменить синоним документа
// Возвращаемое значение:
// Строка - Строка представления документа
Функция дкПолучитьПредставление(ЭтотОбъект, АльтернативноеНазвание = "") Экспорт
    Попытка
        ТекстПредставления=?(ПустаяСтрока(АльтернативноеНазвание), ЭтотОбъект.Метаданные().Синоним, АльтернативноеНазвание)+" № "+СокрЛП(ЭтотОбъект.Номер)+" от "+Формат(ЭтотОбъект.Дата,"ДФ=dd.MM.yyyy");
    Исключение
        ТекстПредставления="Неправильный тип объекта!";
    КонецПопытки;
    Возврат ТекстПредставления;
КонецФункции // ПолучитьПредставление()

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ДЕЙСТВИЯ КОМАНДНЫХ ПАНЕЛЕЙ ФОРМЫ

// Процедура отправляет отчет по электронной почте в виде табличного документа mxl
Процедура ДействияФормыОтправитьПоEmail(Кнопка)
    РасширениеФайла = "";
    ТипПересылаемогоФайла = Неопределено;
    Если Кнопка.Имя = "ОтправитьКакMXL" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.MXL;
        РасширениеФайла = ".mxl";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакHTML" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.HTML;
        РасширениеФайла = ".html";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакXLS" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.XLS97;
        РасширениеФайла = ".xls";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакPDF" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.PDF;
        РасширениеФайла = ".pdf";
    Иначе
        Возврат;
    КонецЕсли;
    НаименованиеПечатнойФормы = СтрЗаменить(ОбъектПредставление,".","_");
    
    // сохраним ПФ во временный каталог
    ИмяФайлаСообщения = КаталогВременныхФайлов() + НаименованиеПечатнойФормы + РасширениеФайла;
    Если ТипЗнч(ТипПересылаемогоФайла) = Тип("ТипФайлаТабличногоДокумента") Тогда
        ЭлементыФормы.ТабличныйДокумент.Записать(ИмяФайлаСообщения, ТипПересылаемогоФайла);
    КонецЕсли;
    //
    //+CRM
    Если НЕ Константы.ИспользованиеВстроенногоПочтовогоКлиента.Получить() Тогда
        
        СтруктураПараметров = Новый Структура();
        СтруктураПараметров.Вставить("Тема", НаименованиеПечатнойФормы);
        
        УправлениеЭлектроннойПочтой.ОткрытьПисьмоПочтовогоКлиентаОперационнойСистемы(СтруктураПараметров);

    Иначе
        
        СтруктураНовогоПисьма = Новый Структура();
        СтруктураНовогоПисьма.Вставить("Тема",НаименованиеПечатнойФормы);
        
        СтруктураПисьма = УправлениеЭлектроннойПочтой.НаписатьПисьмо(глЗначениеПеременной("глТекущийПользователь"), СтруктураНовогоПисьма,,,,,,);
        Если СтруктураПисьма = Неопределено Тогда
            Возврат
        КонецЕсли;
        ВложенияПисьмаТЗ = СтруктураПисьма.Форма.ВложенияПисьмаТЗ.Добавить();
        Файл = Новый Файл(ИмяФайлаСообщения);
        ВложенияПисьмаТЗ.ИмяФайла = Файл.Имя;
        ВложенияПисьмаТЗ.Наименование = ОбъектПредставление;
        Попытка
            ВложенияПисьмаТЗ.Данные = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайлаСообщения), Новый СжатиеДанных);
        Исключение
            ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки());
        КонецПопытки;
        УдалитьФайлы(ИмяФайлаСообщения);
    КонецЕсли;
    //-CRM
        
КонецПроцедуры    //    ДействияФормыОтправитьПоEmail()

// Процедура сохраняет табличный документ в формате MXL под введенным пользователем именем файла
Процедура ДействияФормыСохранитьКакMXL(Кнопка)
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Заголовок        = "Сохранение табличного документа";
    Диалог.Фильтр            = "Табличный документ (*.mxl)|*.mxl";
    Диалог.Расширение        = "mxl";
    Диалог.ПолноеИмяФайла    = СтрЗаменить(ОбъектПредставление,".","_");
    Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");
    Если Диалог.Выбрать() Тогда
        Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
            ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.MXL);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

// Процедура сохраняет табличный документ в формате HTML под введенным пользователем именем файла
Процедура ДействияФормыСохранитьКакHTML(Кнопка)
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Заголовок        = "Сохранение веб-страницы";
    Диалог.Фильтр            = "Веб-страница (*.html)|*.html";
    Диалог.Расширение        = "html";
    Диалог.ПолноеИмяФайла    = СтрЗаменить(ОбъектПредставление,".","_");
    Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");    
    Если Диалог.Выбрать() Тогда
        Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
            ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.HTML);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры    //    ДействияФормыСохранитьКакHTML()

Процедура ДействияФормыСохранитьКакXLS(Кнопка)
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Заголовок        = "Сохранение документа Excel";
    Диалог.Фильтр            = "Документ Excel (*.xls)|*.xls";
    Диалог.Расширение        = "xls";
    Диалог.ПолноеИмяФайла    = СтрЗаменить(ОбъектПредставление,".","_");
    Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");    
    Если Диалог.Выбрать() Тогда
        Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
            ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

// Процедура сохраняет табличный документ в формате PDF под введенным пользователем именем файла
Процедура ДействияФормыСохранитьКакPDF(Кнопка)
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Заголовок        = "Сохранение документа PDF";
    Диалог.Фильтр            = "Документ PDF (*.pdf)|*.pdf";
    Диалог.Расширение        = "pdf";
    Диалог.ПолноеИмяФайла    = СтрЗаменить(ОбъектПредставление,".","_");
    Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");    
    Если Диалог.Выбрать() Тогда
        Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
            ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.PDF);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

// Процедура печатает табличный документ на выбраном принтере
Процедура ОсновныеДействияФормыПечать(Кнопка)
    ЭлементыФормы.ТабличныйДокумент.ИмяПринтера = ИмяТекПринтера;
    ЭкземпляровНаСтранице=0;//обПраво("КоличествоСтраницНаЛисте",глПрава);
    Если ЭкземпляровНаСтранице<>0 И ЭкземпляровНаСтранице<>1 И ЭкземпляровНаСтранице<>2 Тогда
        ЭкземпляровНаСтранице=0;
    КонецЕсли;
    ЭлементыФормы.ТабличныйДокумент.ЭкземпляровНаСтранице=ЭкземпляровНаСтранице;
    ЭлементыФормы.ТабличныйДокумент.Напечатать(НЕ ПустаяСтрока(ИмяТекПринтера));
    ЧислоКопий = ЭлементыФормы.ТабличныйДокумент.КоличествоЭкземпляров;
КонецПроцедуры

// Получает список принтеров установленных в системе и предлагает пользователю
// выбрать принтер для печати
Процедура ОсновныеДействияФормыСписокПринтеров(Кнопка)
    // Посмотрим был ли ранее составлен список принтеров, которые установлены в системе, если нет, тогда попытаемся получить его
    Если ТипЗнч(Принтеры) <> Тип("СписокЗначений") Тогда
        Принтеры = Новый СписокЗначений;
        Состояние("Составляется список принтеров. Подождите.");
        Попытка
            Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
            Сервисы = Locator.ConnectServer(".");
            Объекты = Сервисы.InstancesOf("Win32_Printer");
            
            // Теперь переберем все принтеры системы
            Для каждого Принтер из Объекты Цикл
                ИмяПринтера = Принтер.Name;
                Пока Найти(ИмяПринтера,"\") > 0 Цикл
                    ИмяПринтера = Сред(ИмяПринтера, Найти(ИмяПринтера,"\")+1);
                КонецЦикла;
                ИмяПринтера = СокрЛП(ИмяПринтера);
                
                Принтеры.Добавить(Принтер.Name,ИмяПринтера,(Принтер.Name=ИмяТекПринтера));
            КонецЦикла;
        Исключение
        КонецПопытки;
        Принтеры.Вставить(0,"ДиалогВыбораПринтера","Диалог выбора принтера",ПустаяСтрока(ИмяТекПринтера));
        Состояние();
    КонецЕсли;
    
    // Предложим пользователю выбрать один из принтеров
    Результат = ВыбратьИзМеню(Принтеры,ЭлементыФормы.кнВспомогательная);
    Если Результат = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Установим пометку у "текушего" принтера в списке
    Принтеры.ЗаполнитьПометки(ЛОЖЬ);
    Результат.Пометка = ИСТИНА;
    
    // Обработаем результат выбора
    ИмяТекПринтера = ?(Результат.Значение = "ДиалогВыбораПринтера","",Результат.Значение);
    ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст = "Печать"+?(ПустаяСтрока(ИмяТекПринтера),""," на <"+Результат.Представление+">");
    
    // Передвинем вспомогательную кнопку
    СтараяШирина = ЭлементыФормы.кнВспомогательная.Ширина;
    ЭлементыФормы.кнВспомогательная.Заголовок    = "";
    ЭлементыФормы.кнВспомогательная.Ширина        = 10;
    ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево - 1; // необходимо чтобы установилать "автоширина" кнопки
    ЭлементыФормы.кнВспомогательная.Заголовок = ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст;
    ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево + 1; // необходимо чтобы установилать "автоширина" кнопки
    ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево - (ЭлементыФормы.кнВспомогательная.Ширина - СтараяШирина);
    
    // Напечатаем
    ОсновныеДействияФормыПечать(Неопределено);
КонецПроцедуры

// Открывает окно "Предварительный просмотр"
Процедура ОсновныеДействияФормыПредварительныйПросмотр(Кнопка)
    ТекущийЭлемент    = ЭлементыФормы.ТабличныйДокумент;
    
    // Произведем эмуляцию нажатия клавишь. По ходу дела это единственный способ открыть окно просмотра печати
    WHSShell = Новый COMОбъект("WScript.Shell");
    WHSShell.SendKeys("%");
    WHSShell.SendKeys("~");
    WHSShell.SendKeys("{DOWN 10}");
    WHSShell.SendKeys("~");
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ, ВЫЗЫВАЕМЫЕ ИЗ ЭЛЕМЕНТОВ ФОРМЫ

Процедура ЧислоКопийПриИзменении(Элемент)
    ЭлементыФормы.ТабличныйДокумент.КоличествоЭкземпляров = ЧислоКопий;
КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

Процедура ПриОткрытии()
    // Сформеруем заголовок формы
    Если ПустаяСтрока(ОбъектПредставление) Тогда
        ОбъектПредставление = ПолучитьПредставление(Объект);
    КонецЕсли;
    Заголовок = "Печать <" + ОбъектПредставление + "> " + ДополнительноКПредставлению;
    
    // Восстановим ранее сохраненные настройки
    //ИмяСохраненияПараметров = "ПечатнаяФормаДокументов_" + обСтрокуКID(СтрЗаменить(ОбъектПредставление," ","_")) + "_" + обСтрокуКID(СтрЗаменить(ДополнительноКПредставлению," ","_"));
    //ЭлементыФормы.ТабличныйДокумент.ИмяПараметровПечати = ИмяСохраненияПараметров;
    ЧислоКопий = ЭлементыФормы.ТабличныйДокумент.КоличествоЭкземпляров;
    
    // "Вспомним" о том, на каком принтере в последний раз печатали
    ИмяТекПринтера = ЭлементыФормы.ТабличныйДокумент.ИмяПринтера;
    ПредставлениеТекПринтера = ИмяТекПринтера;
    Пока Найти(ПредставлениеТекПринтера,"\") > 0 Цикл
        ПредставлениеТекПринтера = Сред(ПредставлениеТекПринтера, Найти(ПредставлениеТекПринтера,"\")+1);
    КонецЦикла;
    ПредставлениеТекПринтера = СокрЛП(ПредставлениеТекПринтера);

    // Допишем имя текущего принтера к кнопке "Печать" и подготовим вспомогательную кнопку
    ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст = "Печать" + ?(ПустаяСтрока(ИмяТекПринтера),""," на <"+ПредставлениеТекПринтера+">");
    ЭлементыФормы.кнВспомогательная.Заголовок = ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст;
    ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево - 1; // необходимо чтобы установилать "автоширина" кнопки
    ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево + 1 - (ЭлементыФормы.кнВспомогательная.Ширина - 46) + 1;
    
    // Если табличный документ в режиме "Только просмотр", то сделаем серыми несколько кнопок
    ДоступностьКнопок = НЕ ЭлементыФормы.ТабличныйДокумент.ТолькоПросмотр;
//    ЭлементыФормы.ДействияФормы.Кнопки.ОткрытьВExcel   .Доступность    = ДоступностьКнопок;
    ЭлементыФормы.ДействияФормы.Кнопки.СохранитьКакMXL .Доступность    = ДоступностьКнопок;
    ЭлементыФормы.ДействияФормы.Кнопки.СохранитьКакHTML.Доступность    = ДоступностьКнопок;
    Для каждого ТекКнопка Из ЭлементыФормы.ДействияФормы.Кнопки.ОтправитьПоEmail.Кнопки Цикл
        ТекКнопка.Доступность = ДоступностьКнопок;
    КонецЦикла;
КонецПроцедуры




////////////////////////////////////////////////////////////////////////////////
// ИСПОЛНЯЕМАЯ ЧАСТЬ МОДУЛЯ
ОбъектПредставление            = Неопределено;
ДополнительноКПредставлению    = Неопределено;
Принтеры                    = Неопределено;

Flexy Подменю пользователя
сообщение 27.01.17, 14:43
Сообщение #8

Танцор с Бубном
Иконка группы
Группа: Местный
Сообщений: 1121
Из: Днепра
Спасибо сказали: 230 раз
Рейтинг: 0

Какой тип у переменной / реквизита "Объект" в этой обработке?

Vzonder Подменю пользователя
сообщение 27.01.17, 15:57
Сообщение #9

Общительный
**
Группа: Пользователи
Сообщений: 38
Спасибо сказали: 1 раз
Рейтинг: 0

Flexy @ Сегодня, 15:43 * ,
Реквизитов у формы только один - ЧислоКопий

Flexy Подменю пользователя
сообщение 27.01.17, 16:20
Сообщение #10

Танцор с Бубном
Иконка группы
Группа: Местный
Сообщений: 1121
Из: Днепра
Спасибо сказали: 230 раз
Рейтинг: 0

Процедура ДействияФормыОтправитьПоEmail(Кнопка)
    РасширениеФайла = "";
    ТипПересылаемогоФайла = Неопределено;
    Если Кнопка.Имя = "ОтправитьКакMXL" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.MXL;
        РасширениеФайла = ".mxl";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакHTML" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.HTML;
        РасширениеФайла = ".html";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакXLS" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.XLS97;
        РасширениеФайла = ".xls";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакPDF" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.PDF;
        РасширениеФайла = ".pdf";
    Иначе
        Возврат;
    КонецЕсли;
    
    
    
    НаименованиеПечатнойФормы = СтрЗаменить(ОбъектПредставление,".","_");
    // сохраним ПФ во временный каталог
    ИмяФайлаСообщения = КаталогВременныхФайлов() + НаименованиеПечатнойФормы + РасширениеФайла;
    Если ТипЗнч(ТипПересылаемогоФайла) = Тип("ТипФайлаТабличногоДокумента") Тогда
        ЭлементыФормы.ТабличныйДокумент.Записать(ИмяФайлаСообщения, ТипПересылаемогоФайла);
    КонецЕсли;
    
    // Flexy
    Адрес = "";
    ЭтоДокумент = ЗначениеЗаполнено(Объект) И Метаданные.Документы.Содержит(Объект.Метаданные());     
    Если ЭтоДокумент И ОбщегоНазначения.ЕстьРеквизитДокумента("Контрагент", Объект.Метаданные()) Тогда
        Адрес = ОпределитьАдресПолучателя(Объект.Контрагент);
    КонецЕсли;
    //--
    
    Если НЕ Константы.ИспользованиеВстроенногоПочтовогоКлиента.Получить() Тогда
        СтруктураПараметров = Новый Структура();
        СтруктураПараметров.Вставить("Тема", НаименованиеПечатнойФормы);
        
        // Flexy
        СтруктураПараметров.Вставить("Адрес", Адрес);
        //--
        
        УправлениеЭлектроннойПочтой.ОткрытьПисьмоПочтовогоКлиентаОперационнойСистемы(СтруктураПараметров);
    Иначе
        СтруктураНовогоПисьма = Новый Структура();
        СтруктураНовогоПисьма.Вставить("Тема",НаименованиеПечатнойФормы);
        
        // Flexy
        спПолучатели = Новый СписокЗначений;
        спПолучатели.Добавить(Адрес, "Адрес");
        СтруктураНовогоПисьма.Вставить("Кому", спПолучатели);
        //--  
        
        СтруктураПисьма = УправлениеЭлектроннойПочтой.НаписатьПисьмо(глЗначениеПеременной("глТекущийПользователь"), СтруктураНовогоПисьма,,,,,,);
        Если СтруктураПисьма = Неопределено Тогда
            Возврат
        КонецЕсли;
        ВложенияПисьмаТЗ = СтруктураПисьма.Форма.ВложенияПисьмаТЗ.Добавить();
        Файл = Новый Файл(ИмяФайлаСообщения);
        ВложенияПисьмаТЗ.ИмяФайла = Файл.Имя;
        ВложенияПисьмаТЗ.Наименование = ОбъектПредставление;
        Попытка
            ВложенияПисьмаТЗ.Данные = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайлаСообщения), Новый СжатиеДанных);
        Исключение
            ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки());
        КонецПопытки;
        УдалитьФайлы(ИмяФайлаСообщения);
    КонецЕсли;
КонецПроцедуры    //    ДействияФормыОтправитьПоEmail()


Сообщение отредактировал Flexy - 27.01.17, 16:21

Vzonder Подменю пользователя
сообщение 27.01.17, 16:35
Сообщение #11

Общительный
**
Группа: Пользователи
Сообщений: 38
Спасибо сказали: 1 раз
Рейтинг: 0

Flexy @ Сегодня, 17:20 * ,

{ОбщаяФорма.ПечатьДокументов.Форма(120,17)}: Процедура или функция с указанным именем не определена (ОпределитьАдресПолучателя)
Адрес = <<?>>ОпределитьАдресПолучателя(Объект.Контрагент); (Проверка: Толстый клиент (обычное приложение))

why.gif

Flexy Подменю пользователя
сообщение 27.01.17, 16:46
Сообщение #12

Танцор с Бубном
Иконка группы
Группа: Местный
Сообщений: 1121
Из: Днепра
Спасибо сказали: 230 раз
Рейтинг: 0

Цитата(Vzonder @ 27.01.17, 16:35) *
{ОбщаяФорма.ПечатьДокументов.Форма(120,17)}: Процедура или функция с указанным именем не определена (ОпределитьАдресПолучателя)
Адрес = <<?>>ОпределитьАдресПолучателя(Объект.Контрагент); (Проверка: Толстый клиент (обычное приложение))

Ну дык исправьте на:
Адрес = УправлениеЭлектроннойПочтой.ОпределитьАдресПолучателя(Объект.Контрагент);



Сообщение отредактировал Flexy - 27.01.17, 16:46

Спасибо сказали: Vzonder,

Vzonder Подменю пользователя
сообщение 27.01.17, 17:08
Сообщение #13

Общительный
**
Группа: Пользователи
Сообщений: 38
Спасибо сказали: 1 раз
Рейтинг: 0

Flexy @ Сегодня, 17:46 * ,
friends.gif 12201689.gif 47067070.gif 32542460.gif

СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО!

Все отлично заработало!!!
УРА.
Простите меня за тупость.
Я новичок нулевого уровня...
Конфигуратор открыл впервые в конце декабря.
Пришлось, кризис и сокращения и вот я поневоле.
пытаюсь облегчить жизнь сотрудникам в отделе...

Vzonder Подменю пользователя
сообщение 27.01.17, 19:08
Сообщение #14

Общительный
**
Группа: Пользователи
Сообщений: 38
Спасибо сказали: 1 раз
Рейтинг: 0

Vzonder @ Сегодня, 18:08 * ,



Подскажите, пожалуйста, а как добавить в отправление копию письма.

С Адрес ом и Темой - все понятно

Появилась необходимость отправлять письмо самому себе, где оно будет перемещаться в отправленное правилами обработки почты.

Т.к. POP3 не оставляет отправленных сообщений на почтовом сервере.

Дотаточно будет Копия = "";

Поискал в инете, и удивился, нет нигде инфо...

А как вписать вписать код, для Outlook в мой файл, для передачи файла - не разобрался.
        Outlook=Новый COMОбъект("Outlook.Application");
        ТипФайла="XLS";
        Письмо=Outlook.CreateItem(0);
        Письмо.Subject=ИмяФайлаВложения;
        Письмо.Body=ИмяФайлаВложения;
        ФайлаВложения=КаталогВременныхФайлов()+СтрЗаменить(ИмяФайлаВложения, ".", " ")+"."+ТипФайла;
        Документ.Записать(ФайлаВложения,ТипФайла);
        Письмо.Attachments.Add(ФайлаВложения);
        Попытка
            Письмо.Display();
        Исключение
        КонецПопытки;

Ковырялся, но дальше чем создать письмо не продвинулся...

Решил, просто посылать копию, только не вручную, думочки будут упускать этот момент....

Vzonder @ Сегодня, 19:54 * ,
Очипятка по Фрейду: Дамочки. ))))

Vzonder Подменю пользователя
сообщение 27.01.17, 20:17
Сообщение #15

Общительный
**
Группа: Пользователи
Сообщений: 38
Спасибо сказали: 1 раз
Рейтинг: 0

Vzonder @ Сегодня, 20:08 * ,


нашел как вручную поставить:

Копии = "адрес@мыло.ru";


спКипии = Новый СписокЗначений;
спКипии.Добавить(Копии, "Копия");
СтруктураНовогоПисьма.Вставить("Копии", спКипии);

Сейчас ищу как одрес организации вставить.

Vzonder Подменю пользователя
сообщение 27.01.17, 21:50
Сообщение #16

Общительный
**
Группа: Пользователи
Сообщений: 38
Спасибо сказали: 1 раз
Рейтинг: 0

Vzonder @ Сегодня, 21:17 * ,

Получилось.
Сделал по аналогии:
    Копии = "";
    ЭтоДокумент = ЗначениеЗаполнено(Объект) И Метаданные.Документы.Содержит(Объект.Метаданные());    
    Если ЭтоДокумент И ОбщегоНазначения.ЕстьРеквизитДокумента("Организация", Объект.Метаданные()) Тогда
        Копии = УправлениеЭлектроннойПочтой.ОпределитьАдресПолучателя(Объект.Организация);
        
    КонецЕсли;

И соответственно:
        спКипии = Новый СписокЗначений;    
        спКипии.Добавить(Копии, "Обязательная Копия обратно!!!");
        
        СтруктураНовогоПисьма.Вставить("Копии", спКипии);

Все работает великолепно, и тут выясняется, что счета, из ЗаказПокупателя - прекрасно проставляет
А Торг12 из РеализацияТоваровУслуг - нет ((((

Vofka Подменю пользователя
сообщение 30.01.17, 9:16
Сообщение #17

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Цитата(Vzonder @ 27.01.17, 17:08) *
СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО! СПАСИБО!

Для этого у нас, если что, даже кнопка специальная имеется

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 22:46
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!