gifts2017

Интересные возможности 1С

Опубликовал Рома Филатов (FilatovRA) в раздел Программирование - Практика программирования

Пара примеров использования сторонних языков программирования из 1С, отправка почты на примере mail.ru и загрузка файлов с HTTPS

Рассмотрим ситуацию, в которой у нас есть ПК с установленной операционной системой Windows и установленной 1С 8.3.6. 

Какие нестандартные задачи мы сможем решить с данной связкой?

Из 1С нам доступно всё изобилие программных средств, умеющих работать через COM. При желании можно, например, открыть CD-Rom у пользователя:

ComОбъектWMPlayer = Новый COMОбъект("WMPlayer.OCX.7"); 
Дисководы         = ComОбъектWMPlayer.cdromcollection; 
Дисководы.item(0).eject(); 

Однако бывает, что нам нужно сделать в системе что-то специфичное, а необходимый функционал вы нашли в каком-нибудь vb-скрипте, ниже представлен шаблон, который можно использовать в данной ситуации:

wshShell     = Новый COMОбъект("wScript.shell"); 
ПутьКСкрипту = wshShell.expandEnvironmentStrings("%HOMEDRIVE%")
 + wshShell.expandEnvironmentStrings("%HOMEPATH%") + "\VBSFrom1C.vbs";
СкриптVBS    = Новый ТекстовыйДокумент; 
ТекстСкрипта = "MsgBox " + Символ(34) + "Hello World!" + Символ(34); 
СкриптVBS.ДобавитьСтроку(ТекстСкрипта); 
Попытка 
 СкриптVBS.Записать(ПутьКСкрипту, КодировкаТекста.OEM); 
 ЗапуститьПриложение(ПутьКСкрипту); 
Исключение 
 Сообщить(ОписаниеОшибки());
КонецПопытки; 

Но вдруг запуск скриптов запрещён локальной политикой безопасности? В таком случае нам поможет HTML-приложение, которое по умолчанию имеет доступ к файловой системе, ниже представлен шаблон:

wshShell         = Новый COMОбъект("wScript.shell"); 
ПутьКСкрипту      = wshShell.expandEnvironmentStrings("%HOMEDRIVE%") + wshShell.expandEnvironmentStrings("%HOMEPATH%") + "\JavascriptFrom1C.hta"; 
 
СкриптJavascript = Новый ТекстовыйДокумент; 
Символ34 = Символ(34);
ТекстСкрипта = "<!-- saved from url=(0014)about:internet --><!doctype> 
|<html> 
|<head> 
| <HTA:APPLICATION ID=" + Символ34 + "oHTA" + Символ34 + " 
| APPLICATIONNAME=" + Символ34 + "WMPTour" + Символ34 + " 
| BORDER=" + Символ34 + "thin" + Символ34 + " 
| BORDERSTYLE=" + Символ34 + "normal" + Символ34 + " 
| CAPTION=" + Символ34 + "yes" + Символ34 + " 
| maximizeButton=" + Символ34 + "no" + Символ34 + " 
| minimizeButton=" + Символ34 + "no" + Символ34 + " 
| ICON=" + Символ34 + "img/wmptour.ico" + Символ34 + " 
| SHOWINTASKBAR=" + Символ34 + "no" + Символ34 + " 
| SINGLEINSTANCE=" + Символ34 + "yes" + Символ34 + " 
| SYSMENU=" + Символ34 + "yes" + Символ34 + " 
| VERSION=" + Символ34 + "1.0" + Символ34 + " 
| WINDOWSTATE=" + Символ34 + "normal" + Символ34 + "> 
|</head> 
|<body> 
|<script> 
| alert( 'Hello, World!'); 
|</script> 
|</body> 
|</html> 
|"; 
СкриптJavascript.ДобавитьСтроку(ТекстСкрипта); 
Попытка 
 СкриптJavascript.Записать(ПутьКСкрипту, КодировкаТекста.OEM); 
 ЗапуститьПриложение(ПутьКСкрипту); 
Исключение 
 Сообщить(ОписаниеОшибки()); 
КонецПопытки; 

