Cпособы отправки письма из 1С

Итак, рассмотрю способы отправки письма из 1С. На самом деле навелосипедить можно и больше, но мне хватит 😉

1) На «прямую», без использования БСП:

	Профиль = Новый ИнтернетПочтовыйПрофиль;
	Профиль.АдресСервераSMTP = "цукацукацука";
	Профиль.ПортSMTP = 465;
	
	Профиль.POP3ПередSMTP = ложь;
	Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
	
	Профиль.ИспользоватьSSLSMTP = ложь;
	
	Профиль.ТолькоЗащищеннаяАутентификацияSMTP = ложь;
	
	Профиль.Пользователь = "vуцкацука1-Noreply@укацукацука.ru";
	Профиль.Пароль = "Hцукацукаg";
	Профиль.ПользовательSMTP = "vцукауцкаly@цукацука.ru";
	Профиль.ПарольSMTP = "укацукацу";
	
	//Профиль.Таймаут = 60;
	
	Почта = Новый ИнтернетПочта;
	                                 
	Сообщить("Проверка cоединения..");
	Попытка
		Почта.Подключиться(Профиль, ПротоколИнтернетПочты.POP3);
		Сообщить("POP3: соединение ОК");
		Сообщить("SMTP: соединение ОК");
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
	
	Попытка
		Почта.Подключиться(Профиль);
		
		Письмо = Новый ИнтернетПочтовоеСообщение;
		Письмо.Тема = Заголовок;
	
		// формируем адрес получателя	
		Получатель = Письмо.Получатели.Добавить(Кому);
		Получатель.ОтображаемоеИмя = Кому;
	
		// добавляем к письму имя отправителя
		Письмо.ИмяОтправителя              = "Сцукауцкания";
		Письмо.Отправитель.ОтображаемоеИмя = "Сцукаувцукацукания";
		сообщить(константы.СК_Почта_Отправитель.Получить());
		Письмо.Отправитель.Адрес           = "noreply@цукаука.ru";
	
		// добавляем текст
		Текст = Письмо.Тексты.Добавить(Тело);
		Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
		
		Почта.Послать(Письмо, , ПротоколИнтернетПочты.SMTP);
		
		Сообщить("SMTP: посылка ОК");
		
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;

2) Используя БСП «Свежих» версий. Не могу сказать точно с какой версий, года примерно с двадцатого:

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

		Письмо = РаботаСПочтовымиСообщениями.ПодготовитьПисьмо(УчетнаяЗаписьПочты, ПараметрыСообщения);
		РаботаСПочтовымиСообщениями.ОтправитьПисьмо(УчетнаяЗаписьПочты, Письмо);		
	исключение
		сообщить("ой!");
		Сообщить(ОписаниеОшибки());
	конецпопытки;

3) Используя БСП «старых версий»… Очень старых… Где-то года 2015 и ранее:

УчетнаяЗаписьПочты = РаботаСПочтовымиСообщениями.ПолучитьСистемнуюУчетнуюЗапись();
ПараметрыПисьма = Новый Структура("Кому, Тема, Тело,ТипТекста", email, "цуацукау", тело,"HTML");
		РаботаСПочтовымиСообщениями.ОтправитьСообщение(УчетнаяЗаписьПочты, ПараметрыПисьма);

4) Еще один вариант для стародревней БСП:

	 УчетнаяЗаписьПочты = РаботаСПочтовымиСообщениями.СистемнаяУчетнаяЗапись(); 				 
					попытка                                                                                  
					ПараметрыСообщения = Новый Структура;
					ПараметрыСообщения.Вставить("ТипТекста","HTML");
					ПараметрыСообщения.Вставить("Кому",     "gribукмыукru");
					ПараметрыСообщения.Вставить("Тема",     "Ошибка приема данных о задолженнукмцу");
					ПараметрыСообщения.Вставить("Тело",     "Воукмук)!");
					РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗаписьПочты, ПараметрыСообщения);		
					исключение
						ЗаписьЖурналаРегистрации("Ошибка отправки ответа на письмо", УровеньЖурналаРегистрации.Ошибка,,ОписаниеОшибки(),);		
					конецпопытки;				
			конецесли;	

1C: вывод картинки в списке формы документа с изменением

Задача: необходимо сделать чтобы при двойном клике по ячейке статуса документа динамически изменялась картинка и соответственно его статус в форме списка документа.

Решение:

Чтобы каждый раз не дергать документ записью состояния, проще всего создать отдельный регистр в котором будет храниться ссылка документ и его текущий статус и перечисления:

Далее форму списка сделаем динамической, и добавим в запрос настройки списка связку с регистром:

...
	ВЫБОР
		КОГДА СК_ГР_Статусы_ДПС.Статус = ЗНАЧЕНИЕ(Перечисление.СК_ГР_СтатусКартинкой.Флажок)
			ТОГДА 0
		КОГДА СК_ГР_Статусы_ДПС.Статус = ЗНАЧЕНИЕ(Перечисление.СК_ГР_СтатусКартинкой.Галочка)
			ТОГДА 1
		ИНАЧЕ 2
	КОНЕЦ КАК СтатусК
ИЗ
	Документ.СК_ЗаявкаНаКУКУ КАК ДокументСК_ЗаявкаНаСК_ЗаявкаНаКУКУ 
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СК_ГР_Статусы_ДПС КАК СК_ГР_Статусы_ДПС
		ПО (СК_ГР_Статусы_ДПС.ДокОснование = ДокументСК_ЗаявкаСК_ЗаявкаНаКУКУ .Ссылка)
...

Для следующего шага необходимо подготовить картинку высотой 32 пикселя, и шириной 32*количество_статусов, например что-то в этом духе:

Далее на форме списка, у колонки «СтатусК», выберем вид «Поле картинки» и в свойство «Картинка значений», загрузим картинку:

Ну и соответственно в событие таблицы «выбор» добавим изменение статуса по двойному клику по столбцу «СтатусК»:

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

	возврат ТекущийСтатус;
КонецФункции	

&НаСервере
Процедура ИзменитьСтатусКНаСервере(НомерДок)
	док=Документы.СК_ЗаявкаНаИсполнениеПлатныхУслуг.НайтиПоНомеру(НомерДок);
	ТекСтат=ПолучитьТекущийСтатусДокумента(док);
	если ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.ПустаяСсылка() тогда
		ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.Флажок;
	иначеесли ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.Флажок тогда
		ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.Галочка;
	иначеесли ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.Галочка тогда
		ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.ПустаяСсылка();
	конецесли;
	
	МенеджерЗаписи = РегистрыСведений.СК_ГР_Статусы_ДПС.СоздатьМенеджерЗаписи(); 
	МенеджерЗаписи.ДокОснование = док; 
	МенеджерЗаписи.Статус = ТекСтат; 
	МенеджерЗаписи.Записать();   	
	
КонецПроцедуры


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	если Поле.Имя="СтатусК" тогда 
		ИзменитьСтатусКНаСервере(Элемент.ТекущиеДанные.Номер);
		Элементы.Список.Обновить(); 
		СтандартнаяОбработка=ложь;
	конецесли;	
КонецПроцедуры

1С: получаем список НКО с сервера minjust.gov.ru

Почему то у нас как всегда всё.. Государство требует проверять контрагента является ли он НКО, а инструментарий для этого не предлагает. Не, ну какой-никакой сервис у них был — можно было зайти на сайт, ввести в поле поиска название НКО и и получить результат — есть в списке это организация или нет. Но это согласитесь бред. «Автоматизировать процесс проверки?? А зачем? Куча бухгалтеров — бездельников, чего делать будет? ;)». Всего файла целиком скачать возможности не было. Поэтому приходилось парсить у них сайт, собирая по кусочками Excel файлы в одну кучу (была у них кнопка «экспорт текущей страницы»). Теперь сайт изменили..но лучше не стало. Возможности скачать весь файл целиком как не было так и не стало. Чуть поковыряв их страницу нашел как получить «сессионный ключ» и способ как передавать правильные POST параметры, чтобы получить кусочки JSON, кои потом можно склеить в единую базу. Результат вылился в обработку для 1С, которую можно скачать тут

1С Бухгалтерия 3.0.121.31: отправка письма

В данной версии БСП используемой в БУх, отправка письма производится так:

	тело="Прювет";
	ПараметрыПисьма = Новый Структура("Кому, Тема, Тело,ТипТекста", объект.email, "Абырвалг", тело,"HTML");
	РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(РаботаСПочтовымиСообщениями.СистемнаяУчетнаяЗапись(),ПараметрыПисьма);

1С: POST запросы

POST запрос к какому то ресурсу в 1С можно организовать например примерно так:

&НаСервере
Функция СтруктураВСтрокуJSON(Данные)экспорт
	
		ЗаписьJSON = Новый ЗаписьJSON();
		ЗаписьJSON.УстановитьСтроку();
		ЗаписатьJSON(ЗаписьJSON, Данные);
		ответ=ЗаписьJSON.Закрыть();
		// заменим -999999999 на null раз уж 1С это не умеет
		ответ=стрЗаменить(ответ,"-999999999","null");
		возврат ответ;
	
КонецФункции
&НаСервере
Функция API_SendSMS(УРЛ,Логин,Пароль,Отправитель,Телефон,ТекстСмс,ВремяЖизни=360)экспорт
	Соединение=ПолучитьПараметрыСоединения(УРЛ,Логин,Пароль);
	answer=API_getSessionID(Соединение,Логин,Пароль);
	если answer.error=true тогда возврат answer;конецесли;	
	
	ПОСТ_Структура=Новый Структура("sessionId,sourceAddress,data,destinationAddress,validity");
	ПОСТ_Структура.sessionId=answer.result; 		 //идсессии,
	ПОСТ_Структура.sourceAddress=Отправитель;  		 //имяотправителя
	ПОСТ_Структура.destinationAddress=Телефон;		 //получатель(номер)
	ПОСТ_Структура.data=ТекстСмс;	 				 //текст сообщения
	ПОСТ_Структура.validity=ВремяЖизни; 			 //время жизни в минутах

	Заголовки = Новый Соответствие;
	Заголовки["Content-Type"] = "application/json";	
	Заголовки.Вставить("Connection", "keep-alive");	
	Заголовки.Вставить("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)");

	HTTPЗапрос = Новый HTTPЗапрос("/rest/Sms/Send",Заголовки);
	HTTPЗапрос.УстановитьТелоИзСтроки(СтруктураВСтрокуJSON(ПОСТ_Структура), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	
	Результат = Соединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
	РезЗапроса=JSONВСтруктуру(Результат.ПолучитьТелоКакСтроку());
	если ТипЗнч(РезЗапроса)=Тип("Строка") тогда
		answer.error=true;
		answer.result=РезЗапроса;
		возврат answer;
	конецесли;	
	если ТипЗнч(РезЗапроса)=Тип("Структура") тогда
		answer.error=true;
		answer.result=РезЗапроса.Desc;
		возврат answer;		
	конецесли;	
	answer.error=false;
	answer.result=РезЗапроса[0];
	возврат answer;
	
КонецФункции
1 8 9 10 11 12 37