При разработке функционала отправки электронной почты во внешних обработках и конфигурациях 1С разработчики нередко сталкиваются с ошибкой: «Ошибка при вызове метода контекста (Подключиться): Несоответствие типов (параметр номер '1')». Параллельно с этим возникает недоумение, когда проверка типа переменной возвращает неожиданное строковое представление вроде «Настройка почты». Разберем подробно, почему возникают эти ситуации и как правильно организовать отправку сообщений с использованием встроенного языка платформы и Библиотеки стандартных подсистем (БСП).
Проанализируем исходный фрагмент кода, вызвавший затруднения:
&НаСервере
Процедура ОтправитьПисьмоНаСервере()
Учетка = УчетнаяЗапись;
Если ТипЗнч(Учетка) = Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты") Тогда
Сообщить("Всё норм тип строки:" + Строка(ТипЗнч(Учетка)));
Иначе
Сообщить("Ошибка: Неверный тип учетной записи. Получен: " + Строка(ТипЗнч(Учетка)));
КонецЕсли;
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = Тема;
Письмо.Отправитель = Учетка.АдресЭлектроннойПочты;
Письмо.ИмяОтправителя = Учетка.ИмяПользователя;
АдресПолучателя = Получатель;
Письмо.Получатели.Добавить(АдресПолучателя);
ТекстПисьма = Новый ТекстовыйДокумент;
ТекстПисьма.УстановитьТекст(Сообщение);
Письмо.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);
Попытка
ИнтернетПочта = Новый ИнтернетПочта;
ИнтернетПочта.Подключиться(Учетка);
ИнтернетПочта.Отправить(Письмо);
ИнтернетПочта.Отключиться();
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Ошибка при отправке письма: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
В этом коде присутствуют сразу две логические нестыковки: неверная интерпретация строкового представления типа и передача недопустимого типа объекта в метод подключения почтового клиента.
Выясним причину странного вывода в сообщении: "Всё норм тип строки:Настройка почты". Условие проверки отработало абсолютно верно и вернуло Истина, так как в переменной действительно находилась ссылка на справочник. Однако вызов встроенной функции Строка() для значения с типом Тип формирует не системное имя метаданных, а синоним объекта конфигурации на текущем языке интерфейса пользователя.
В конфигурациях, использующих БСП, у справочника УчетныеЗаписиЭлектроннойПочты в свойствах задан синоним «Настройка почты». Поэтому платформа преобразует тип в понятное пользователю представление. Если в коде или отладке требуется получить именно системное наименование типа, рассмотрим два корректных способа:
ИмяТипа = XMLТип(ТипЗнч(Учетка)).ИмяТипа;
Сообщить("Системное имя: " + ИмяТипа);
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Учетка));
Если ОбъектМетаданных <> Неопределено Тогда
Сообщить("Полное имя: " + ОбъектМетаданных.ПолноеИмя());
КонецЕсли;
Разберем теперь главную ошибку: Несоответствие типов (параметр номер '1'). Обратимся к синтакс-помощнику платформы 1С для метода ИнтернетПочта.Подключиться(). Его синтаксис имеет следующий вид:
ИнтернетПочта.Подключиться(<Профиль>, <Протокол>)
Первый параметр обязан иметь тип ИнтернетПочтовыйПрофиль. В исходном же коде в метод передается переменная Учетка, которая содержит ссылку на элемент справочника (СправочникСсылка.УчетныеЗаписиЭлектроннойПочты). Платформа 1С не умеет автоматически извлекать параметры сервера, порты, логины и пароли из ссылки на справочник в рамках вызова низкоуровневого объекта ИнтернетПочта.
Более того, если мы попытаемся вручную заполнить ИнтернетПочтовыйПрофиль реквизитами из ссылки на справочник БСП, нас ждет еще одна проблема: пароли учетных записей не хранятся в открытом виде в реквизитах справочника. В целях информационной безопасности БСП сохраняет пароли в защищенном регистре сведений БезопасноеХранилищеДанных.
Если в конфигурации уже внедрена Библиотека стандартных подсистем, нет никакой необходимости вручную инициализировать объект ИнтернетПочта, создавать профиль и управлять сетевым подключением. Для этих задач в БСП предусмотрен готовый общий модуль РаботаСЭлектроннойПочтой.
Перепишем серверную процедуру отправки письма так, как это принято делать в типовых решениях:
&НаСервере
Процедура ОтправитьПисьмоНаСервере()
// Проверяем заполнение учетной записи
Если Не ЗначениеЗаполнено(УчетнаяЗапись) Тогда
ВызватьИсключение "Не выбрана учетная запись электронной почты.";
КонецЕсли;
// Формируем структуру параметров письма в формате БСП
ПараметрыПисьма = Новый Структура;
ПараметрыПисьма.Вставить("Кому", Получатель);
ПараметрыПисьма.Вставить("Тема", Тема);
ПараметрыПисьма.Вставить("Тело", Сообщение);
ПараметрыПисьма.Вставить("ТипТекста", "ПростойТекст"); // Или "HTML" при необходимости
Попытка
// Отправляем почту штатным методом подсистемы БСП
РаботаСЭлектроннойПочтой.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Ошибка при отправке письма: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Посмотрим на преимущества такого подхода:
РаботаСЭлектроннойПочтой.ОтправитьПочтовоеСообщение принимает именно ссылку на элемент справочника УчетныеЗаписиЭлектроннойПочты в качестве первого параметра.ПараметрыПисьма ключ Вложения, содержащий массив структур с полями Представление (имя файла) и Данные (объект ДвоичныеДанные).При работе с внешними обработками и отправкой почты обратим внимание на два критически важных фактора: