В современных конфигурациях, таких как 1С:Управление торговлей 11, построенных на базе Библиотеки стандартных подсистем (БСП), механизм хранения паролей учетных записей электронной почты претерпел значительные изменения. Раньше пароль хранился в явном виде в реквизите справочника, но теперь, в целях безопасности, он вынесен в Безопасное хранилище. В этой статье мы подробно разберем, как программно извлечь эти данные, правильно сформировать почтовый профиль и отправить письмо, избежав распространенных ошибок авторизации.
Если мы попробуем просто обратиться к реквизиту Объект.Пароль или Объект.ПарольSMTP у элемента справочника УчетныеЗаписиЭлектроннойПочты, то получим пустую строку или системную маску. Это сделано для того, чтобы пользователи и даже администраторы не могли увидеть конфиденциальные данные в консоли запросов или через стандартные отчеты. Все пароли теперь хранятся в защищенном регистре сведений (или системном хранилище платформы), доступ к которому ограничен программным интерфейсом и требует привилегированного режима выполнения кода.
Рассмотрим ситуацию, когда нам необходимо вручную собрать объект ИнтернетПочтовыйПрофиль. Для этого нам понадобится обратиться к методам БСП, которые умеют «общаться» с хранилищем паролей. Важно помнить, что этот код должен выполняться в привилегированном режиме, иначе система вернет пустой результат из-за нехватки прав доступа к системным данным.
Проанализируем пример кода, который позволяет вытащить пароль:
// СсылкаНаУчетку - это ссылка на элемент справочника УчетныеЗаписиЭлектроннойПочты
УстановитьПривилегированныйРежим(Истина);
// Используем метод общего назначения БСП для чтения данных
Пароли = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(СсылкаНаУчетку, "Пароль, ПарольSMTP");
УстановитьПривилегированныйРежим(Ложь);
// Теперь в структуре "Пароли" содержатся реальные значения
ПарольДляАвторизации = Пароли.ПарольSMTP;
Если ПустаяСтрока(ПарольДляАвторизации) Тогда
ПарольДляАвторизации = Пароли.Пароль; // Если пароль SMTP не задан отдельно, берем основной
КонецЕсли;
Важный нюанс: при просмотре кода типовых форм вы можете встретить конструкцию с использованием ЭтотОбъект.УникальныйИдентификатор. Обратите внимание, что это используется только для отображения «звездочек» на форме и подмены реального пароля идентификатором. Для программной отправки нам нужен именно чистый текст пароля, который возвращает метод ПрочитатьДанныеИзБезопасногоХранилища.
Вместо того чтобы вручную собирать структуру профиля и заботиться о защищенном хранилище, мы рекомендуем использовать встроенную функцию БСП, которая делает всю черную работу за нас. Метод ПараметрыУчетнойЗаписи возвращает полную структуру настроек, включая уже расшифрованные пароли, порты и адреса серверов.
Разберем, как это реализовать на практике:
// Получаем настройки учетной записи через штатный механизм БСП
Настройки = РаботаСПочтовымиСообщениями.ПараметрыУчетнойЗаписи(СсылкаНаУчетку);
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = Настройки.СерверИсходящейПочты;
Профиль.ПортSMTP = Настройки.ПортИсходящейПочты;
Профиль.ПользовательSMTP = Настройки.ПользовательSMTP;
Профиль.ПарольSMTP = Настройки.ПарольSMTP;
// Настройка защищенного соединения (SSL/TLS)
Если Настройки.ИспользоватьБезопасноеСоединениеДляИсходящейПочты Тогда
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Ложь;
КонецЕсли;
Этот подход гораздо надежнее, так как он автоматически учитывает все изменения в структуре хранения данных, которые могут появиться в новых версиях конфигурации.
Часто после успешного получения пароля разработчики сталкиваются с ошибкой SMTP error code 501. Проанализируем основные причины возникновения этой ситуации:
Отправитель, строго совпадал с логином, под которым произошла авторизация. Если вы вошли под info@company.ru, а пытаетесь отправить от имени director@company.ru, сервер вернет 501 ошибку.СокрЛП() обязателен к применению.Выясним еще одну важную деталь. Если вы используете Gmail, Яндекс или Mail.ru, то обычный пароль от почтового ящика не подойдет для программной отправки через 1С. Эти сервисы требуют создания специального "Пароля приложения".
Для этого нужно:
В процессе обсуждения на форуме поднимался вопрос о том, что создание документов «Исходящее электронное письмо» может привести к резкому росту объема базы данных (особенно из-за тяжелых вложений). Если вам нужно отправить уведомление немедленно и не хранить его в истории переписки 1С, рассмотрим метод прямой отправки:
ПараметрыПисьма = Новый Структура;
ПараметрыПисьма.Вставить("Кому", "client@mail.ru");
ПараметрыПисьма.Вставить("Тема", "Уведомление об отгрузке");
ПараметрыПисьма.Вставить("Тело", "Добрый день! Ваш заказ отгружен.");
// Прямая отправка через БСП без создания ссылочных объектов в БД
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(СсылкаНаУчетку, ПараметрыПисьма);
Этот метод выполняет отправку в текущем сеансе (синхронно). Если же вы используете типовой механизм создания документа ЭлектронноеПисьмоИсходящее, не забудьте настроить регламентное задание «Очистка ненужных файлов», чтобы система автоматически удаляла старые вложения через 14-30 дней, как советовали участники обсуждения. Это позволит держать размер базы под контролем, сохраняя при этом историю переписки за актуальный период.