Иногда нужно отправить письмо из 1С, тут пригодится следующий код (для mail.ru):

     ИнПочта                       = Новый ИнтернетПочта;            
     ИнПрофиль                     = Новый ИнтернетПочтовыйПрофиль;
     ИнПрофиль.ВремяОжидания       = 180; ;            
     ИнПрофиль.АдресСервераSMTP    = "smtp.mail.ru";      
     ИнПрофиль.АдресСервераPOP3    = "pop.mail.ru";
     ИнПрофиль.Пользователь        = "*@mail.ru";      
     ИнПрофиль.ПользовательSMTP    = "*@mail.ru";
     ИнПрофиль.Пароль              = "*****";      
     ИнПрофиль.ПарольSMTP          = "*****";      
     ИнПрофиль.ПортSMTP            = 465;
     ИнПрофиль.ИспользоватьSSLSMTP = Истина;
     ИнПрофиль.ПортPOP3            = 995;
     ИнПрофиль.ИспользоватьSSLPOP3 = Истина;
     ИнПрофиль.АутентификацияSMTP  = СпособSMTPАутентификации.Login;      
     //ИнПрофиль.POP3ПередSMTP     = Истина;            
     Сообщение                     = Новый ИнтернетПочтовоеСообщение; 
           
     Сообщение.Отправитель.Адрес             = "*@mail.ru";
     Сообщение.Отправитель.ОтображаемоеИмя   = "Робот";      
     Сообщение.Тема                          = "Проверка почтового бота";            
     Получатель                              = Сообщение.Получатели.Добавить("*@wateva.ru");
	
	Попытка            
		ИнПочта.Подключиться(ИнПрофиль);      
	Исключение            
		Сообщить("При подключени к серверу произошла ошибка! Проверьте учетные данные профиля почты." + ОписаниеОшибки(), СтатусСообщения.Важное);      
	КонецПопытки;            
	Текст=Сообщение.Тексты.Добавить();      
	//Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;      
	//ТекстПисьма="";      ВложенияПисьма="";      
	//ТекстПисьмаФорматированный.ПолучитьHTML(ТекстПисьма,ВложенияПисьма);      
	//Текст.Текст = ТекстПисьма;            
	Текст.ТипТекста  = ТипТекстаПочтовогоСообщения.ПростойТекст;
	Текст.Текст      = "Привет :)";
	
	Попытка            
		ИнПочта.Послать(Сообщение);            
		ЭтаФорма.Доступность = Ложь;        
		Сообщить("Письмо отправлено!");      
	Исключение            
		Сообщить("При отправке возникли проблемы. Письмо не отправлено. Проверьте правильность заполнения профиля и почты." + ОписаниеОшибки(),СтатусСообщения.Важное)      
	КонецПопытки;
	
	ИнПочта.Отключиться();	

Бывает, что нужен какой-нибудь файлик с какого-нибудь ресурса, который использует https. Для начала проверим, проверяет ли данный адрес сертификаты перед загрузкой (я использую wget, т.к. удобно и стабильно):

wget https://www.*.ru/upload/file.txt --no-check-certificate
 Если всё прошло удачно, делаем то же самое из 1С:
        СерверИсточник = "www.*.ru"; 
	Запрос = Новый HTTPЗапрос("/upload/file.txt");
	// wget https://www.*.ru/upload/file.txt --no-check-certificate       
	Попытка
		НТТР = Новый HTTPСоединение(СерверИсточник,443,,,,, Новый ЗащищенноеСоединениеOpenSSL()); 
		Ответ = НТТР.Получить(Запрос, "C:\file.txt"); 		
		Если НЕ(Ответ.КодСостояния = 200) Тогда
			// Что-то пошло не так.
		КонецЕсли;
	Исключение	
		Ошибка = ОписаниеОшибки();	
	КонецПопытки;

Если нам нужно запустить на клиентской машине какое-нибудь приложение, а клиент привык работать только с 1С, делаем следующее:

//1. Превращаем наш исполняемый файл в строку

ДД       =  Новый ДвоичныеДанные("C:\НашаПрограмма.exe");
Строка64 = Base64Строка(ДД);

//2. И добавляем его реквизитом в обработку 
//   в процедуру "ПриСозданииНаСервере".
    
 Объект.ДвоичныеДанные = Строка64;
ОпятьДвоичныеДанные    =  Base64Значение(Объект.ДвоичныеДанные);
НашаПрограмма          = "C:\НашаПрограмма.exe";    
ОпятьДвоичныеДанные.Записать(НашаПрограмма);    
ЗапуститьПриложение(НашаПрограмма);

При необходимости мы можем добавить произвольное приложение в автозапуск системы:

