При переходе с обычных форм на управляемые программисты часто сталкиваются с ситуацией, когда проверенный годами код внезапно перестает работать. Одной из самых распространенных проблем является ошибка "-2147221005(0x800401F3): Invalid class string", возникающая при попытке инициализации Microsoft Outlook через COM-соединение. Рассмотрим подробно, почему это происходит и как правильно организовать работу с почтовым клиентом в современных конфигурациях, таких как ЗУП 3.1 или ERP.
Разберем классическую ситуацию: в старой базе на обычных формах код создания объекта Новый COMОбъект("OUTLOOK.Application") работал безупречно. После переноса в новую конфигурацию на управляемых формах та же самая строка кода вызывает исключение. Выясним причину этого поведения. Основная проблема заключается в изменении контекста выполнения кода.
В управляемых формах большая часть программного кода по умолчанию выполняется на стороне сервера. Когда система встречает команду создания COM-объекта в серверном модуле, она пытается найти зарегистрированный программный класс OUTLOOK.Application именно в реестре операционной системы сервера. Проанализируем основные факторы, препятствующие успешному созданию объекта:
USR1CV8) работает в изолированной "Сессии 0". У этой сессии нет доступа к графическому интерфейсу и пользовательским профилям. Поскольку Outlook — это интерактивное GUI-приложение, он требует наличия активного рабочего стола и настроенного профиля почты.Проанализируем самый простой и эффективный способ исправления. Если ваша задача — открыть окно письма, чтобы пользователь мог его отредактировать и отправить, создание объекта должно происходить строго на клиенте. На клиентском компьютере пользователя Outlook обычно установлен и настроен.
Посмотрим на пример правильной организации вызова:
&НаКлиенте
Процедура СформироватьПисьмоOutlook(Получатель, Тема, Текст)
Попытка
Outlook = Новый COMОбъект("Outlook.Application");
Исключение
Сообщить("Не удалось подключиться к Outlook. Проверьте, установлено ли приложение.");
Возврат;
КонецПопытки;
Письмо = Outlook.CreateItem(0); // 0 - olMailItem
Письмо.To = Получатель;
Письмо.Subject = Тема;
Письмо.Body = Текст;
Письмо.Display(); // Открываем окно письма пользователю
КонецПроцедуры
В этом случае выполнение происходит в контексте операционной системы пользователя, где зарегистрированы все необходимые COM-классы, и разрядность клиентского приложения 1С обычно совпадает с разрядностью Office.
Рассмотрим ситуацию, когда письмо нужно отправить в фоновом режиме на сервере без участия пользователя. В этом случае использование Outlook через COM является плохой практикой. Проанализируем более надежную альтернативу — объект ИнтернетПочта. Этот метод не требует установленного Outlook и работает напрямую через протоколы SMTP/IMAP.
Разберем по шагам, как настроить отправку через сервер:
&НаСервере
Процедура ОтправитьПисьмоСервер(АдресСервера, Порт, Логин, Пароль)
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = АдресСервера;
Профиль.ПортSMTP = Порт;
Профиль.Пользователь = Логин;
Профиль.Пароль = Пароль;
Профиль.ТолькоРегистрацияПередОтправкой = Ложь;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Получатели.Добавить("recipient@mail.ru");
Сообщение.Отправитель.Адрес = "sender@mail.ru";
Сообщение.Тема = "Тестовое сообщение из 1С";
Сообщение.Тексты.Добавить("Привет! Это письмо отправлено с сервера 1С без использования COM.", ТипТекстаПочтовогоСообщения.ПростойТекст);
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Отправить(Сообщение);
Почта.Отключиться();
Исключение
ЗаписьЖурналаРегистрации("ОтправкаПочты", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Этот способ полностью снимает проблемы с Invalid class string, так как не зависит от сторонних библиотек и реестра Windows.
Выясним, что делать, если специфика бизнеса требует использования именно Outlook (например, для сохранения писем в папке "Отправленные" конкретного пользователя или доступа к специфическим свойствам объектов Outlook). В таких случаях часто используется библиотека Redemption.dll.
Проанализируем возможности этой библиотеки. Она является "оберткой" над Extended MAPI и позволяет:
Однако помните: использование внешних DLL требует их предварительной регистрации в операционной системе с помощью команды regsvr32. Для 64-битного сервера 1С вам потребуется 64-битная версия библиотеки.
Если вы все же решили настраивать COM-взаимодействие непосредственно на сервере, выполним следующие шаги для диагностики и исправления:
1C:Enterprise 8.3 Server Agent, есть права на запуск COM-объектов. Это настраивается в панели "Службы компонентов" (dcomcnfg).Session.Logon().Безопасный режим, использование COMОбъект будет заблокировано на уровне платформы 1С. Для исправления необходимо либо отключить безопасный режим, либо использовать профили безопасности./regserver от имени администратора, чтобы обновить записи в HKEY_CLASSES_ROOT.Подведем итог. Ошибка Invalid class string в 90% случаев является следствием того, что код выполняется не там, где установлено приложение. Проанализируем архитектуру вашей доработки: если действие инициирует пользователь — используйте клиентский контекст. Если это регламентное задание — переходите на ИнтернетПочта или специализированные API.