При сопровождении устаревших конфигураций (например, 1С:Зарплата и Управление Персоналом 2.5) на современных версиях платформы 8.3 программисты часто сталкиваются с парадоксальной ситуацией: код для отправки почты, который успешно работает в новой конфигурации, выдает ошибку "Can't login to this server" или "SMTP connection broken" в старой базе. Причина кроется не в ошибках кода, а в том, как режим совместимости 8.2.13 влияет на работу встроенного почтового клиента 1С.
В этой статье мы подробно разберем, почему платформа ведет себя именно так, проанализируем технические ограничения старых протоколов и рассмотрим несколько эффективных способов решения проблемы без изменения режима совместимости всей конфигурации.
Проанализируем механику работы почтового сервера. Большинство современных сервисов используют порт 587, который требует обязательного использования расширения STARTTLS. Это означает, что соединение начинается как обычное (незащищенное), а затем клиент отправляет команду на переход в защищенный режим.
В режиме совместимости 8.2.13 объект ИнтернетПочта использует старую библиотеку реализации протокола. Эта реализация зачастую не умеет корректно инициировать STARTTLS. Когда сервер ожидает команду на шифрование, а 1С пытается сразу отправить данные авторизации в открытом виде, сервер обрывает соединение с ошибкой 421 SMTP connection broken или возвращает отказ в логине. Если же вы полностью отключаете режим совместимости, платформа 8.3 задействует современные алгоритмы, которые отрабатывают этот процесс автоматически и прозрачно для разработчика.
Рассмотрим стандартный профиль, который часто используется в примерах:
Профиль = Новый ИнтернетПочтовыйПрофиль();
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.АдресСервераPOP3 = "pop.mail.ru";
// ... заполнение остальных полей
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
В режиме совместимости 8.2.13 при вызове метода Подключиться() платформа пытается инициализировать соединение сразу по двум протоколам, если заполнены оба адреса серверов. Ошибка "Can't login to this server" часто возникает из-за того, что проверка подлинности на входящем сервере (POP3) проходит с ошибкой или конфликтует с методом авторизации SMTP.
Решение проблемы через разделение профилей:
Если нам нужна только отправка писем, мы должны полностью исключить упоминание входящей почты из профиля. Разберем по шагам, как модифицировать код:
ИнтернетПочтовыйПрофиль только настройки SMTP.АдресСервераPOP3 и Пользователь (общий) не заполняются, если вы используете ПользовательSMTP.Пример оптимизированного кода для отправки:
Профиль = Новый ИнтернетПочтовыйПрофиль();
Профиль.АдресСервераSMTP = "ваш.сервер.ru";
Профиль.ПортSMTP = 25; // Пробуем порт без TLS, если сервер в локальной сети
Профиль.ПользовательSMTP = "login";
Профиль.ПарольSMTP = "password";
Профиль.Таймаут = 60;
// Важно: не заполняем АдресСервераPOP3 вообще!
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Если манипуляции с портами и профилями не помогают, а режим совместимости менять нельзя, оптимальным выходом будет отказ от объекта ИнтернетПочта в пользу системного COM-объекта Windows — CDO.Message. Этот метод работает в обход ограничений 1С и использует системные библиотеки Windows для работы с почтой, которые отлично поддерживают и TLS, и любые современные порты.
Рассмотрим реализацию этого метода:
// Создаем объекты для формирования письма
Письмо = Новый COMОбъект("CDO.Message");
Конфигурация = Новый COMОбъект("CDO.Configuration");
// Настройка параметров сервера
Поля = Конфигурация.Fields;
// Указываем, что используем внешний SMTP сервер
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "smtp.yourserver.ru";
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 465; // Или 587
// Тип авторизации: 1 - Basic (базовая)
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1;
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = "user@mail.ru";
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = "password";
// Включение SSL
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = Истина;
Поля.Update();
// Формирование текста и адресатов
Письмо.Configuration = Конфигурация;
Письмо.From = "user@mail.ru";
Письмо.To = "recipient@mail.ru";
Письмо.Subject = "Тестовое письмо через CDO";
Письмо.TextBody = "Текст сообщения";
// Отправка
Попытка
Письмо.Send();
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
Выясним преимущества этого подхода: он полностью игнорирует настройки совместимости 1С. Поскольку CDO.Message обращается напрямую к операционной системе, он ведет себя одинаково и в 8.2, и в 8.3.
Если ошибка сохраняется, выполните следующие действия для локализации проблемы:
telnet адрес_сервера порт в командной строке сервера, где запущена 1С. Если экран очистился — порт открыт. Если возникла ошибка — проблема в брандмауэре.Wireshark, чтобы увидеть, на каком этапе происходит разрыв TCP-сессии.Подведем итог: режим совместимости 8.2.13 накладывает серьезные ограничения на встроенные механизмы работы с почтой. Чтобы решить проблему "Can't login to this server", мы рекомендуем либо полностью разделить профили отправки и получения, либо перейти на использование COM-объекта CDO, что гарантирует стабильную работу независимо от настроек платформы 1С.