Ни одна современная система электронного документооборота немыслима без возможности интеграции ее в существующее информационное пространство организации с помощью API или протоколов связи.

Не исключение и easla.com.
Прежде всего, easla.com позволяет сотрудникам организации авторизоваться несколькими способами. Первый, разумеется, авторизация с помощью учетной записи easla.com. Второй, авторизация с помощью социальных сетей. И третий, авторизация с помощью домена организации. Да-да, онлайн система позволяет авторизоваться через домен! Не шучу.
Очевидно, что для авторизации через домен организации, администратор должен произвести соответствующую настройку в easla.com и в самом домене. В домене рекомендуется создать доп. пользователя, который обладает ограниченным набором прав достаточных для чтения данных о пользователях и только. Открыть порт или прокинуть туннель к домену. Администратор домена должен сам решить для себя, что проще, удобнее и безопаснее.
На стороне easla.com необходимо прописать IP домена, логин и пароль, а также путь для доступа к пользователям. Проверить соединение и, если оно удачно, то осуществить импорт пользователей из домена. Если пользователи уже созданы, то можно не импортировать, хотя импорт упрощает жизнь администратору на порядок.

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

Импорт из LDAP наглядно отображает ранее импортированных пользователей, их состояние (заблокирован или нет). Кроме этого, содержит гиперссылку на существующий аккаунт в easla.com. В случае, когда на стороне домена произведено много изменений, скажем, произошла «массовая миграция» пользователей из одних кабинетов в другие и изменились их номера телефонов и номера кабинетов, обновить данные в системе можно одной кнопкой «Обновление всех импортированных пользователей».
Все с заботой об администраторе!
Конечно, easla.com обладает своим почтовым сервером, но отправленные с его помощью письма будут от имени одного и того же виртуального пользователя. Но большинство сотрудников приучены или привыкли отвечать на входящие сообщения не глядя на адрес отправителя и невзирая на предупреждение, что этого делать ненужно. В итоге, письма уходят в никуда.
Можно научить пользователей адекватно воспринимать почтовые сообщения от системы, но можно поступить иначе – использовать почтовый сервер организации. Настройка easla.com позволяет указать имя почтового сервера организации, порт, логин и пароль. После чего, если в функции sendEmail будет заполнен параметр from, то письмо будет уходить от почтового сервера организации, а если параметр from не указан, то от почтового сервера easla.com.

Система easla.com предоставляет всем зарегистрированным администраторам и пользователям доступ к данным по протоколу SOAP. Описание функций можно найти по ссылкам (только для авторизованных пользователей и администраторов):
https://easla.com/ru/admin/soap
https://easla.com/ru/user/soap
Разумеется, доступ к данным для администратора и пользователя – разный. Пользователь даже через SOAP не сможет обратиться к объекту, к которому у него нет прав доступа, а администратор обладает полномочиями получить данные обо всех объектах.
Использовать SOAP можно самыми разными способами. Например, с помощью скрипта на VBScript:
Используя EaslaAgent установленный на рабочем месте пользователя можно писать модули и самостоятельные приложения на C# — ныне очень популярный язык программирования. Авторизацию пользователя агент возьмет на себя, что упрощает жизнь программисту. Все обращения к easla.com агент тоже преобразует в правильные запросы.
Кстати, агент предоставляет возможность отображения диалогового окна с перечнем полученных объектов, чтобы не «городить» его в каждом приложении снова и снова. Выглядит окошко примерно так:

Фрагмент кода, который получает перечень объектов из easla.com и показывает их в диалоговом окне:
Напоследок добавлю, что easla.com умеет интегрироваться в MS SQL с помощью CLR-модуля. Установив Easla.com module for MS SQL, можно прямо из SQL запроса запрашивать данные из easla.com, обрабатывать и передавать, скажем, в локально используемые системы или в отчеты.
Простой пример:
Резюмируя, повторюсь, только по-настоящему открытая система имеет право на жизнь в нынешних условиях и easla.com позволяет пользователю (в данном случае, скорее, администратору) почувствовать всю гибкость ее эксплуатации и независимость при доступе к данным. Никаких ограничений!

