Как реализовать интеграцию 1С с Microsoft Exchange через EWS для получения писем и синхронизации календаря

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Интеграция 1С с почтовыми сервисами Microsoft Exchange через протокол EWS (Exchange Web Services) является мощным инструментом для автоматизации документооборота и планирования. В отличие от стандартных протоколов POP3 или IMAP, EWS позволяет работать не только с почтой, но и с календарями, задачами и контактами. Разберем подробно, как правильно настроить это взаимодействие, какие объекты 1С использовать и как избежать типичных ошибок при формировании запросов.

Переход от COM-объектов к нативным средствам 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 используется самоподписанный сертификат, может потребоваться дополнительная настройка параметров проверки.

Формирование XML-запроса для получения данных

Одной из главных причин, по которой сервер возвращает пустой результат (код 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>";

При формировании запроса важно помнить следующие моменты:

  1. Traversal="Shallow" — указывает на поиск только в указанной папке без вложенных директорий.
  2. BaseShape — если указать IdOnly, сервер вернет только идентификаторы. Если нужно получить больше данных сразу, используйте AllProperties (но это замедлит работу).
  3. DistinguishedFolderId — позволяет обращаться к стандартным папкам (inbox, calendar, sentitems) по их системным именам.

Отправка запроса и обработка результата

После подготовки текста 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
Иначе
    Сообщить("Ошибка соединения: " + Результат.КодСостояния);
КонецЕсли;

Синхронизация календаря: особенности и нюансы

Для двусторонней синхронизации календаря, которую мы рассматриваем, недостаточно просто считывать данные. Проанализируем алгоритм синхронизации:

  1. Использование SyncFolderItems: Вместо того чтобы каждый раз запрашивать все записи календаря, используйте операцию SyncFolderItems. Она возвращает только измененные, созданные или удаленные объекты с момента последнего запроса. Для этого нужно сохранять специальный токен — SyncState.
  2. Создание событий: Для создания записи в календаре используется метод CreateItem с типом объекта CalendarItem.
  3. Имперсонация (Impersonation): Если 1С должна работать с календарями многих пользователей через одну сервисную учетную запись, администратору Exchange нужно настроить роль ApplicationImpersonation. В коде 1С при этом в заголовок SOAP-запроса добавляется секция ExchangeImpersonation с указанием email целевого пользователя.

Важные замечания по безопасности и современным требованиям

Проанализируем современные требования Microsoft, которые могут повлиять на работоспособность вашего кода. В облачных версиях (Office 365 / Exchange Online) базовая аутентификация (логин/пароль) отключена. В этом случае код с HTTPСоединение(..., Логин, Пароль) работать не будет.

Для современных систем необходимо:

Если же вы работаете с локальным сервером (On-premises Exchange), убедитесь, что в настройках виртуального каталога EWS включена проверка подлинности (Basic или NTLM), соответствующая вашим настройкам в 1С. Также полезно проверить доступность сервиса, просто введя URL https://yourserver/EWS/Exchange.asmx в браузере — вы должны увидеть страницу с описанием сервиса (WSDL).

Таким образом, мы рассмотрели основные этапы построения интеграции. Использование HTTPСоединение в связке с правильно структурированными SOAP-запросами позволяет реализовать гибкую и производительную систему обмена данными между 1С и Microsoft Exchange.

← На главную