Часто при разработке какого-либо функционала в 1С мы делаем прикрепление файлов pdf.
Итак, Первым делом идет Выбор файла, далее нужно быстро просмотреть приложенный файл.
Для решения используются следующие варианты:
файл Выбирается по кнопке Выбор файла и помещается в Реквизит с типом Хранилище Значений
Код 1C v 8.х Процедура КнопкаВыбратьСканНажатие(Элемент)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл";
Диалог.ПолноеИмяФайла = "";
Фильтр = "Все файлы (*.*)|*.*";
Диалог.Фильтр = Фильтр;
Если Диалог.Выбрать() Тогда
Попытка
ПутьКВнешнемуФайлу = Диалог.ПолноеИмяФайла;
СканФайл = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ПутьКВнешнемуФайлу));
СканНазвание = СтрЗаменить(Диалог.ПолноеИмяФайла, Диалог.Каталог,"");
Исключение
СканНазвание = "ОШИБКА!";
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Для открытия используем:
1. Открытие файла в программе Adobe Acrobat Reader
для этого используйте код:
Код 1C v 8.х Процедура ОсновныеДействияФормыПечатьСканВорд(Кнопка)
ИмяМакета = СканФайл;
Если Прав(СканНазвание,3)="doc" или Прав(СканНазвание,3)="docx" Тогда
Состояние("Идет печать в Word");
УниверсальныеМеханизмы.НапечататьВнешнююФорму(Ссылка, ИмяМакета);
Иначе
ИмяКаталога = КаталогВременныхФайлов();
ИмяФайла = "vrem" + Формат(ТекущаяДата(),"ДФ=yyyyMMddhhmmss")+СокрЛП(Прав(СканНазвание,5));
ИмяФайла = РаботаСФайлами.ПолучитьИмяФайла(ИмяКаталога, ИмяФайла);
ДвоичныеДанные = ИмяМакета.Получить();
Если ДвоичныеДанные = Неопределено Тогда
Предупреждение("Не могу открыть файл, прикрепите новый внешний файл!");
Иначе
ДвоичныеДанные.Записать(ИмяФайла);
ЗапуститьПриложение(ИмяФайла);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
2. Добавляем на форму элемент ActiveX Adobe PDF Reader
для этого используйте код:
Код 1C v 8.х Процедура ОсновныеДействияФормыПечатьСканВорд(Кнопка)
ИмяМакета = СканФайл;
Если Прав(СканНазвание,3)="doc" или Прав(СканНазвание,3)="docx" Тогда
Состояние("Идет печать в Word");
УниверсальныеМеханизмы.НапечататьВнешнююФорму(Ссылка, ИмяМакета);
Иначе
ИмяКаталога = КаталогВременныхФайлов();
ИмяФайла = "vrem" + Формат(ТекущаяДата(),"ДФ=yyyyMMddhhmmss")+СокрЛП(Прав(СканНазвание,5));
ИмяФайла = РаботаСФайлами.ПолучитьИмяФайла(ИмяКаталога, ИмяФайла);
ДвоичныеДанные = ИмяМакета.Получить();
Если ДвоичныеДанные = Неопределено Тогда
Предупреждение("Не могу открыть файл, прикрепите новый внешний файл!");
Иначе
ДвоичныеДанные.Записать(ИмяФайла);
// Вывод в элемент ActiveX Adobe PDF Reader
ЭлементыФормы.PDFСканДоговор.LoadFile(ИмяФайла);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Вот так это выглядит:
Код 1C v 8.х Попытка
ОтправитьПоПочте2(ТекСтрока); // работает с Батом
Исключение
Попытка
ОтправитьПоПочте1(ТекСтрока); // работает с Аутлуком, но переспрашивает при отправке
Исключение
Сообщить_и_записать("Ошибка при отправке почты - "+ОписаниеОшибки(),СтатусСообщения.Важное);
КонецПопытки;
КонецПопытки;
Процедура ОтправитьПоПочте1(ТекСтрока)
Почта = Новый Почта;
Сообщение = Новый ПочтовоеСообщение;
//Работает с Аутглуком, но переспрашивает при отправке
//не работает с Батом 3.60
Почта.Подключиться("name@mysite.dp.ua","password");
Сообщение.Вложения.Добавить(ПолучитьИмяФайлаПодразделения(ТекСтрока.филиал.наименование));
Сообщение.Получатели.Добавить(ТекСтрока.филиал.email);
Сообщение.Тема ="Проигнорированные документы в офисе. Письмо сгенерированно роботом";
Сообщение.Текст="Проверьте, будь ласка эти документы ПОСЛЕ получения обновления из офиса. Ваши изменения в этих документах не попали в базу. Откройте прикрепленный файл";
Почта.Послать(Сообщение);
Почта.Отключиться();
УдалитьФайлы(ПолучитьИмяФайлаПодразделения(ТекСтрока.филиал.наименование));
КонецПроцедуры
Процедура ОтправитьПоПочте2(ТекСтрока)
ПочтовыйПрофиль = Новый ИнтернетПочтовыйПрофиль;
ПочтовыйПрофиль.АдресСервераPOP3 = "pop3.mysite.dp.ua";
ПочтовыйПрофиль.АдресСервераSMTP = "smtp.mysite.dp.ua";
ПочтовыйПрофиль.ПортSMTP = 25;
ПочтовыйПрофиль.ПортPOP3 = 110;
ПочтовыйПрофиль.Пользователь = "name";
ПочтовыйПрофиль.Пароль = "password";
ПочтовыйПрофиль.ВремяОжидания = 60;
Сообщение = Новый ИнтернетПочтовоеСообщение ;
Сообщение.Вложения.Добавить(ПолучитьИмяФайлаПодразделения(ТекСтрока.филиал.наименование));
Сообщение.Получатели.Добавить(ТекСтрока.филиал.email);
Сообщение.Тема ="Проигнорированные документы в офисе. Письмо сгенерированно роботом";
Сообщение.ИмяОтправителя="Обмен";
Сообщение.Отправитель="name@mysite.dp.ua";
Текст = Сообщение.Тексты.Добавить("Проверьте, будь ласка эти документы ПОСЛЕ получения обновления из офиса. Ваши изменения в этих документах не попали в базу. Откройте прикрепленный файл");
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Почта = Новый ИнтернетПочта();
Почта.Подключиться(ПочтовыйПрофиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
УдалитьФайлы(ПолучитьИмяФайлаПодразделения(ТекСтрока.филиал.наименование));
КонецПроцедуры
А вот так 1с работает с Мозилой Сундербердом (который хорошо поддерживает IMAP):
Код 1C v 8.х ПутьМозиллы = """C:/Program Files/Mozilla Thunderbird/thunderbird.exe""";
Текст = Новый ЗаписьТекста(КаталогОбмена + "sendfiletofilial"+Строка(ТекСтрока.филиал.наименование)+".bat", КодировкаТекста.OEM);
Текст.ЗаписатьСтроку("@echo off");
Текст.ЗаписатьСтроку("@echo Отправка проигнорированных писем на филиал"+Строка(ТекСтрока.филиал.наименование));
СтрокаЗапуска = " -compose to='"+ТекСтрока.филиал.email+"',cc='name@mysite.dp.ua',subject=""Проигнорированные документы в офисе. Письмо сгенерированно роботом"",body=""Проигнорированные документы в офисе. Письмо сгенерированно роботом"",attachment=""file://";
Файл = """"+ПолучитьИмяФайлаПодразделения(ТекСтрока.филиал.наименование)+"""";
Текст.ЗаписатьСтроку(ПутьМозиллы+СтрокаЗапуска +Файл);
Текст.ЗаписатьСтроку("del "+Файл);
Текст.Закрыть();
ЗапуститьПриложение(КаталогОбмена + "sendfiletofilial"+Строка(ТекСтрока.филиал.наименование)+".bat",КаталогОбмена)
Получение почты
Код 1C v 8.х
Процедура КнопкаВыполнитьНажатие(Кнопка)
Почта = Новый ИнтернетПочта;
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераPOP3 = "192.168.0.2";
Профиль.Пользователь = "romix";
Профиль.Пароль = "ТутНапишитеПароль";
Почта.Подключиться(Профиль);
МассивПисем = Почта.Выбрать(Ложь);
Для Каждого Письмо из МассивПисем Цикл
Сообщить("Получено письмо с заголовоком: "+Письмо.Тема);
Для Каждого Вложение из Письмо.Вложения Цикл
Сообщить("Вложение: "+Вложение.ИмяФайла);
Вложение.Данные.Записать("c:\tempdata\"+Вложение.ИмяФайла);
КонецЦикла;
Для Каждого Текст из Письмо.Тексты Цикл
Сообщить("Текст: "+Текст.Текст);
Текст.Данные.Записать("c:\tempdata\ТекстСообщения.txt");
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Автор: 1CLama