Как исправить ошибку несоответствия типов при вызове метода ИнтернетПочта.Подключиться и отправить письмо в 1С?

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

При разработке функционала отправки электронной почты во внешних обработках и конфигурациях 1С разработчики нередко сталкиваются с ошибкой: «Ошибка при вызове метода контекста (Подключиться): Несоответствие типов (параметр номер '1')». Параллельно с этим возникает недоумение, когда проверка типа переменной возвращает неожиданное строковое представление вроде «Настройка почты». Разберем подробно, почему возникают эти ситуации и как правильно организовать отправку сообщений с использованием встроенного языка платформы и Библиотеки стандартных подсистем (БСП).

Проанализируем исходный фрагмент кода, вызвавший затруднения:


&НаСервере
Процедура ОтправитьПисьмоНаСервере()
    Учетка = УчетнаяЗапись;

    Если ТипЗнч(Учетка) = Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты") Тогда
        Сообщить("Всё норм тип строки:" + Строка(ТипЗнч(Учетка)));
    Иначе
        Сообщить("Ошибка: Неверный тип учетной записи. Получен: " + Строка(ТипЗнч(Учетка)));
    КонецЕсли;

    Письмо = Новый ИнтернетПочтовоеСообщение;
    Письмо.Тема = Тема;
    Письмо.Отправитель = Учетка.АдресЭлектроннойПочты; 
    Письмо.ИмяОтправителя = Учетка.ИмяПользователя; 

    АдресПолучателя = Получатель; 
    Письмо.Получатели.Добавить(АдресПолучателя);  

    ТекстПисьма = Новый ТекстовыйДокумент;
    ТекстПисьма.УстановитьТекст(Сообщение); 
    Письмо.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);

    Попытка
        ИнтернетПочта = Новый ИнтернетПочта;
        ИнтернетПочта.Подключиться(Учетка); 
        ИнтернетПочта.Отправить(Письмо);  
        ИнтернетПочта.Отключиться(); 
        Сообщить("Письмо успешно отправлено!");
    Исключение
        Сообщить("Ошибка при отправке письма: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

В этом коде присутствуют сразу две логические нестыковки: неверная интерпретация строкового представления типа и передача недопустимого типа объекта в метод подключения почтового клиента.

Почему Строка(ТипЗнч(...)) возвращает синоним «Настройка почты»

Выясним причину странного вывода в сообщении: "Всё норм тип строки:Настройка почты". Условие проверки отработало абсолютно верно и вернуло Истина, так как в переменной действительно находилась ссылка на справочник. Однако вызов встроенной функции Строка() для значения с типом Тип формирует не системное имя метаданных, а синоним объекта конфигурации на текущем языке интерфейса пользователя.

В конфигурациях, использующих БСП, у справочника УчетныеЗаписиЭлектроннойПочты в свойствах задан синоним «Настройка почты». Поэтому платформа преобразует тип в понятное пользователю представление. Если в коде или отладке требуется получить именно системное наименование типа, рассмотрим два корректных способа:

  1. Через функцию XMLТип:
    
    ИмяТипа = XMLТип(ТипЗнч(Учетка)).ИмяТипа;
    Сообщить("Системное имя: " + ИмяТипа);
    
  2. Через дерево метаданных:
    
    ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Учетка));
    Если ОбъектМетаданных <> Неопределено Тогда
        Сообщить("Полное имя: " + ОбъектМетаданных.ПолноеИмя());
    КонецЕсли;
    

Причина ошибки «Несоответствие типов» в методе Подключиться

Разберем теперь главную ошибку: Несоответствие типов (параметр номер '1'). Обратимся к синтакс-помощнику платформы 1С для метода ИнтернетПочта.Подключиться(). Его синтаксис имеет следующий вид:

ИнтернетПочта.Подключиться(<Профиль>, <Протокол>)

Первый параметр обязан иметь тип ИнтернетПочтовыйПрофиль. В исходном же коде в метод передается переменная Учетка, которая содержит ссылку на элемент справочника (СправочникСсылка.УчетныеЗаписиЭлектроннойПочты). Платформа 1С не умеет автоматически извлекать параметры сервера, порты, логины и пароли из ссылки на справочник в рамках вызова низкоуровневого объекта ИнтернетПочта.

Более того, если мы попытаемся вручную заполнить ИнтернетПочтовыйПрофиль реквизитами из ссылки на справочник БСП, нас ждет еще одна проблема: пароли учетных записей не хранятся в открытом виде в реквизитах справочника. В целях информационной безопасности БСП сохраняет пароли в защищенном регистре сведений БезопасноеХранилищеДанных.

Решение: отправка почты штатными средствами БСП

Если в конфигурации уже внедрена Библиотека стандартных подсистем, нет никакой необходимости вручную инициализировать объект ИнтернетПочта, создавать профиль и управлять сетевым подключением. Для этих задач в БСП предусмотрен готовый общий модуль РаботаСЭлектроннойПочтой.

Перепишем серверную процедуру отправки письма так, как это принято делать в типовых решениях:


&НаСервере
Процедура ОтправитьПисьмоНаСервере()
    // Проверяем заполнение учетной записи
    Если Не ЗначениеЗаполнено(УчетнаяЗапись) Тогда
        ВызватьИсключение "Не выбрана учетная запись электронной почты.";
    КонецЕсли;

    // Формируем структуру параметров письма в формате БСП
    ПараметрыПисьма = Новый Структура;
    ПараметрыПисьма.Вставить("Кому", Получатель);
    ПараметрыПисьма.Вставить("Тема", Тема);
    ПараметрыПисьма.Вставить("Тело", Сообщение);
    ПараметрыПисьма.Вставить("ТипТекста", "ПростойТекст"); // Или "HTML" при необходимости

    Попытка
        // Отправляем почту штатным методом подсистемы БСП
        РаботаСЭлектроннойПочтой.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
        Сообщить("Письмо успешно отправлено!");
    Исключение
        Сообщить("Ошибка при отправке письма: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Посмотрим на преимущества такого подхода:

  1. Метод РаботаСЭлектроннойПочтой.ОтправитьПочтовоеСообщение принимает именно ссылку на элемент справочника УчетныеЗаписиЭлектроннойПочты в качестве первого параметра.
  2. Подсистема БСП самостоятельно обратится к безопасному хранилищу, извлечет пароль, корректно настроит все протоколы (SMTP, POP3, IMAP), выполнит авторизацию и закроет соединение после завершения передачи.
  3. Если к письму потребуется прикрепить файлы, достаточно добавить в структуру ПараметрыПисьма ключ Вложения, содержащий массив структур с полями Представление (имя файла) и Данные (объект ДвоичныеДанные).

Важные нюансы: безопасный режим и пароли приложений

При работе с внешними обработками и отправкой почты обратим внимание на два критически важных фактора:

  1. Безопасный режим внешних обработок: Если внешняя обработка подключена через справочник «Дополнительные отчеты и обработки», по умолчанию она запускается в безопасном режиме. В этом режиме платформой заблокированы прямые внешние сетевые подключения. Для успешной отправки сообщений при регистрации обработки необходимо либо отключить безопасный режим, либо настроить профили безопасности с явным разрешением сетевого доступа к портам почтового сервера.
  2. Авторизация на почтовых серверах: Большинство современных почтовых сервисов (Яндекс, Mail.ru, Gmail) запрещают использовать основной пароль от ящика при подключении из внешних программ и требуют обязательного применения SSL/TLS-шифрования. В личном кабинете почтового сервиса необходимо заранее сгенерировать отдельный «пароль для внешних приложений» и указать его в настройках учетной записи в 1С.
← На главную