Интеграция 1С с почтовыми сервисами Microsoft Exchange через протокол EWS (Exchange Web Services) является мощным инструментом для автоматизации документооборота и планирования. В отличие от стандартных протоколов POP3 или IMAP, EWS позволяет работать не только с почтой, но и с календарями, задачами и контактами. Разберем подробно, как правильно настроить это взаимодействие, какие объекты 1С использовать и как избежать типичных ошибок при формировании запросов.
Часто в старых примерах кода можно встретить использование объекта MSXML2.XMLHTTP. Однако в современной разработке на платформе 1С 8.3 рекомендуется использовать встроенный объект HTTPСоединение. Это обеспечивает лучшую стабильность, кроссплатформенность (работу под Linux) и более удобную обработку защищенных соединений. Проанализируем, как инициализировать соединение с сервером Exchange.
Для работы с Exchange почти всегда требуется защищенное соединение SSL. Рассмотрим пример инициализации соединения:
// Настройка защищенного соединения
ssl = Новый ЗащищенноеСоединениеOpenSSL();
// Создание соединения (порт 443 для стандартного HTTPS)
Соединение = Новый HTTPСоединение(СерверEWS, 443, Логин, Пароль, , 20, ssl);
// Определение ресурса (точки входа EWS)
РесурсНаСервере = "/EWS/Exchange.asmx";
Обратите внимание, что использование ЗащищенноеСоединениеOpenSSL без параметров позволяет системе использовать сертификаты, установленные в операционной системе. Если на сервере Exchange используется самоподписанный сертификат, может потребоваться дополнительная настройка параметров проверки.
Одной из главных причин, по которой сервер возвращает пустой результат (код 200, но без данных), является некорректная структура SOAP-пакета. Сервис EWS крайне чувствителен к пространству имен (namespaces) и структуре XML. Выясним причину на примере операции FindItem, которая используется для поиска писем или записей календаря.
Рассмотрим структуру правильного XML-запроса для поиска непрочитанных сообщений:
ТекстXML =
"<?xml version=""1.0"" encoding=""utf-8""?>
|<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
| xmlns:m=""http://schemas.microsoft.com/exchange/services/2006/messages""
| xmlns:t=""http://schemas.microsoft.com/exchange/services/2006/types""
| xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
| <soap:Header>
| <t:RequestServerVersion Version=""Exchange2013"" />
| </soap:Header>
| <soap:Body>
| <m:FindItem Traversal=""Shallow"">
| <m:ItemShape>
| <t:BaseShape>IdOnly</t:BaseShape>
| <t:AdditionalProperties>
| <t:FieldURI FieldURI=""item:Subject"" />
| <t:FieldURI FieldURI=""item:DateTimeReceived"" />
| </t:AdditionalProperties>
| </m:ItemShape>
| <m:ParentFolderIds>
| <t:DistinguishedFolderId Id=""inbox"" />
| </m:ParentFolderIds>
| </m:FindItem>
| </soap:Body>
|</soap:Envelope>";
При формировании запроса важно помнить следующие моменты:
IdOnly, сервер вернет только идентификаторы. Если нужно получить больше данных сразу, используйте AllProperties (но это замедлит работу).После подготовки текста XML необходимо правильно сформировать заголовки HTTP-запроса. Для EWS обязательным является заголовок Content-Type: text/xml;charset=UTF-8.
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8");
ЗапросHTTP = Новый HTTPЗапрос(РесурсНаСервере, Заголовки);
ЗапросHTTP.УстановитьТелоИзСтроки(ТекстXML, КодировкаТекста.UTF8);
Результат = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
Если Результат.КодСостояния = 200 Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
// Далее используем ФабрикуXDTO или последовательное чтение для разбора XML
Иначе
Сообщить("Ошибка соединения: " + Результат.КодСостояния);
КонецЕсли;
Для двусторонней синхронизации календаря, которую мы рассматриваем, недостаточно просто считывать данные. Проанализируем алгоритм синхронизации:
SyncFolderItems. Она возвращает только измененные, созданные или удаленные объекты с момента последнего запроса. Для этого нужно сохранять специальный токен — SyncState.CreateItem с типом объекта CalendarItem.ApplicationImpersonation. В коде 1С при этом в заголовок SOAP-запроса добавляется секция ExchangeImpersonation с указанием email целевого пользователя.Проанализируем современные требования Microsoft, которые могут повлиять на работоспособность вашего кода. В облачных версиях (Office 365 / Exchange Online) базовая аутентификация (логин/пароль) отключена. В этом случае код с HTTPСоединение(..., Логин, Пароль) работать не будет.
Для современных систем необходимо:
Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);.Если же вы работаете с локальным сервером (On-premises Exchange), убедитесь, что в настройках виртуального каталога EWS включена проверка подлинности (Basic или NTLM), соответствующая вашим настройкам в 1С. Также полезно проверить доступность сервиса, просто введя URL https://yourserver/EWS/Exchange.asmx в браузере — вы должны увидеть страницу с описанием сервиса (WSDL).
Таким образом, мы рассмотрели основные этапы построения интеграции. Использование HTTPСоединение в связке с правильно структурированными SOAP-запросами позволяет реализовать гибкую и производительную систему обмена данными между 1С и Microsoft Exchange.