Не исключение и easla.com.
Авторизация и импорт пользователей
Прежде всего, easla.com позволяет сотрудникам организации авторизоваться несколькими способами. Первый, разумеется, авторизация с помощью учетной записи easla.com. Второй, авторизация с помощью социальных сетей. И третий, авторизация с помощью домена организации. Да-да, онлайн система позволяет авторизоваться через домен! Не шучу.
Очевидно, что для авторизации через домен организации, администратор должен произвести соответствующую настройку в easla.com и в самом домене. В домене рекомендуется создать доп. пользователя, который обладает ограниченным набором прав достаточных для чтения данных о пользователях и только. Открыть порт или прокинуть туннель к домену. Администратор домена должен сам решить для себя, что проще, удобнее и безопаснее.
На стороне easla.com необходимо прописать IP домена, логин и пароль, а также путь для доступа к пользователям. Проверить соединение и, если оно удачно, то осуществить импорт пользователей из домена. Если пользователи уже созданы, то можно не импортировать, хотя импорт упрощает жизнь администратору на порядок.

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

Импорт из LDAP наглядно отображает ранее импортированных пользователей, их состояние (заблокирован или нет). Кроме этого, содержит гиперссылку на существующий аккаунт в easla.com. В случае, когда на стороне домена произведено много изменений, скажем, произошла «массовая миграция» пользователей из одних кабинетов в другие и изменились их номера телефонов и номера кабинетов, обновить данные в системе можно одной кнопкой «Обновление всех импортированных пользователей».
Все с заботой об администраторе!
Почтовый сервер
Конечно, easla.com обладает своим почтовым сервером, но отправленные с его помощью письма будут от имени одного и того же виртуального пользователя. Но большинство сотрудников приучены или привыкли отвечать на входящие сообщения не глядя на адрес отправителя и невзирая на предупреждение, что этого делать ненужно. В итоге, письма уходят в никуда.
Можно научить пользователей адекватно воспринимать почтовые сообщения от системы, но можно поступить иначе – использовать почтовый сервер организации. Настройка easla.com позволяет указать имя почтового сервера организации, порт, логин и пароль. После чего, если в функции sendEmail будет заполнен параметр from, то письмо будет уходить от почтового сервера организации, а если параметр from не указан, то от почтового сервера easla.com.