&НаКлиенте
Процедура ДобавитьПрограммуВАвтозапуск(ПолныйПутьКФайлу = "", ВключитьОтладку = Ложь)
      
 Символ34               = Символ(34);
 ВеткаАвтозапуска       = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
 СтрокаКоманды          = "Reg Add "
                          + Символ34 + ВеткаАвтозапуска + Символ34
                          + " /v " 
                          + Символ34 + "Notepad" + Символ34 
                          + " /t REG_SZ /d " 
                          + Символ34 + ПолныйПутьКФайлу + Символ34 
                          + " /f"
                          + " /reg:64";                                                                      
 ПутьКСкриптуДобавления = "C:\Users\Public\Documents\startNotepad_Autorun.bat";
 ЗаписьТекста           = Новый ЗаписьТекста(ПутьКСкриптуДобавления, КодировкаТекста.OEM);  
 Если ВключитьОтладку Тогда         
   ЗаписьТекста.ЗаписатьСтроку(СтрокаКоманды + Символы.ПС);
   ЗаписьТекста.ЗаписатьСтроку("pause");          
 Иначе         
   ЗаписьТекста.ЗаписатьСтроку(СтрокаКоманды);         
 КонецЕсли;      
 ЗаписьТекста.Закрыть();
 Оповещение = Новый ОписаниеОповещения("IDDQD", ЭтотОбъект);
 НачатьЗапускПриложения(Оповещение,ПутьКСкриптуДобавления);
      
КонецПроцедуры
  
&НаКлиенте
Процедура IDDQD(Первый, Второй)  Экспорт    
КонецПроцедуры

См. также

Подписаться Добавить вознаграждение

Комментарии

1. борян петров (TODD22) 27.04.16 07:49
Зачем каждый раз вызывать функцию Символ(34) ? нельзя её один раз вызвать, получить значение символа, поместить его в переменную ?
2. Рома Филатов (FilatovRA) 27.04.16 09:24
(1) TODD22, можно, но это сильно снизит читаемость кода.
3. Николай Каверин (Perrojka) 27.04.16 09:29
(2) FilatovRA, Если назвать Символ34 то та же самая читаемость.

А вообще слишком громкий заголовок. Это скорее
Пара примеров использования сторонних языков программирования из 1С
sasha777666; madonov; veretennikoff; ZOMI; Solovyeff; AlexGroovy; lamelioss; Yashazz; fuxic; the1; philya; alest; +12 Ответить 1
4. борян петров (TODD22) 27.04.16 09:32
(2) FilatovRA,
можно, но это сильно снизит читаемость кода.

Действительно... Лучше вызывать системную функцию +100500 раз... И замедлить работу системы.
5. Рома Филатов (FilatovRA) 27.04.16 10:01
(3) Perrojka, (4) TODD22 Про вызов не подумал
6. борян петров (TODD22) 27.04.16 10:08
(5) FilatovRA,
Про вызов не подумал

А вообще в рекомендациях по разработке на ИТС написано что вместо функции Символ(10) нужно использовать Символ.ПС. то есть не вызывать функцию если есть в системном наборе значений. Но в наборе символом немого. Видимо рекомендация всё по той же самой причине... что бы не вызывать системную функцию.
7. Роман Уничкин (unichkin) 27.04.16 12:23
За выполнение java-скрипт через html плюс, еще одна зарубка на приклад...
8. С К (kraynev-navi) 27.04.16 14:00
Дисководы.item(0).eject();


уже за это плюс! ))))
madonov; DrAku1a; +2 Ответить 1
9. Сергей (necropunk) 28.04.16 11:26
Однако нередко бывает, что запуск скриптов запрещён локальной политикой безопасности, в таком случае нам поможет HTML-приложение, которое по умолчанию имеет доступ к файловой системе

Плохому вы людей учите :) Но плюс, конечно, хорошо бы всем уметь с легкостью пользоваться сторонними фишками из 1С а не писать велосипедов...
10. Роберт В е р т и н с к и й (v3rter) 28.04.16 11:32
(9) necropunk, Админам тоже полезно знать, на что способен продвинутый пользователь из внешне кажущейся безопасной 1С :)
В прошлом веке утверждали, что в произвольной скриптовой/языковой среде достаточно доступа к файловой системе для написания "червей", а возможности модификации кода из кода - вирусов.

