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

28.10.16

Разработка - Механизмы платформы 1С

Пара примеров использования сторонних языков программирования из 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(Первый, Второй)  Экспорт    
КонецПроцедуры

Обработка javascript html-application VBA autorun regedit

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4528    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5294    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6409    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18473    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

14.09.2023    12088    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8822    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15986    SeiOkami    31    

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

А вообще слишком громкий заголовок. Это скорее
Пара примеров использования сторонних языков программирования из 1С
torbeev; sasha777666; madonov; veretennikoff; ZOMI; Solovyeff; AlexGroovy; lamelioss; Yashazz; fuxic; ixijixi; philya; alest; +13 Ответить
5. FilatovRA 168 27.04.16 10:01 Сейчас в теме
(3) Perrojka, (4) TODD22 Про вызов не подумал
6. TODD22 18 27.04.16 10:08 Сейчас в теме
(5)
Про вызов не подумал

А вообще в рекомендациях по разработке на ИТС написано что вместо функции Символ(10) нужно использовать Символ.ПС. то есть не вызывать функцию если есть в системном наборе значений. Но в наборе символом немого. Видимо рекомендация всё по той же самой причине... что бы не вызывать системную функцию.
4. TODD22 18 27.04.16 09:32 Сейчас в теме
(2)
можно, но это сильно снизит читаемость кода.

Действительно... Лучше вызывать системную функцию +100500 раз... И замедлить работу системы.
fzt; ixijixi; +2 Ответить
7. unichkin 1559 27.04.16 12:23 Сейчас в теме
За выполнение java-скрипт через html плюс, еще одна зарубка на приклад...
8. kraynev-navi 647 27.04.16 14:00 Сейчас в теме
Дисководы.item(0).eject();


уже за это плюс! ))))
Rain88; madonov; DrAku1a; +3 Ответить
27. madonov 169 21.09.16 02:26 Сейчас в теме
(8) kraynev-navi, жаль, что 1ое апреля в 2017-ом выпадает на субботу.
А то бы утро у пользователей началось с войны с дисководами =)).
9. necropunk 9 28.04.16 11:26 Сейчас в теме
Однако нередко бывает, что запуск скриптов запрещён локальной политикой безопасности, в таком случае нам поможет HTML-приложение, которое по умолчанию имеет доступ к файловой системе

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

Я имею в виду, админ 1С должен с осторожностью давать право на запуск внешних обработок и закрывать доступ в конфигуратор.
Потому что возможность запуска произвольного кода в среде 1С делает из нее вектор таргетированных атак.
11. necropunk 9 28.04.16 11:59 Сейчас в теме
(10) v3rter, да понятное дело. Бывают и веб-сервисы, позволяющие выполнять произвольный запрос и передавать компоновку. Я так, шучу, скорее, там смайлик же стоит.
12. v3rter 28.04.16 12:18 Сейчас в теме
Как только 1С начнут массово использовать как инструмент доставки троянов, шифраторов и прочего пэйлоада, в платформе появятся инструменты безопасности и подписи обработок, аналогичные, например, Microsoft Office, и начнется регулярный выпуск хотфиксов. Считайте это футуристическим прогнозом :)
22. LexSeIch 210 23.06.16 11:41 Сейчас в теме
(12) v3rter,
К сожалению, уже используют: "Доктор Веб" сообщает о первом троянце для 1С, запускающем шифровальщика-вымогателя (22 июня 2016 года) ... источник
24. FilatovRA 168 24.06.16 14:06 Сейчас в теме
(22) LexSeIch, вполне ожидаемо, и вектор выбран идеально.
13. пользователь 28.04.16 13:42
Сообщение было скрыто модератором.
...
14. premierex 204 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. premierex 204 29.04.16 12:55 Сейчас в теме
(15) v3rter, или, например, использовать объект "CDO.Message", что к теме публикации, как мне кажется, ближе.
17. FilatovRA 168 13.05.16 10:22 Сейчас в теме
(16) premier, как отправлять через CDO уже неплохо описано
18. v3rter 13.05.16 12:22 Сейчас в теме
Не знал про CDO, но сходу нашел про него http://infostart.ru/public/16585/
19. CheBurator 3119 14.05.16 00:15 Сейчас в теме
моя отправлялка по CDO с кучей разных полезных обвесок http://infostart.ru/public/14131/ - наверное больше чем с 2500 адресов отправляет в разных компаниях (с каждой бы рублей по 300...) - а я написал взяв за основу пример от avb (еще более ранний)
20. Yashazz 4709 20.06.16 11:40 Сейчас в теме
Забавно видеть очередную перелицовку давно известных книг под видом самостоятельной публикации, забавно... То же "Системное программирование 1С" А.Михайлова - сколько его, родимое, копипастили без указания первоисточника...
23. FilatovRA 168 24.06.16 14:02 Сейчас в теме
(20) Yashazz, при написании данной статьи не копировалось ни одной книги, о какой вы говорить?
21. EvgeniusRusius 20.06.16 14:54 Сейчас в теме
В пример автора:
ПутьКСкрипту = wshShell.expandEnvironmentStrings("%HOMEPATH%") + "\VBSFrom1C.vbs";


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

в случае если уверен что папка в переменной %HOMEPATH% находится на диске "C"
26. FilatovRA 168 20.09.16 22:01 Сейчас в теме
(21) Ganjubas, большое спасибо, не заметил, можно вот так:
    ПутьКСкрипту      = wshShell.expandEnvironmentStrings("%HOMEDRIVE%") + wshShell.expandEnvironmentStrings("%HOMEPATH%") + "\JavascriptFrom1C.hta"; 
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.
Оставьте свое сообщение