SOAP
Система easla.com предоставляет всем зарегистрированным администраторам и пользователям доступ к данным по протоколу SOAP. Описание функций можно найти по ссылкам (только для авторизованных пользователей и администраторов):
https://easla.com/ru/admin/soap
https://easla.com/ru/user/soap
Разумеется, доступ к данным для администратора и пользователя – разный. Пользователь даже через SOAP не сможет обратиться к объекту, к которому у него нет прав доступа, а администратор обладает полномочиями получить данные обо всех объектах.
Использовать SOAP можно самыми разными способами. Например, с помощью скрипта на VBScript:
Получение списка исходящих писем из easla.com
Function EaslaSoapLogin(userName, password) Dim strSoap strSoap = "<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"">" & Chr(13) & _ "<s:Body xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">" & Chr(13) & _ "<login xmlns=""User"">" & Chr(13) & _ "<username>" & userName & "</username>" & Chr(13) & _ "<password>" & password & "</password>" & Chr(13) & _ "</login>" & Chr(13) & _ "</s:Body>" & Chr(13) & _ "</s:Envelope>" EaslaSoapLogin = strSoap End function Function EaslaSoapLogout() Dim strSoap strSoap = "<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"">" & Chr(13) & _ "<s:Body xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">" & Chr(13) & _ "<logout xmlns=""User""/>" & Chr(13) & _ "</s:Body>" & Chr(13) & _ "</s:Envelope>" EaslaSoapLogout = strSoap End function Function EaslaSoapOutgoings() Dim strSoap strSoap = "<?xml version=""1.0"" encoding=""UTF-8""?>" & Chr(13) & _ "<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">" & Chr(13) & _ "<soap:Body>" & Chr(13) & _ "<getObjectrefs xmlns=""User"">" & Chr(13) & _ "<objectdef>" & Chr(13) & _ "<id>234</id>" & Chr(13) & _ "<pid>118</pid>" & Chr(13) & _ "</objectdef>" & Chr(13) & _ "<attributerefs>" & Chr(13) & _ "<item>crs_management_outgoing_regnum</item>" & Chr(13) & _ "<item>crs_management_outgoing_document</item>" & Chr(13) & _ "<item>crs_management_outgoing_attachments</item>" & Chr(13) & _ "</attributerefs>" & Chr(13) & _ "<conditions>" & Chr(13) & _ "<item>" & Chr(13) & _ "<key>status</key>" & Chr(13) & _ "<values>" & Chr(13) & _ "<item>crs_management_outgoing_created</item>" & Chr(13) & _ "</values>" & Chr(13) & _ "</item>" & Chr(13) & _ "</conditions>" & Chr(13) & _ "</getObjectrefs>" & Chr(13) & _ "</soap:Body>" & Chr(13) & _ "</soap:Envelope>" EaslaSoapOutgoings = strSoap End function Function EaslaLogin(login, password) Dim URL URL = "https://easla.com/ru/user/soap/ws/1" Dim strSoapReq strSoapReq = EaslaSoapLogin(login, password) Dim oHttp Set oHttp = CreateObject("Msxml2.XMLHTTP") oHttp.open "POST", URL, false oHttp.setRequestHeader "Content-Type", "application/soap+xml" oHttp.setRequestHeader "charset", "utf-8" oHttp.send strSoapReq Dim strResult strResult = oHttp.responseText 'проверка, ошибка или корректный результат? dim regExp Set regExp = CreateObject("VBScript.RegExp") regExp.Multiline = True regExp.Pattern = "<ns1:loginResponse><loginResult>(.*)</loginResult></ns1:loginResponse>" 'Wscript.Echo strResult Set matches = regExp.Execute(strResult) if matches.count = 0 then EaslaLogin = false Exit Function end if EaslaLogin = (matches(0).SubMatches(0) = "true") End Function Function EaslaLogout Dim URL URL = "https://easla.com/ru/user/soap/ws/1" Dim strSoapReq strSoapReq = EaslaSoapLogout() Dim oHttp Set oHttp = CreateObject("Msxml2.XMLHTTP") oHttp.open "POST", URL, false oHttp.setRequestHeader "Content-Type", "application/soap+xml" oHttp.setRequestHeader "charset", "utf-8" oHttp.send strSoapReq Dim strResult strResult = oHttp.responseText 'проверка, ошибка или корректный результат? dim regExp Set regExp = CreateObject("VBScript.RegExp") regExp.Multiline = True regExp.Pattern = "<ns1:logoutResponse><logoutResult>(.*)</logoutResult></ns1:logoutResponse>" 'Wscript.Echo strResult Set matches = regExp.Execute(strResult) if matches.count = 0 then EaslaLogout = false Exit Function end if EaslaLogout = (matches(0).SubMatches(0) = "true") End Function Function EaslaOutgoings(ByRef ids, ByRef descriptions) Dim URL URL = "https://easla.com/ru/user/soap/ws/1" Dim strSoapReq strSoapReq = EaslaSoapOutgoings() Dim oHttp Set oHttp = CreateObject("Msxml2.XMLHTTP") oHttp.open "POST", URL, false oHttp.setRequestHeader "Content-Type", "application/soap+xml" oHttp.setRequestHeader "charset", "utf-8" oHttp.send strSoapReq Dim strResult strResult = oHttp.responseText 'проверка, ошибка или корректный результат? dim regExp Set regExp = CreateObject("VBScript.RegExp") regExp.Multiline = True regExp.Pattern = "<faultstring>(.*)</faultstring>" Set matches = regExp.Execute(strResult) if matches.count = 1 then EaslaOutgoings = false Exit Function end if EaslaOutgoings = ParseXMLToOutgoingsArray(Progress, strResult, ids, descriptions) End function Sub Reverse( ByRef myArray ) Dim i, j, idxLast, idxHalf, strHolder idxLast = UBound( myArray ) idxHalf = Int( idxLast / 2 ) For i = 0 To idxHalf strHolder = myArray( i ) myArray( i ) = myArray( idxLast - i ) myArray( idxLast - i ) = strHolder Next End Sub Function ParseXMLToOutgoingsArray(progress, strXML, ByRef ids, ByRef descriptions) Dim xmlDoc Set xmlDoc = CreateObject("Microsoft.XMLDOM") xmlDoc.async = false Dim ret ret = xmlDoc.loadXML(strXML) if (xmlDoc.parseError.errorCode <> 0) then Dim myErr Set myErr = xmlDoc.parseError ThisApplication.AddNotify "Ошибка при разборе XML " + myErr.reason end if dim nodeList Set nodeList = xmlDoc.SelectNodes("//getObjectrefsResult/item") Dim cnt, q, n cnt = nodeList.length q = 0 For Each node In nodeList dim id 'id = id_node.getElementsByTagName("value").item(0).Text id = node.getElementsByTagName("id").item(0).Text dim description description = node.getElementsByTagName("description").item(0).Text n = UBound(ids) if (n < 0) Then n = 0 ReDim Preserve ids(n + 1) ReDim Preserve descriptions(n + 1) ids(UBound(ids)) = id descriptions(UBound(descriptions)) = description q = q + 1 Next Call Reverse(ids) Call Reverse(descriptions) ParseXMLToOutgoingsArray = q End Function Dim auth auth = EaslaLogin("ORGANIZATION_CODE\User_login", "User_password") if (auth = false) then MsgBox "Авторизация на easla.com не пройдена. Неверное имя пользователя или пароль!", vbCritical Exit Sub end if Dim ids Dim descriptions Dim success success = EaslaOutgoings(ids, descriptions) Call EaslaLogout
С#
Используя EaslaAgent установленный на рабочем месте пользователя можно писать модули и самостоятельные приложения на C# — ныне очень популярный язык программирования. Авторизацию пользователя агент возьмет на себя, что упрощает жизнь программисту. Все обращения к easla.com агент тоже преобразует в правильные запросы.
Кстати, агент предоставляет возможность отображения диалогового окна с перечнем полученных объектов, чтобы не «городить» его в каждом приложении снова и снова. Выглядит окошко примерно так:

Фрагмент кода, который получает перечень объектов из easla.com и показывает их в диалоговом окне:
var result = EaslaApp.getObjectrefs(object_def, new string[] { "crs_management_incoming_contragent_regnum" }, new Easla.KeyValuesPairSoap[] { new Easla.KeyValuesPairSoap() {key = "status", values = new string[] {"crs_management_incoming_created"} }, new Easla.KeyValuesPairSoap() {key = "isdeleted", values = new string[] {"0"} } }); var m = EaslaApp.ShowSelectObjectDialog(result, new Easla.KeyValuePairSoap[] { new Easla.KeyValuePairSoap() { key = "Описание", value = "description"}, new Easla.KeyValuePairSoap() { key = "Дата создания", value = "createtime"}, new Easla.KeyValuePairSoap() { key = "Статус", value = "status.name"}, new Easla.KeyValuePairSoap() { key = "Регистрационный номер отправителя", value = "attributerefs[0].values[0].values[0]"} }) as Easla.ObjectrefComplexSoap;
SQL
Напоследок добавлю, что easla.com умеет интегрироваться в MS SQL с помощью CLR-модуля. Установив Easla.com module for MS SQL, можно прямо из SQL запроса запрашивать данные из easla.com, обрабатывать и передавать, скажем, в локально используемые системы или в отчеты.
Простой пример:
select @logined = [master].[dbo].[EASLAlogin](пользователь,пароль) IF (@logined = 1) BEGIN -- получение идентификаторов организации, процесса и объекта по их обозначениям SELECT @organization_id = organization.id, @process_id = process.id, @objectdef_id = objectdef.id FROM [master].[dbo].[EASLAgetOrganization] ('TNGP') AS organization LEFT JOIN [master].[dbo].[EASLAgetAllProcesses] () AS process ON process.oid = organization.id LEFT JOIN [master].[dbo].[EASLAgetAllObjectdefs] () AS objectdef ON objectdef.pid = process.id WHERE process.code = 'crs_management' AND objectdef.code = 'crs_management_outgoing'; SELECT attributerefs.value('(ArrayOfAttributerefSimpleSoap[1]/AttributerefSimpleSoap[1]/values/item/node())[1]','varchar(30)') as letternum ,attributerefs.value('(ArrayOfAttributerefSimpleSoap[1]/AttributerefSimpleSoap[2]/values/item/node())[1]','varchar(30)') as regdate ,cast(attributerefs.query('(ArrayOfAttributerefSimpleSoap[1]/AttributerefSimpleSoap[3]/values/item/consist/item/revdata)')as varchar(max)) as revguid ,cast([status].query('(StatusSimpleSoap[1]/name[1]/node())')as varchar(max)) as sentstatus FROM master.[dbo].[EASLAgetobjectrefs]( @process_id, @objectdef_id,CAST(' <attributerefs> <item>crs_management_outgoing_regnum</item> <item>crs_management_outgoing_sentdate</item> <item>crs_management_outgoing_attachments</item> </attributerefs> ' AS XML) , ' <conditions> <item> <key>status</key> <values><item>crs_management_outgoing_created</item></values> </item> </conditions>', @user_id –- какой-то пользователь ); END IF (@logined = 1) BEGIN select @logined = 1 - [master].[dbo].[EASLAlogout]() END
Итоги
Резюмируя, повторюсь, только по-настоящему открытая система имеет право на жизнь в нынешних условиях и easla.com позволяет пользователю (в данном случае, скорее, администратору) почувствовать всю гибкость ее эксплуатации и независимость при доступе к данным. Никаких ограничений!

