Отправка почты через Mail.ru с использованием технологии шифрования SSL Часто клиенты просят сделать автоматическую отправку счетов или отчетов на электронную почту, ниже приведены примеры кода для разных версий 1С:
Код 1C v 8.3
//Код для обычного приложения, для управляемого приложения отправка почты так же, только с файлами и предупреждение нужно изменить код
Функция ПолучитьПрофильПочты()
//Создаем профиль либо считываем из справочника
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";//Отправитель.АдресСервераSMTP; //"smtp.mail.ru";
Профиль.АдресСервераPOP3 = "pop.mail.ru"; //Отправитель.АдресСервераPOP3; //"pop.mail.ru";
Профиль.ПортPOP3 = 995;//Отправитель.ПортPOP3; //110;
Профиль.ПортSMTP = 465;//Отправитель.ПортSMTP; //587;
Профиль.Пользователь = "s_v@inbox.ru";// Отправитель.Email; //"test@mail.ru";
Профиль.Пароль = "8mFTnDjC4KftTzh"; //Отправитель.Пароль; //"123456789";
Профиль.ПользовательSMTP = "s_v@inbox.ru";//Отправитель.Email; //"test@mail.ru";
Профиль.ПарольSMTP = "8mFTnDjC4KftTzh";//Отправитель.Пароль; //"123456789";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.ИспользоватьSSLPOP3 = Истина;
Профиль.ИспользоватьSSLSMTP = Истина;
//Создаем письмо
Возврат Профиль;
КонецФункции
Процедура ОсновныеДействияФормыСчетОтправитьНаПочту(Кнопка)
Если ЗначениеЗаполнено(Ответственный.ПочтаДляОтправкиСчета) Тогда
Почта = Новый ИнтернетПочта;
Письмо = Новый ИнтернетПочтовоеСообщение;
Текст = Письмо.Тексты.Добавить("В приложении счет");
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Письмо.Тема = Строка(Ссылка);
Письмо.Отправитель = "s_vmeste@inbox.ru";
Письмо.ИмяОтправителя = "1С";
Письмо.Получатели.Добавить(Ответственный.ПочтаДляОтправкиСчета);
врфайл=ПолучитьИмяВременногоФайла("pdf");
текТабдок=СчетФаксимилеТовары(); //Функция возвращает табличный документ печать счета
текТабдок.Записать(врфайл,ТипФайлаТабличногоДокумента.PDF);
Письмо.Вложения.Добавить(врфайл);
//добавляем вложение если нужно, например "C:\Приложение.doc"
//Вложений можно добавлять сколько требуется.
//Отправляем письмо
Попытка
Почта.Подключиться(ПолучитьПрофильПочты()); Почта.Послать(Письмо); Предупреждение("Письмо отправлено",3);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
//Закрываем письмо
Почта.Отключиться();
//Закрываем файл вложения
Письмо.Вложения.Очистить();
Иначе
Предупреждение("В настройках ответственного не указана почта для отправки счета");
КонецЕсли;
КонецПроцедуры
С версиями 8.2 сложнее, так как все почтовые сервисы перешли на SSL, а медоты:
Код 1C v 8.3 Профиль.ИспользоватьSSLPOP3 = Истина;
Профиль.ИспользоватьSSLSMTP = Истина;
появились только в 8.3.1 , остается использовать stunnel или CDO :
Код 1C v 8.2 УП //Отправка через CDO, Адрессаты через ";"
Функция ПослатьПоПочте(Знач Адрессаты, ТемаСообщения = "",ТекстСообщения = "" ,СписокВложений = "")Экспорт
Оправитель = "s_v@inbox.ru";
Пароль = "8mFTnDjC4KftTzh";
loConfig = Новый COMОбъект("CDO.Configuration");
loCdoMessage = Новый COMОбъект("CDO.Message");
loCdoMessage.Configuration = loConfig;
loCdoMessage.From = Строка("1С <"+Оправитель+">"); //loCdoMessage.From = "Тест 1C"""" <xxxxxxx@yandex.ru>";
loCdoMessage.To = Адрессаты; //loCdoMessage.To = "xxxxxxx@gmail.ru>";
loCdoMessage.Subject = ?(ТемаСообщения="","1С",ТемаСообщения);
loCdoMessage.TextBody = "1C";
HTMLBody = "<html>
|<head>
|<meta content=""text/html; charset=Windows-1251"" http-equiv=""content-type"">
|<title> Тестовое сообщение </title>
|</head>
|<body>
|<h4>" + ТекстСообщения + "</h4>
|<p></p>
|</body>
|</html>";
//loCdoMessage.BodyPart.Charset = "windows-1251";
loCdoMessage.HTMLBody = HTMLBody;
Если ТипЗнч(СписокВложений) = Тип("Строка") И Не СписокВложений = "" Тогда
Попытка
loCdoMessage.AddAttachment(СписокВложений);
Исключение
КонецПопытки;
ИначеЕсли ТипЗнч(СписокВложений) = Тип("СписокЗначений") Тогда
Для каждого ПутьКВложению Из СписокВложений Цикл
Попытка
loCdoMessage.AddAttachment(ПутьКВложению.Значение);
Исключение
КонецПопытки;
КонецЦикла;
КонецЕсли;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing"). Value = 2;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver"). Value = "smtp.mail.ru";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport"). Value = "465";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"). Value = 1;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername"). Value = Оправитель;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword"). Value = Пароль;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl"). Value = 1;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 60;
loConfig.Fields.Update();
Попытка
loCdoMessage.Send();
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
Процедура ОсновныеДействияФормыСчетТовары(Кнопка)
Если ЗначениеЗаполнено(Менеджер.ПочтаДляОтправкиСчета) Тогда
врфайл=ПолучитьИмяВременногоФайла("xls");
текТабдок=СчетФаксимилеТовары();
текТабдок.Записать(врфайл,ТипФайлаТабличногоДокумента.XLS);
ПослатьПоПочте(Менеджер.ПочтаДляОтправкиСчета,Строка(Ссылка),"Счет в приложении",врфайл);
Предупреждение("Письмо отправлено",3);
Иначе
Предупреждение("В настройках ответственного не указана почта для отправки счета");
КонецЕсли;
КонецПроцедуры
Через stunnel в 1С код, менять не нужно, только установить программу и изменить настройки подключения к почтовому ящику
Скачиваем stunnel c официального сайта (stunnel.org) и запускаем инсталятор, жмем yes при установке спросит страну и ваши данные, это нужно для создания сертификата на вашем компьютере.
После запуска в трее появится его иконка, правой клавишей и редактировать edit configuration
В блокноте откроется файл настроек, там будет пример для gmail дополняем или заменяем его следующим:
Код Batch File (DOS, CMD, BAT) [gmail-pop3]
client = yes
accept = 127.0.0.1:10110
connect = pop.gmail.com:995
[gmail-imap]
client = yes
accept = 127.0.0.1:10143
connect = imap.gmail.com:993
[gmail-smtp]
client = yes
accept = 127.0.0.1:10025
connect = smtp.gmail.com:465
[yandex-pop3]
client = yes
accept = 127.0.0.1:20110
connect = pop.yandex.ru:995
[yandex-imap]
client = yes
accept = 127.0.0.1:20143
connect = imap.yandex.ru:993
[yandex-smtp]
client = yes
accept = 127.0.0.1:20025
connect = smtp.yandex.ru:465
[mail-pop3]
client = yes
accept = 127.0.0.1:30110
connect = pop.mail.ru:995
[mail-imap]
client = yes
accept = 127.0.0.1:30143
connect = imap.mail.ru:993
[mail-smtp]
client = yes
accept = 127.0.0.1:30025
connect = smtp.mail.ru:465
Сохраняем файл и делаем Reload configuration
В настройка 1С меняем порты для работы
gmail
pop3 10110
imap 10143
smtp 10025
yandex
pop3 20110
imap 20143
smtp 20025
mail
pop3 30110
imap 30143
smtp 30025
Если в коде прописано, то:
Код 1C v 8.х Функция ПолучитьПрофильПочты()
//Создаем профиль либо считываем из справочника
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "localhost";//"smtp.mail.ru";//Отправитель.АдресСервераSMTP; //"smtp.mail.ru";
Профиль.АдресСервераPOP3 = "localhost";//"pop.mail.ru"; //Отправитель.АдресСервераPOP3; //"pop.mail.ru";
Профиль.ПортPOP3 = 30110;//Отправитель.ПортPOP3; //110; 995
Профиль.ПортSMTP = 30025;//Отправитель.ПортSMTP; //587; 465
Профиль.Пользователь = "s_v@inbox.ru";// Отправитель.Email; //"test@mail.ru";
Профиль.Пароль = "8mFTnDjC4KftTzh"; //Отправитель.Пароль; //"123456789";
Профиль.ПользовательSMTP = "s_v@inbox.ru";//Отправитель.Email; //"test@mail.ru";
Профиль.ПарольSMTP = "8mFTnDjC4KftTzh";//Отправитель.Пароль; //"123456789";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
//Профиль.ИспользоватьSSLPOP3 = Истина;
//Профиль.ИспользоватьSSLSMTP = Истина;
//Создаем письмо
Возврат Профиль;
КонецФункции
Все, можно отправлять и проверять работу через консоль Show log window в меню
P.S. Почтовый ящик в примерах не рабочий, как пример
Категория:
Работа с Интернет, Почтой (Mail), FTP Отправка и получение почты с использованием технологии шифрования SSL Почти все почтовые сервисы перешли на использование SSL и для получения почты нужно использовать IMAP, можно конечно и POP, но это уже прошлый век )
Пример получения почты с mail.ru по IMAP используя SSL:
Код 1C v 8.3 Функция ПолучитьНовыеПисьма() Экспорт
Почта = Новый ИнтернетПочта;
ИспользоватьIMAP=Истина; ПочтовыйЯщик = "";
Профиль = ПолучитьПрофиль();
Попытка
Если ИспользоватьIMAP Тогда
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
Если ПочтовыйЯщик = "" Тогда
ПочтовыйЯщик = "INBOX";
КонецЕсли;
Почта.ТекущийПочтовыйЯщик = ПочтовыйЯщик;
Иначе;
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.POP3);
КонецЕсли;
Исключение
Сообщить(НСтр("ru = 'Ошибка при подключении к почтовому серверу. Проверьте настройки.'"));
Сообщить(ОписаниеОшибки());
Возврат 0;
КонецПопытки;
ЗагруженныеПисьма = ПолучитьИдентификаторыЗагруженныхПисем();
ИдентификаторыНовыхПисем = Почта.ПолучитьИдентификаторы(ЗагруженныеПисьма);
Если ИдентификаторыНовыхПисем.Количество() = 0 Тогда
//Новых нет
Иначе
//Получаем новые письма
Письма = Почта.Выбрать(Ложь, ИдентификаторыНовыхПисем,Истина);
Для каждого Письмо Из Письма Цикл
Если Найти(Письмо.Тема,"siteabc.ru")>0 Тогда //Если это наше письмо то грузим его
ПисьмоОбъект = Справочники.ВходящиеПисьма.СоздатьЭлемент();
ПисьмоОбъект.Идентификатор = Письмо.Идентификатор[0];
ПисьмоОбъект.Наименование = Письмо.Тема;
ПисьмоОбъект.Дата = Письмо.ДатаОтправления;
ПисьмоОбъект.Отправитель = Письмо.Отправитель;
Если ИспользоватьIMAP Тогда
ПисьмоОбъект.ПочтовыйЯщик = "IMAP/" + ПочтовыйЯщик;
Иначе
ПисьмоОбъект.ПочтовыйЯщик = "POP3";
КонецЕсли;
Для каждого Элемент Из Письмо.Тексты Цикл
Если Элемент.ТипТекста = ТипТекстаПочтовогоСообщения.HTML Тогда
ПисьмоОбъект.ВидСодержимого = "HTML";
Текст = Элемент.Текст;
Если Найти(Текст, "<HTML>") = 0 Тогда
Текст = "<HTML><BODY>" + Текст + "</BODY></HTML>";
КонецЕсли;
//Вложения = Новый Массив;
//// обрабатываем вложения, что бы правильно сформировать HTML
//Для каждого Вложение Из Письмо.Вложения Цикл
// Ид = "cid:" + Вложение.Идентификатор;
// Если Найти(Текст, Ид) <> 0 Тогда
// Вложения.Добавить(Вложение);
// КонецЕсли;
//КонецЦикла;
Прервать;
ИначеЕсли Элемент.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст Тогда
ПисьмоОбъект.ВидСодержимого ="Текст";
Текст = Элемент.Текст;
КонецЕсли;
КонецЦикла;
ПисьмоОбъект.Текст = Текст;
ПисьмоОбъект.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
Почта.Отключиться();
Функция ПолучитьПрофиль(ИмяОтправителя = "", ИспользоватьIMAP = Ложь) Экспорт
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
Профиль.POP3ПередSMTP=Ложь;
Профиль.АдресСервераIMAP = "imap.mail.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.ПользовательIMAP ="siteabcz@mail.ru";
Профиль.ПарольIMAP = "9Ljkuf";
Профиль.ТолькоЗащищеннаяАутентификацияIMAP = Ложь;
Возврат Профиль;
КонецФункции
Функция ПолучитьИдентификаторыЗагруженныхПисем() Экспорт
Идентификаторы = Новый Массив();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Идентификатор ИЗ Справочник.ВходящиеПисьма";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Идентификаторы.Добавить(Выборка.Идентификатор);
КонецЦикла;
Возврат Идентификаторы;
КонецФункции
/// ЕЩЕ примеры настройки профиля
Функция ПолучитьПрофиль(ИмяОтправителя = "", ИспользоватьIMAP = Ложь) Экспорт
//Профиль = Новый ИнтернетПочтовыйПрофиль;
//Профиль.АдресСервераSMTP = Выборка.АдресSMTPСервера;
//Профиль.ПортSMTP = Выборка.ПортSMTP;
//Профиль.ИспользоватьSSLSMTP = Выборка.SSLSMTP;
//Профиль.ПарольSMTP = Выборка.ПарольSMTP;
//Профиль.ПользовательSMTP = Выборка.ПользовательSMTP;
//Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Ложь;
//
//Профиль.АдресСервераIMAP = Выборка.АдресIMAPСервера;
//Профиль.ПортIMAP = Выборка.ПортIMAP;
//Профиль.ИспользоватьSSLIMAP = Выборка.SSLIMAP;
//Профиль.ПользовательIMAP = Выборка.ПользовательIMAP;
//Профиль.ПарольIMAP = Выборка.ПарольIMAP;
//Профиль.ТолькоЗащищеннаяАутентификацияIMAP = Ложь;
//
//Профиль.АдресСервераPOP3 = Выборка.АдресPOP3Сервера;
//Профиль.ПортPOP3 = Выборка.ПортPOP3;
//Профиль.ИспользоватьSSLPOP3 = Выборка.SSLPOP3;
//Профиль.Пароль = Выборка.ПарольPOP3;
//Профиль.Пользователь = Выборка.ПользовательPOP3;
//Профиль.ТолькоЗащищеннаяАутентификацияPOP3 = Ложь;
//
//Профиль.ВремяОжидания = Выборка.ТаймаутИнтернетПочты;
//
//ИмяОтправителя = Выборка.ИмяОтправителяПочтовогоСообщения;
//ИспользоватьIMAP = Выборка.ИспользоватьIMAP;
//
Профиль = Новый ИнтернетПочтовыйПрофиль;
//Профиль.АдресСервераSMTP = "smtp.mail.ru";
//Профиль.ПортSMTP = 465;
//Профиль.ИспользоватьSSLSMTP = Истина;
//Профиль.ПарольSMTP ="9LEY";
//Профиль.ПользовательSMTP = "siteabcz@mail.ru";
//Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Истина;
//Профиль.Пользователь = "siteabcz@mail.ru";
//Профиль.Пароль = "siteabcz";
//Профиль.АдресСервераPOP3 = "pop.mail.ru";
//Профиль.ПортPOP3 = 995;
//Профиль.ИспользоватьSSLPOP3 = Истина;
Профиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
Профиль.POP3ПередSMTP=Ложь;
Профиль.АдресСервераIMAP = "imap.mail.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.ПользовательIMAP ="siteabcz@mail.ru";
Профиль.ПарольIMAP = "siteabcz";
Профиль.ТолькоЗащищеннаяАутентификацияIMAP = Ложь;
Возврат Профиль;
КонецФункции
//ОБЩИЙ ПРИМЕР ОТПРАВКИ и ПОЛУЧЕНИЯ
Функция ОтправитьПисьмо(EmailОтправителя, ПарольОтправителя,
Порт, АдресСервера, EmailПолучателя,
ИмяПолучателя, ТекстСообщения,
ЗаголовокСообщения, МассивФайловыхПутей)
//ПОЧТОВЫЙ ПРОФИЛЬ
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.АдресСервераSMTP = АдресСервера;
Профиль.ПортSMTP = Порт;
Профиль.Пользователь = EmailОтправителя;
Профиль.Пароль = ПарольОтправителя;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
Профиль.ПарольSMTP = ПарольОтправителя;
Профиль.ПользовательSMTP = EmailОтправителя;
//ПОЧТОВОЕ СООБЩЕНИЕ
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = EmailОтправителя;
Сообщение.Тема = ЗаголовокСообщения;
Сообщение.Тексты.Добавить(ТекстСообщения, ТипТекстаПочтовогоСообщения.HTML);
Сообщение.Организация = "The company";
Адрес = Сообщение.Получатели.Добавить(EmailПолучателя);
Адрес.ОтображаемоеИмя = ИмяПолучателя;
Для каждого ПутьКФайлу Из МассивФайловыхПутей Цикл
Сообщение.Вложения.Добавить(ПутьКФайлу);
КонецЦикла;
// ПОЧТОВЫЙ СЕРВЕР
Почта = Новый ИнтернетПочта();
//Подключение к серверу
Попытка
Почта.Подключиться(Профиль);
Исключение
Сообщить("Ошибка при подключении к серверу: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
//Отправка письма
Попытка
Почта.Послать(Сообщение);
Исключение
Почта.Отключиться();
Сообщить("Ошибка при отправке письма: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Почта.Отключиться();
Возврат Истина;
КонецФункции
Функция ПолучитьПисьма()
//ПОЧТОВЫЙ ПРОФИЛЬ
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.Пользователь = "xxx@xxxx.xx";
Профиль.Пароль = "xxxxxx";
Профиль.АдресСервераPOP3 = "pop3.mail.ru";
ПРофиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
МассивПисем = Новый массив();
//ПОЛУЧЕНИЕ ПИСЕМ
Попытка
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
МассивПисем = Почта.Выбрать(Ложь);
Исключение
Сообщить("Ошибка получения почты " + ОписаниеОшибки());
КонецПопытки;
Возврат МассивПисем;
КонецФункции
Категория:
Работа с Интернет, Почтой (Mail), FTP Проверка на дублирование контрагентов по ИНН и КПП Часто клиенты просят включить при записи контрагента проверку на дублирование, в некоторых конфигурациях это встроенный функционал, а если этого нет, то:
1. Создаем общий модуль
и помещаем в него процедуру:
Код 1C v 8.3 //Проверка ИНН на дублирование
Процедура ЗапретДублированияКонтрагентовОбработкаПроверкиЗаполнения(ИНН, КПП, Источник, Отказ) Экспорт
// Проверка осуществляется только для контрагентов с заполненным ИНН и КПП
Если Не ЗначениеЗаполнено(ИНН) ИЛИ Не ЗначениеЗаполнено(КПП) Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПРЕДСТАВЛЕНИЕ(Контрагенты.Код) КАК Код,
| Контрагенты.Наименование,
| ПРЕДСТАВЛЕНИЕ(Контрагенты.КПП) КАК КПП
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН =ИНН
| И Контрагенты.КПП =КПП";
Если Не ЗначениеЗаполнено(Источник) Тогда
Запрос.Текст = Запрос.Текст + "
|И Контрагенты.Ссылка <>ссылкаТекущийКонтрагент";
КонецЕсли;
Запрос.УстановитьПараметр("ссылкаТекущийКонтрагент", Источник);
Запрос.УстановитьПараметр("ИНН", ИНН);
Запрос.УстановитьПараметр("КПП", КПП);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ТекстСообщения = "ВНИМАНИЕ! Существуют контрагенты с таким же ИНН/КПП ("+ИНН+"/"+КПП+"):";
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ТекстСообщения = ТекстСообщения + Символы.ПС + Строка(ВыборкаДетальныеЗаписи.Код)+" "+ Строка(ВыборкаДетальныеЗаписи.Наименование);
КонецЦикла;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстСообщения;
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
2. в форме контрагента в процедуру перед записью добавляем:
Код 1C v 8.3 Процедура ПередЗаписью(Отказ)
мЭтоНовый = ЭтоНовый();
мИНН = Ссылка.ИНН;
Если ОбособленноеПодразделение И ЗначениеЗаполнено(ГоловнойКонтрагент) И ГоловнойКонтрагент <> Ссылка Тогда
ИНН = ГоловнойКонтрагент.ИНН;
КонецЕсли;
//all4cf проверка на дубли
all4cf.ЗапретДублированияКонтрагентовОбработкаПроверкиЗаполнения(ИНН, КПП, Ссылка, Отказ);
КонецПроцедуры // ПередЗаписью()
Результат:
Категория:
Полезные, Универсальные Функции Конвертация экселя в картику
На листе екселя есть картинки, надписи в произвольной форме. Как это чудище с конвертировать в картинку. Нашел процедуру
ФайлПрограммы = НовыйФайл("C:\Program Files\Bullzip\PDF Printer\gs\gswin32c.exe");
Если Не ФайлПрограммы.Существует() Тогда ТекстСообщения = "Не установлена программа - Bullzip"; ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
Возврат "";
КонецЕсли;
ИмяКартинки = "Проба";
ПринтерPDF.SetValue("output", "D:\" +ИмяКартинки + ".jpg");
ПринтерPDF.SetValue("ShowSaveAS", "never");
ПринтерPDF.SetValue("ShowProgress", "no");
ПринтерPDF.SetValue("ShowProgressFinished", "no");
ПринтерPDF.SetValue("ShowSettings", "never");
ПринтерPDF.SetValue("ShowPDF", "no");
ПринтерPDF.SetValue("ConfirmOverwrite","no");
ПринтерPDF.SetValue("Device","jpeg");
ПринтерPDF.WriteSettings();
НастройкиПечатиОриентация= 1;// 1 - портерт, 2 - ландшафт.
НастройкиПечатиМасштаб= 100;// масштаб в процентах.
НастройкиПечатиРазложитьПоКопиям = 1;// 0 - не разбирать по копиям, 1 - разобрать по копиям.
НастройкиПечатиПолеЛев= 10;
НастройкиПечатиПолеПрав= 10;
НастройкиПечатиПолеВерх= 10;
НастройкиПечатиПолеНиз= 10;
НастройкиПечатиКолонтитулВерх= 0;
НастройкиПечатиКолонтитулНиз= 0;
НастройкиПечатиАвтомасштабПоШирине = 1;// 1 - включить, 0 - выключить.
НастройкиПечатиЧерноБелаяПечать = 0;// 1 - включить, 0 - выключить.
НастройкиПечатиИмяПринтера = "Bullzip PDF Printer";// Имя принтера в ОС
Таб.ПараметрыСтраницы(НастройкиПечатиОриентация, НастройкиПечатиМасштаб, НастройкиПечатиРазложитьПоКопиям,
НастройкиПечатиПолеЛев, НастройкиПечатиПолеПрав, НастройкиПечатиПолеВерх, НастройкиПечатиПолеНиз,
НастройкиПечатиКолонтитулВерх, НастройкиПечатиКолонтитулНиз, НастройкиПечатиАвтомасштабПоШирине,
НастройкиПечатиЧерноБелаяПечать, НастройкиПечатиИмяПринтера);
Таб.КоличествоЭкземпляров(1);
Таб.Напечатать(0);
Но есть вопрос? Как перетащить лист экселя в Таб? Нашел много способов и на этом форуме но перетаскиваются только текстовые данные, а мне нужно все.
Категория:
Работа с Microsoft Office и OpenOffice Функция переводит обычную cтроку в Шестнадцатеричное представление и обратно Код 1C v 8.х // Функция переводит обычную cтроку в шестнадцатеричное представление
// Параметры:
// ТекстСообщения - Строка - Текст сообщения
// ТипКодировки - Число - Тип кодировки (1 - каждый символ представляется 2 байтами, 0 - 1 байтом)
// Возвращаемое значение: Строка - Строка после перекодировки
//
Функция Str2Hex(ТекстСообщения, ТипКодировки)
СтрокаЗнаков = "";
Если ТипКодировки = 1 Тогда
ДлинаКодаСимвола = 4;
Иначе
ДлинаКодаСимвола = 2;
КонецЕсли;
Для К = 1 По СтрДлина(ТекстСообщения) Цикл
СтрокаЗнаков = СтрокаЗнаков + Padl(DecToHex(КодСимвола(Сред(ТекстСообщения, К, 1))), ДлинаКодаСимвола, "0");
КонецЦикла;
Возврат СтрокаЗнаков;
КонецФункции // Str2Hex()
// Функция переводит cтроку из шестнадцатеричного представления в обычную строку
// Параметры:
// СтрокаСимволов - Строка - Текст в шестнадцатеричном виде
// ПризнакКода - Строка - Тип кодировки ("0" - каждый символ представляется 1 байтами, "1" - 2 байтами)
// Возвращаемое значение: Строка - Строка после перекодировки
//
Функция StrHexToStr(СтрокаСимволов, ПризнакКода) Экспорт
Если Число(ПризнакКода) = 0 Тогда
КоличествоСимволов = 2;
Иначе
КоличествоСимволов = 4;
КонецЕсли;
к = 1;
Результат = "";
Пока к < СтрДлина(СтрокаСимволов) Цикл
Строка = Сред(СтрокаСимволов, к, КоличествоСимволов);
Результат = Результат + Символ(HexToDec(Строка));
к = к + КоличествоСимволов;
КонецЦикла;
Возврат Результат;
КонецФункции // StrHexToStr()
Категория:
Работа с Текстом (Строкой) Как организовать работу с почтой без установленного почтового клиента на компьютере пользователя? Код 1C v 8.х // Сформировать почтовый профиль.
// При отправке нет необходимости указывать настройки, связанные с POP сервером.
ИПП = Новый ИнтернетПочтовыйПрофиль;
ИПП.АдресСервераSMTP = Константы.АдресСервераSMTP.Получить();
ИПП.ВремяОжидания = Константы.ВремяОжидания.Получить();
ИПП.Пароль = Константы.Пароль.Получить();
ИПП.ПарольSMTP = Константы.ПарольSMTP.Получить();
ИПП.Пользователь = Константы.Пользователь.Получить();
ИПП.ПользовательSMTP = Константы.ПользовательSMTP.Получить();
ИПП.ПортSMTP = Константы.ПортSMTP.Получить();
// Создать сообщение.
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Получатели.Добавить("file@server.ru");
Сообщение.Отправитель.Адрес = "test@serv.ru";
Сообщение.Тема = "Срочно в номер!";
Сообщение.Тексты.Добавить("Доброе время суток!");
Вложение = Новый ДвоичныеДанные(ПутьКФайлуВложения);
Сообщение.Вложения.Добавить(Вложение,"attach.txt");
// Подключиться и отправить.
Почта = Новый ИнтернетПочта;
Почта.Подключиться(ИПП);
Почта.Послать(Сообщение);
Почта.Отключиться();
// Формирование почтового профиля.
// При получении нет необходимости указывать настройки, связанные с SMTP сервером.
СостояниеПриема = "Подключение к серверу";
ИПП = Новый ИнтернетПочтовыйПрофиль;
ИПП.АдресСервераPOP3 = Константы.АдресСервераPOP3.Получить();
ИПП.ВремяОжидания = Константы.ВремяОжидания.Получить();
ИПП.Пароль = Константы.Пароль.Получить();
ИПП.Пользователь = Константы.Пользователь.Получить();
ИПП.ПортPOP3 = Константы.ПортPOP3.Получить();
Соединение = Новый ИнтернетПочта;
Соединение.Подключиться(ИПП);
СостояниеПриема = "Получение выборки писем";
Выборка = Соединение.Выбрать(ЗабиратьССервера);
СостояниеПриема = "Создание документов - писем";
КоличествоВВыборке = Выборка.Количество();
Индекс = 1;
Для Каждого Письмо Из Выборка Цикл
ТекПозиция = Окр(Индекс * 100/КоличествоВВыборке);
Если ТекПозиция <> Позиция Тогда
Позиция = ТекПозиция;
КонецЕсли;
Док = Документы.Письмо.СоздатьДокумент();
Док.Тема = Письмо.Тема;
СтрПолучатели = "";
Для Каждого Адрес Из Письмо.Получатели Цикл
СтрПолучатели = СтрПолучатели + Адрес.Адрес + ",";
КонецЦикла;
Док.Получатели = СтрПолучатели;
Если ТипЗнч(Письмо.Отправитель) = Тип("Строка") Тогда
Отправитель = Письмо.Отправитель;
Иначе
Отправитель = Письмо.Отправитель.Адрес;
КонецЕсли;
Док.Отправитель = Отправитель;
Содержание = "";
Для Каждого ТекстСообщения Из Письмо.Тексты Цикл
Содержание = Содержание + ТекстСообщения.Текст + Символы.ПС;
КонецЦикла;
Док.Содержание = Содержание;
Индекс = Индекс + 1;
Док.Записать();
КонецЦикла;
Соединение.Отключиться();
Категория:
Работа с Интернет, Почтой (Mail), FTP Реквизит ~ Функция проверяет заполненность реквизитов объекта Как вызвать стандартную проверку заполнения реквизитов?
Код 1C v 8.2 УП ПроверитьЗаполнение()
Возвращаемое значение:
Тип: Булево. Истина - ошибок не обнаружено, Ложь - в противном случае.
Описание:
Проверяет заполнение реквизитов. Для реквизитов, у которых свойство "Проверка заполнения" установлено в значение "Показывать ошибку" и реквизит не заполнен, будет сформировано сообщение об ошибке.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент.
Код 1C v 8.2 УП &НаКлиенте
Процедура СформироватьБезСКД(Команда)
// Проверим заполнение обязательных реквизитов
Если Не ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
СформироватьСервер();
КонецПроцедуры
Обработчик проверки заполнения
У прикладных объектов на платформе 1С Предприятие 8.2 появился новый обработчик события ОбработкаПроверкиЗаполнения, где теперь рекомендуется делать все проверки на заполненность реквизитов объекта. Рассмотрим работу с этим обработчиком. Обработчик должен быть расположен в модуле объекта (для констант в модуле менеджера значений) и имеет следующий синтаксис:
Код 1C v 8.2 УП Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
КонецПроцедуры
Здесь параметр Отказ (тип Булево) отвечает за возможность дальнейшей работы программы после проверки заполнения, а в параметре ПроверяемыеРеквизиты(тип Массив) содержатся реквизиты объекта, которые система будет проверять на заполненность. Напомним, что в версии 1С Предприятие 8.2 появилось возможность на уровне свойств реквизитов объекта устанавливать свойство Проверка заполнения. Так вот в массив ПроверяемыеРеквизиты по умолчанию система помещает реквизиты с установленным свойством «Выдавать ошибку». Однако разработчик может сам некоторые реквизиты добавить в массив или удалить из него в зависимости от каких-либо условий:
Код 1C v 8.2 УП Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Клиент = ПроверяемыеРеквизиты.Найти("Контрагент");
Если Клиент<>Неопределено тогда
ПроверяемыеРеквизиты.Удалить(Клиент);
конецесли;
ПроверяемыеРеквизиты.Добавить("Склад");
КонецПроцедуры
Как видно из примера в качестве элементов массива выступают строковые наименование реквизитов, как они заданы в конфигураторе. Для того чтобы полностью отказаться от системной проверки, необходимо очистить массив. При этом разработчик может проводить проверку реквизитов по произвольным алгоритмам, система же проверяет только на заполненность/незаполненность:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Код 1C v 8.2 УП ПроверяемыеРеквизиты.Очистить();
Если Контрагент.ПометкаУдаления Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Нельзя указывать контрагента, помеченного на удаление!";
Сообщение.Поле = "Контрагент";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедур
Далее рассмотрим, когда вызывается данный обработчик. Это зависит от типа объекта и его свойств. Так для, например, для справочника обработчик вызывается перед записью объекта; для документа: если разрешено проведение - при проведении, иначе при записи; для обработки : при вызове стандартных команд "OK", Да". Подробно это описано во встроенной справке. Но также есть возможность вызвать данный обработчик в произвольный момент, используя метод объекта ПроверитьЗаполнение(). Например, определить команду Проверить в форме документа:
Код 1C v 8.2 УП &НаКлиенте
Процедура Проверить(Команда)
ПроверитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПроверитьНаСервере()
Документ = РеквизитФормыВЗначение("Объект");
Документ.ПроверитьЗаполнение();
КонецПроцедуры
Автор:
Борис Захаров
Код 1C v 8.х //СписокРеквизитов - список значений. Элемент списка значений - имена реквизитов для проверки через запятую.
//Если представление заполнено - считается, что передаются реквизиты табличной части. Пример:
СписокРеквизитовДляПроверки=Новый СписокЗначений;
СписокРеквизитовДляПроверки.Добавить("Контрагент,МестоХранения,ВидОперации");
СписокРеквизитовДляПроверки.Добавить("Номенклатура,Единица,Цена,Количество","ПолнаяТаблица");
СписокРеквизитовДляПроверки.Добавить("ВидОтклонений,Номенклатура,Единица,Серия,Цена,Количество","ТаблицаОтклонений");
Если Не глРеквизитыОбъектаЗаполнены(Источник,СписокРеквизитовДляПроверки) Тогда
Отказ=Истина;
Возврат;
КонецЕсли;
Функция глРеквизитыОбъектаЗаполнены(Объект,СписокРеквизитов) Экспорт
МетаданныеОбъекта=Объект.Метаданные();
МетаданныеТабличныеЧасти=МетаданныеОбъекта.ТабличныеЧасти;
РеквизитыЗаполнены=Истина;
СтрокаДляВыполнения="";
Для каждого НаборРеквизитов Из СписокРеквизитов Цикл
НаименованиеТаблицы=НаборРеквизитов.Представление;
РеквизитыДляПроверки=СтрЗаменить(НаборРеквизитов.Значение,",",Символы.ПС);
ДлинаСпискаРеквизитов=СтрЧислоСтрок(РеквизитыДляПроверки);
Если НаименованиеТаблицы<>"" Тогда
МетаданныеТаблица=МетаданныеТабличныеЧасти[НаименованиеТаблицы];
МетаданныеРевизитыТаблицы=МетаданныеТаблица.Реквизиты;
ТаблицаОбъекта=Объект[НаименованиеТаблицы];
Для СчетчикСтрокРевизитов=1 По ДлинаСпискаРеквизитов Цикл
ИдентРеквизита=СтрПолучитьСтроку(РеквизитыДляПроверки,СчетчикСтрокРевизитов);
МетаданныеРеквизит=МетаданныеРевизитыТаблицы[ИдентРеквизита];
ОписаниеТиповРеквизита=МетаданныеРеквизит.Тип;
ТипыЗначенийРеквизита=ОписаниеТиповРеквизита.Типы();
СтрокаПоиска=ТаблицаОбъекта.Найти(глПолучитьПустоеЗначениеТипа(ТипыЗначенийРеквизита[0]),ИдентРеквизита);
Если СтрокаПоиска=Неопределено Тогда
Продолжить;
КонецЕсли;
Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+МетаданныеРеквизит.Синоним+""" Табличная часть строка "+СтрокаПоиска.НомерСтроки);
КонецЦикла;
Иначе
Для СчетчикСтрокРевизитов=1 По ДлинаСпискаРеквизитов Цикл
ИдентРеквизита=СтрПолучитьСтроку(РеквизитыДляПроверки,СчетчикСтрокРевизитов);
Если Не ЗначениеЗаполнено(Объект[ИдентРеквизита]) Тогда
МетаданныеРевизитыШапки=МетаданныеОбъекта.Реквизиты;
Попытка
Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+МетаданныеРевизитыШапки[ИдентРеквизита].Синоним+"""");
Исключение
Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+ИдентРеквизита+"""");
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Код 1C v 8.х // Ярослав Волохов aka YVolohov
// Функция проверяет заполнение шапки или табличной части справочника, документа или плана, бизнес-процесса, задачи
// Параметры:
// пИмяТаблицы (строка) - имя табличной части объекта, если не указано то будет проверятся шапка объекта
// пИменаПолей (массив строк) - имена проверяемых реквизитов объекта
// пВыводитьСообщения - если это свойство установлено в "Истина" то будут выводится сообщения в табло о
// незаполненных реквизитах таблицы, если не установлено - то не будут
// пСсылка (ссылка) - ссылка на элемент справочника или плана, документ, по которому будет произведена проверка
// Возвращаемое значение:
// Истина - если все реквизиты найдены и заполнены
// Ложь - если хоть один реквизит не заполнен, табличная часть не найдена
// или хоть один реквизит не найден
Функция ПроверитьЗаполнениеТаблицыОбъекта(пИмяТаблицы = Неопределено,
пИменаПолей, пВыводитьСообщения = Истина, пСсылка) Экспорт
МассивСообщений = Новый Массив;
ЗначениеВозврата = Истина;
МетаданныеОбъекта = пСсылка.Метаданные();
Если НЕ(пИмяТаблицы = Неопределено) Тогда
МетаданныеТаблицы = МетаданныеОбъекта.ТабличныеЧасти.Найти(пИмяТаблицы);
Иначе
МетаданныеТаблицы = МетаданныеОбъекта;
КонецЕсли;
// Проверка существования табличной части
Если НЕ(МетаданныеТаблицы = Неопределено) Тогда
МассивМетаданныхРеквизитов = Новый Массив;
МетаданныеРеквизитов = МетаданныеТаблицы.Реквизиты;
// Проверка существования полей
Для Каждого ИмяПоля Из пИменаПолей Цикл
МетаданныеРеквизита = МетаданныеРеквизитов.Найти(ИмяПоля);
Если НЕ(МетаданныеРеквизита = Неопределено) Тогда
МассивМетаданныхРеквизитов.Добавить(МетаданныеРеквизита);
Иначе
Если пИмяТаблицы = Неопределено Тогда
МассивСообщений.Добавить("Реквизит шапки с именем '" + ИмяПоля + "' не найден !!!");
Иначе
МассивСообщений.Добавить("Реквизит табличной части '" + пИмяТаблицы + "' с именем '" +
ИмяПоля + "' не найден !!!");
КонецЕсли;
ЗначениеВозврата = Ложь;
КонецЕсли;
КонецЦикла;
// Проверка заполнения полей
КоличествоСтрокТаблицы = ?(НЕ(пИмяТаблицы = Неопределено), пСсылка[пИмяТаблицы].Количество(), 1);
КоличествоСтрокТаблицы = ?(МассивМетаданныхРеквизитов.Количество() > 0, КоличествоСтрокТаблицы, 0);
// Обход строк таблицы
Для НомерСтрокиТаблицы = 1 По КоличествоСтрокТаблицы Цикл
СтрокаТаблицы = ?(НЕ(пИмяТаблицы = Неопределено),
пСсылка[пИмяТаблицы].Получить(НомерСтрокиТаблицы - 1), пСсылка);
// Обход списка проверяемых реквизитов
Для Каждого ЭлементМетаданныхРеквизитов Из МассивМетаданныхРеквизитов Цикл
// Получение значения ячейки и проверка ее заполнения
ЗначениеЯчейкиТЧ = СтрокаТаблицы[ЭлементМетаданныхРеквизитов.Имя];
ЯчейкаПустая = НЕ(ЗначениеЗаполнено(ЗначениеЯчейкиТЧ));
// Если значение пустое, добавляем сообщение в массив сообщений
Если ЯчейкаПустая Тогда
Если пИмяТаблицы = Неопределено Тогда
МассивСообщений.Добавить("Реквизит шапки с именем '" + ЭлементМетаданныхРеквизитов.Имя + "' не заполнен !!!");
Иначе
МассивСообщений.Добавить("В строке № " + НомерСтрокиТаблицы + " табличной части '" +
пИмяТаблицы + "' не заполнен реквизит с именем '" + ЭлементМетаданныхРеквизитов.Имя + "' !!!");
КонецЕсли;
ЗначениеВозврата = Ложь;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Иначе
МассивСообщений.Добавить("Табличная часть с именем '" + пИмяТаблицы + "' не найдена !!!");
ЗначениеВозврата = Ложь;
КонецЕсли;
// Здесь выводим все сообщения
Если пВыводитьСообщения Тогда
Для Каждого ТекстСообщения Из МассивСообщений Цикл
Сообщить(ТекстСообщения, СтатусСообщения.Важное);
КонецЦикла;
КонецЕсли;
Возврат ЗначениеВозврата;
КонецФункции
Категория:
Работа с Формой (Диалог) и её элементами Работа с Почтой в 1С: Предприятие v 8 У разработчиков на платформе 1С иногда возникает задача по взаимодействию системы 1С: Предприятие с различными почтовыми программами и протоколами. 1С Предприятие 8.0 имеет довольно удобные средства для отправки сообщений, импорта писем из почтового клиента в справочник или другой объект конфигурации, работы с MAPI, SMTP или POP3.
При работе с почтой разделяют два способа доступа к почтовому ящику, почтовому клиенту:
объект "Почта" и объект "Интернет почта", каждый из объектов имеет свои достоинства.
Почта - предоставляет доступ к почте через встроенный почтовый клиент, работает по технологии MAPI.
Интернет почта - объект открывает возможности по доступу непосредственно к почтовым ящикам и учетным записям находящимися на почтовом сервере, использование и работа данного объекта не зависит от установленных в системе почтовых клиентов, даже если почтовый клиент установлен в системе "ИнтернетПочта" будет работать параллельно с ним, объект использует интернет-протоколы SMTP, POP3.
1.Получение сообщений объектом "Почта".
Для работы с объектом Почта необходимо наличие установленного на компьютере почтового клиента с описанными учетными записями.
Для подключения к почтовому клиенту у объекта есть метод "Подключиться".
Код 1C v 8.х
Почта = Новый Почта;
Почта.Подключиться(,);
Первый параметр - имя профиля, к примеру, если в системе установлен MS Outlook, то как правило его профиль называется Outlook. Следовательно при подключении строка выглядела бы так:
Код 1C v 8.х
Почта.Подключиться("Outlook");
Второй параметр отвечает за пароль к учетной записи.
Далее необходимо произвести выбор необходимых нам писем, для этой цели объект Почта имеет метод "Выбрать". У метода два параметра, первый отвечает за выбор непрочитанных писем - Истина (при Ложь будут выбраны все письма, находящиеся в папке "Входящие" почтового клиента), второй отвечает за выборку вложений, при Ложь, вложения выбираются.
//Выбираем все письма, со всеми вложениями.
Код 1C v 8.х Сообщения = Почта.Выбрать(Ложь,Ложь);
(иногда при взаимодействии с Outlook 2003 возникает проблема, при которой 1С 8 просто аварийно завершает работу с ошибкой, именно на данной строке кода, это лечится установкой пакета обновления SP2 для MS Office 2003).
Далее после выборки сообщений необходимо перебрать их в цикле и сохранить, на форме необходимо добавить ТабличноеПоле1 куда будут сохраняться входящие письма.
Код 1C v 8.х Для каждого Сообщение Из Сообщения Цикл
//Добавляем строку в табличную часть
СтрокаТП = ТабличноеПоле1.Добавить();
// Перебираем коллекцию получателей сообщения
Для каждого Получатель Из Письмо.Получатели Цикл
Получатели = Получатели + Получатель.Пользователь + " <" + Получатель.Адрес + "> ";
КонецЦикла;
СтрокаТП.Кому = Получатели;
Попытка
СтрокаТП.ОтКого= Сообщение.Отправитель.Адрес;
Исключение
СтрокаТП.ОтКого= Сообщение.Отправитель;
КонецПопытки;
СтрокаТП.Тема = Сообщение.Тема;
СтрокаТП.Текст = Сообщение.Текст;
СтрокаТП.Дата = Сообщение.ДатаПолучения;
// Перебираем вложения письма
Для каждого Вложение Из Сообщение.Вложения Цикл
Вложение.Данные.Записать(Вложение.Наименование);
//Запоминаем имена вложение прикрепленных к данному письму, и сохраним в ТабличноеПоле1
Влож=Влож+Вложение.Наименование+",";
КонецЦикла;
СтрокаТП.ПутьВложения=Влож;
КонецЦикла;
//отключение
Почта.Отключиться();
Все реквизиты входящих писем сохраняются в соответствующие поля табличного поля, вложения сохраняются в каталог временных файлов, а имена вложений в реквизит табличного поля. Для более удобного хранения вложений писем, 1С 8 имеет тип "Хранилище значения", который позволяет хранить двоичные данные, далее при получении сообщений объектом ИнтернетПочта рассмотрим возможность хранения в "Хранилище значения".
2.Отправка сообщений объектом "Почта"
При отправке сообщения, подключение к почтовому клиенту производится точно так же, как и при получении, перед отправкой необходимо подготовить письмо.
Код 1C v 8.х Сообщение = Новый ПочтовоеСообщение;
Сообщение.Текст = "текст сообщения";
Сообщение.Отправитель = "petya@pupkin.com";
Сообщение.Тема ="Тема сообщения";
Сообщение.Получатели.Добавить("vasya@pupkin.com");
Сообщение.Вложения.Добавить(Новый ДвоичныеДанные("C:\file.jpg"),"file.jpg");
Почта = Новый Почта;
//подключаемся без параметров, к клиенту установленному по умолчанию в системе
Почта.Подключиться(,);
Попытка
//Пытаемся послать письмо
Почта.Послать(Сообщение,Истина);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
//отключение
Почта.Отключиться();
В методе Почта.Послать(Сообщение,Истина) два параметра, первый принимает ссылку на почтовое сообщение, второй параметр определяет, требуется ли запрос на подтверждение о получении письма адресатом (Истина - запрос включен). После этих операций письмо попадает в папку "Исходящие" почтового клиента, и в зависимости от настроек клиента отправляется сразу или по команде пользователя.
В MS Outlook встроена защита от несанкционированного доступа к адресной книге и базе почтовых сообщений, и защита от несанкционированной отправки электронных писем через службы Outlook. В Outlook 2003 система безопасности срабатывает не только при попытке получить адрес отправителя письма, но даже при попытке получить его текст. В действительности защита выражается в показываемом пользователю окне системы безопасности при обращении к некоторым объектам и свойствам объектов Outlook и предлагает открыть доступ на определенное время, следует разрешить доступ.
3.Получение сообщений объектом "ИнтернетПочта".
Перед подключением к почтовому серверу, для объекта ИнтернетПочта необходимо заполнить данные Профиля учетной записи, и затем передать эти данные в метод "Подключиться".
Код 1C v 8.х Функция ПолучитьПрофиль()
Профиль = Новый ИнтернетПочтовыйПрофиль;
// SMTP сервер
Профиль.АдресСервераSMTP = "smtp.pupkin.com";
// Порт SMTP сервера
Профиль.ПортSMTP = 25;
// POP3 сервер
Профиль.АдресСервераPOP3 = "pop.pupkin.com";
// Порт POP3 сервера
Профиль.ПортPOP3 = 110;
// Пароль к почтовому ящику
Профиль.Пароль = "pass";
// Пароль пользователя для SMTP сервера
Профиль.ПарольSMTP = "pass";
// Логин пользователя
Профиль.Пользователь = "vasya";
// Логин пользователя для SMTP сервера
Профиль.ПользовательSMTP = "vasya";
// Время ожидания выполнения операции в секундах
Профиль.ВремяОжидания = 50;
Возврат Профиль;
КонецФункции
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(ПолучитьПрофиль());
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Заголовки=Почта.ПолучитьЗаголовки()
Если Заголовки.Количество()=0 Тогда
Предупреждение("В почтовом ящике нет входящих сообщений!", ,"Нет сообщений");
КонецЕсли;
// Загрузка сообщений в массив
Сообщения = Почта.Выбрать(Истина,Заголовки);
Для каждого Сообщение Из Сообщения Цикл
СтрокаТП = ТабличноеПолеИнтернетПочта.Добавить();
СтрокаТП.Дата = Сообщение.ДатаОтправления;
СтрокаТП.ОтКого = Сообщение.Отправитель.Пользователь + " <" + Сообщение.Отправитель.Адрес + "> ";
СтрокаТП.Тема = Сообщение.Тема;
// Перебираем получателей сообщения
Для каждого Получатель Из Сообщение.Получатели Цикл
КомуВходящие = КомуВходящие + Получатель.Пользователь + " <" + Получатель.Адрес + "> ";
КонецЦикла;
СтрокаТП.Кому = КомуВходящие;
// Перебираем тексты сообщения
Для каждого ТекстСообщения Из Сообщение.Тексты Цикл
ТекстВходящие = ТекстВходящие + ТекстСообщения.Текст;
КонецЦикла;
СтрокаТП.Текст = ТекстВходящие;
// Перебираем вложения письма
Для каждого Вложение Из Сообщение.Вложения Цикл
Вложение.Данные.Записать(Вложение.Name);
СправочникВложения.РеквизитВложение = новый ХранилищеЗначения(Новый ДвоичныеДанные(Вложение.Name));
СправочникВложения.ИмяВложения=Вложение.Name;
КонецЦикла;
КонецЦикла;
// отключение
Почта.Отключиться();
Метод Почта.Выбрать(Истина,Заголовки); имеет два параметра, первый отвечает за удаление писем с сервера (при Истина-удалять), второй параметр отвечает за массив сообщений для выборки (т.е. закачки на компьютер клиента с сервера), если параметр пуст, то выбираются все сообщения находящиеся на сервере.
При переборе вложений, данные полученные из письма сохраняются в реквизит типа ХранилищеЗначения, заранее созданного справочника "СправочникВложения" в конфигураторе, т.к. данные первоначально сохраняются на диск, а затем загружаются в справочник, то, после загрузки в соответствующий реквизит справочника данные можно удалить. Не рекомендуется хранить данные типа ХранилищеЗначения в Табличных частях справочников, т.к. при больших объемах данных это затормаживает работу конфигурации.
4.Отправка сообщений объектом "ИнтернетПочта".
При отправке сообщения используется Функция ПолучитьПрофиль().
Код 1C v 8.х
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(ПолучитьПрофиль());
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Вложения.Добавить(Новый ДвоичныеДанные("C:\file.jpg"),"file.jpg");
Сообщение.Отправитель = "vasya@pupkin.com";
Сообщение.ИмяОтправителя = "Вася";
ПочтовыеАдреса = Сообщение.Получатели;
ПочтовыйАдрес = ПочтовыеАдреса.Добавить();
ПочтовыйАдрес.Адрес = "petya@pupkin.com";
Сообщение.Тема ="Тема сообщения";
ИнтернетТекстПочтовогоСообщения = Сообщение.Тексты.Добавить();
ИнтернетТекстПочтовогоСообщения.Текст = "Текст сообщения";
ИнтернетТекстПочтовогоСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Попытка
// Пытаемся послать письмо
Почта.Послать(Сообщение);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
// отключение
Почта.Отключиться();
Удобно подключить автополучение/автоотправку почты командой "ПодключитьОбработчикОжидания(,)". Первый параметр в команде отвечает за наименование вызываемой процедуры, и второй, период ожидания процедуры в секундах, обычно обработчик ожидания вставляется в глобальный модуль системы (например, в процедуру ПриНачалеРаботыСистемы()) и указывает на процедуру с пометкой Экспорт.
Например, можно создать процедуру ПроверитьПочту, в которую вставить загрузку писем из почтового ящика и вставить ее в следующую строку:
ПодключитьОбработчикОжидания("ПроверитьПочту",60)
Также для обработки и просмотра сообщений в формате HTML удобно пользоваться компонентом "Поле HTML документа", для загрузки HTML текста в компонент используется метод ПолеHTMLдокумента.УстановитьТекст(Html), где Html-это документа полученный из текста сообщения. Есть вариант загрузки HTML с диска (если это вложение), ПолеHTMLдокумента.Перейти("file:\\C:\File.html").
После использования нескольких или сразу всех способов работы с электронной почтой, образуется полноценный почтовый клиент с возможностью хранения и обработки писем с вложениями на базе 1С предприятие 8.0.
Автор:
Alimov Roman Как организовать работу с почтой без установленного почтового клиента на компьютере пользователя? Категория:
Работа с Интернет, Почтой (Mail), FTP Как можно обмениваться данными, используя XML-сериализацию через файлы других форматов? Под XML-сериализацией понимается возможность записи или чтения данных из 1С:Предприятия 8 в (из) XML-документ.
Но фактически при выгрузке данных выгружаемое значение агрегатного типа можно посредством сериализации преобразовывать в фрагмент XML и сохранять в файлах произвольных форматов как строковое.
Необходимо выгрузить экземпляр документа, ссылка на который находится в переменной СсылкаНаДокумент, в текстовый файл:
Код 1C v 8.х ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку();
Данные = СсылкаНаДокумент.ПолучитьОбъект();
ЗаписатьXML(ЗаписьXML, Данные);
ТекстСообщения = ЗаписьXML.Закрыть();
Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(ТекстСообщения);
Текст.Записать(ПутьКФайлу);
Метод УстановитьСтроку() устанавливает режим вывода данных не в XML-файл, а в строку (строка возвращается при выполнении метода Закрыть()).
В другой базе необходимо загрузить данные из полученного текстового файла:
Код 1C v 8.х Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ПутьКФайлу);
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(Текст.ПолучитьТекст());
Если ВозможностьЧтенияXML(ЧтениеXML) Тогда
Данные = ПрочитатьXML(ЧтениеXML);
Данные.Записать();
КонецЕсли;
Следует отметить, что данный механизм будет работать в том случае, если документ в базе данных источника и приемника имеет абсолютно одинаковую структуру.
Категория:
JSON, XML, TXT, CSV, DBF Практическая работа с почтой (E-mail,The Bat, Outlook, Mozilla Thunderbird) Код 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
Категория:
Работа с Интернет, Почтой (Mail), FTP Пример подключения к MySQL базе Код 1C v 8.х // Пример 1
Сервер="IP-адрес-сайта"; // IP адрес сайта
ПользовательСервера="имя-пользователя-базы-данных"; // имя пользователя базы данных
ПарольСервера="пароль-пользователя-базы-данных"; // пароль пользователя базы данных
БазаСервера="название-SQL-базы-данных"; // название SQL базы данных
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение_param = "driver={MySQL ODBC 5.1 Driver}; server="+СокрЛП(Сервер)+"; uid="+СокрЛП(ПользовательСервера)+"; pwd="+СокрЛП(ПарольСервера)+"; database="+СокрЛП(БазаСервера)+"; STMT=SET CHARACTER SET utf8";
Try
Соединение.open(Соединение_param);
СоединениеУстановлено = Истина;
Сообщить("Соединение установлено");
Except
ТекстСообщения = ""+ТекущаяДата()+" Connection error: "+ОписаниеОшибки();
Сообщить(ТекстСообщения);
СоединениеУстановлено = Ложь;
return;
EndTry;
Код 1C v 8.х ]// Пример 2
Соединение = Новый COMОбъект("ADODB.Connection");
ConnectionString = "driver={SQL Server}; server=; uid=; Pwd=; Database = "; // это для MS SQL строка
Попытка
Соединение.Open(ConnectionString);
Сообщить("Соединение осуществлено в "+ТекущаяДата());
Исключение
Предупреждение("Невозможно установить соединение");
Возврат;
КонецПопытки;
ТекстЗакпроса = "....................";
НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
НаборЗаписей.ActiveConnection = Соединение;
НаборЗаписей.Open(ТекстЗапроса);
Пока не НаборЗаписей.Eof() Цикл
// ............код обработки.....................
НаборЗаписей.MoveNext();
КонецЦикла;
НаборЗаписей.Close();
Соединение.Close();
Сообщить("Обработка завершена в "+ТекущаяДата());
Код 1C v 7.x DB = СоздатьОбъект("ODBCDatabase");
DB.Соединение("DRIVER={MySQL ODBC 5.1 Driver}; SERVER=IP_Супер_мега_сервера; DATABASE=Мега_база; USER=Супер_юзер; PASSWORD=пароль_супер_мега_юзера; OPTION=3;");
RS = СоздатьОбъект("ODBCRecordSet");
RS.SetDatabase(DB);
Если RS.Выполнить("set names cp1251") = 0 Тогда
Сообщить("Ошибка подключения к MySQL" + РазделительСтрок + RS.ПолучитьОписаниеОшибки());
СтатусВозврата(0);
Возврат;
КонецЕсли;
Используя DSN . Большой плюс dsn есть режим проверки и также в текстах 1с
уже не нужен пользователь и пароль. Все детали скрыты в dsn
вот мой успешно работающий код для MY SQL
Код 1C v 7.x sql = СоздатьОбъект("ODBCDatabase");
Имя0 = "DragNet";
Фл1 = sql.Соединение("DSN=" + Имя0 + ";");
Если Фл1 = 0 Тогда
Сообщить("Не смогли открыть DSN = " + Имя0);
Сообщить("Ошибка = " + sql.ПолучитьОписаниеОшибки() );
Иначе
sql.УстТолькоЧтение(1);
КонецЕсли;
rc = СоздатьОбъект("ODBCRecordSet");
rc.УстБД(sql);
еще, драйвер 3.51:
Код 1C v 7.x //Тестируем установку параметров соединения
клМускул = СоздатьОбъект("ODBCDatabase");
клМускул.СтрокаСоединения = "Driver={MySQL ODBC 3.51 Driver};Server=localhost;
|Port=3306;Database=_1c;User=_1c_user; Password=_1c_pass;
|Option=3;";
Результат = клМускул.СтрокаСоединения;
ПроверитьРавенство(Результат,"Driver={MySQL ODBC 3.51 Driver};Server=localhost;
|Port=3306;Database=_1c;User=_1c_user; Password=_1c_pass;
|Option=3;");
Категория:
COM-объекты, WMI, WSH Функция удаляет лишнее из сообщения полученного из ОписаниеОшибки(), оставляя только суть проблемы! Код 1C v 8.х Функция СформироватьТекстСообщения(Знач ТекстСообщения) Экспорт
НачалоСлужебногоСообщения = Найти(ТекстСообщения, "{");
ОкончаниеСлужебногоСообщения = Найти(ТекстСообщения, "}:");
Если ОкончаниеСлужебногоСообщения > 0
И НачалоСлужебногоСообщения > 0
И НачалоСлужебногоСообщения < ОкончаниеСлужебногоСообщения Тогда
ТекстСообщения = Лев(ТекстСообщения, (НачалоСлужебногоСообщения - 1)) +
Сред(ТекстСообщения, (ОкончаниеСлужебногоСообщения + 2));
КонецЕсли;
Возврат СокрЛП(ТекстСообщения);
КонецФункции
Категория:
Полезные, Универсальные Функции