Я имею в виду, админ 1С должен с осторожностью давать право на запуск внешних обработок и закрывать доступ в конфигуратор.
Потому что возможность запуска произвольного кода в среде 1С делает из нее вектор таргетированных атак.
11. Сергей (necropunk) 28.04.16 11:59
(10) v3rter, да понятное дело. Бывают и веб-сервисы, позволяющие выполнять произвольный запрос и передавать компоновку. Я так, шучу, скорее, там смайлик же стоит.
12. Роберт В е р т и н с к и й (v3rter) 28.04.16 12:18
Как только 1С начнут массово использовать как инструмент доставки троянов, шифраторов и прочего пэйлоада, в платформе появятся инструменты безопасности и подписи обработок, аналогичные, например, Microsoft Office, и начнется регулярный выпуск хотфиксов. Считайте это футуристическим прогнозом :)
14. Максим *** (premier) 29.04.16 12:24
(0) Рассмотрим ситуацию, в которой у нас есть ПК с установленной операционной системой Windows и установленной 1С 8.3.6. .
А если рассмотреть ситуацию с установленной 1С 8.2 к примеру? Почту как отправлять будем? Практически все почтовые сервера перешли на SSL (TSL) шифрование, которое не работает на платформе 8.2? Неплохо было бы и этот вопрос осветить.
15. Роберт В е р т и н с к и й (v3rter) 29.04.16 12:41
16. Максим *** (premier) 29.04.16 12:55
(15) v3rter, или, например, использовать объект "CDO.Message", что к теме публикации, как мне кажется, ближе.
17. Рома Филатов (FilatovRA) 13.05.16 10:22
(16) premier, как отправлять через CDO уже неплохо описано
18. Роберт В е р т и н с к и й (v3rter) 13.05.16 12:22
Не знал про CDO, но сходу нашел про него http://infostart.ru/public/16585/
19. Сергей (Che) Коцюра (CheBurator) 14.05.16 00:15
моя отправлялка по CDO с кучей разных полезных обвесок http://infostart.ru/public/14131/ - наверное больше чем с 2500 адресов отправляет в разных компаниях (с каждой бы рублей по 300...) - а я написал взяв за основу пример от avb (еще более ранний)
20. Яков Коган (Yashazz) 20.06.16 11:40
Забавно видеть очередную перелицовку давно известных книг под видом самостоятельной публикации, забавно... То же "Системное программирование 1С" А.Михайлова - сколько его, родимое, копипастили без указания первоисточника...
21. Евгений Ю. (Ganjubas) 20.06.16 14:54
В пример автора:
ПутьКСкрипту = wshShell.expandEnvironmentStrings("%HOMEPATH%") + "\VBSFrom1C.vbs";


оказалось нужно внести правку:
ПутьКСкрипту = "C:\" + wshShell.expandEnvironmentStrings("%HOMEPATH%") + "\VBSFrom1C.vbs";

в случае если уверен что папка в переменной %HOMEPATH% находится на диске "C"
22. Сергей Маслов (LexSeIch) 23.06.16 11:41
(12) v3rter,
К сожалению, уже используют: "Доктор Веб" сообщает о первом троянце для 1С, запускающем шифровальщика-вымогателя (22 июня 2016 года) ... источник
23. Рома Филатов (FilatovRA) 24.06.16 14:02
(20) Yashazz, при написании данной статьи не копировалось ни одной книги, о какой вы говорить?
24. Рома Филатов (FilatovRA) 24.06.16 14:06
(22) LexSeIch, вполне ожидаемо, и вектор выбран идеально.
25. Роберт В е р т и н с к и й (v3rter) 24.06.16 16:48
Кстати, год назад было для 7.7 http://www.klerk.ru/soft/news/25630/
Появился вирус для 1С
16.06.05 18:48
Просмотров: 1464
Лаборатория Касперского сообщает о регистрации первой вредоносной программы, поражающей систему 1С:Предприятие.

Вирус, получивший название Virus.1C.Tanga.a, был создан в исследовательских целях. Создатель программы сам направил ее экспертам Лаборатории Касперского для изучения. Автор Tanga минимизировал время анализа кода и ущерб от его возможного распространения — лишил вирус каких-либо деструктивных функций и снабдил развернутым описанием на русском языке.

Для своего распространения Tanga использует язык модулей «1С». Он позволяет вирусу обращаться к другим дисковым файлам, включая и файлы-отчеты, подобные зараженным, и таким образом размножаться. Данный вредоносный код является первой полноценной программой-инфектором, созданной для платформы «1С:Предприятие7.7» и записывающей свой код в служебные файлы системы формата .ERT.
26. Рома Филатов (FilatovRA) 20.09.16 22:01
(21) Ganjubas, большое спасибо, не заметил, можно вот так:
    ПутьКСкрипту      = wshShell.expandEnvironmentStrings("%HOMEDRIVE%") + wshShell.expandEnvironmentStrings("%HOMEPATH%") + "\JavascriptFrom1C.hta"; 
27. Евгений Мадонов (madonov) 21.09.16 02:26
(8) kraynev-navi, жаль, что 1ое апреля в 2017-ом выпадает на субботу.
А то бы утро у пользователей началось с войны с дисководами =)).
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа