При разработке интеграций в среде 1С:Предприятие программисты часто сталкиваются с ситуацией, когда код, идеально работающий на клиенте (в интерактивном сеансе), внезапно «валится» с ошибкой при переносе в фоновое или регламентное задание. Одной из самых коварных ошибок является сообщение: «Значение не является значением объектного типа (ОтправитьДляОбработки)». Рассмотрим подробно, почему это происходит и как вылечить эту проблему раз и навсегда.
Ошибка Значение не является значением объектного типа (ОтправитьДляОбработки) означает, что к моменту вызова метода переменная, в которой должен находиться объект HTTPСоединение, содержит Неопределено или другой тип, не поддерживающий этот метод. Разберем ситуацию: метод ОтправитьДляОбработки (русскоязычный аналог метода Post) вызывается у объекта соединения. Если соединение не установилось, платформа не всегда выбрасывает исключение сразу — иногда объект просто «не рождается», и последующее обращение к его методу вызывает критический сбой.
Почему на клиенте всё работает, а на сервере нет? Основная причина кроется в различии сетевого окружения и прав доступа. Когда вы запускаете код под своим пользователем, 1С использует ваши настройки прокси, ваши сертификаты и ваши права доступа в интернет. Регламентное задание выполняется на сервере под технической учетной записью (обычно usr1cv8), у которой права могут быть сильно ограничены.
Проанализируем основные факторы, которые приводят к «превращению соединения в тыкву» на стороне сервера:
Выясним причину проблем с SSL. Если вы используете ЗащищенноеСоединениеOpenSSL, сервер 1С должен доверять сертификату удаленного узла. Рассмотрим пример правильной инициализации соединения, которая поможет избежать обнуления объекта:
// Инициализация защищенного соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Попытка создания соединения
Попытка
Соединение = Новый HTTPСоединение(
"api5.successfactors.eu", // Сервер
443, // Порт
Логин, // Пользователь
Пароль, // Пароль
, // Прокси
60, // Таймаут в секундах
ЗащищенноеСоединение // Защищенное соединение
);
Исключение
ЗаписьЖурналаРегистрации("Интеграция.Ошибка", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось установить соединение: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Важный момент: Если на сервере не установлены корневые сертификаты удостоверяющего центра (CA), выдавшего сертификат для api5.successfactors.eu, объект HTTPСоединение может вести себя непредсказуемо. Убедитесь, что сертификаты установлены в хранилище «Доверенные корневые центры сертификации» на уровне Локального компьютера, а не текущего пользователя.
Как показывает практика (и сообщения с форумов), часто админы «нахомутали» с правами. Проверим следующее:
usr1cv8 доступ к порту 443 внешних адресов в брандмауэре (файрволле)?rphost.exe при попытке установить HTTP-соединение?Разберем способ диагностики: попробуйте временно запустить службу сервера 1С под своей доменной учетной записью (под которой на клиенте всё работает). Если ошибка исчезнет — проблема однозначно в правах доступа учетной записи usr1cv8.
Если сервер 1С находится за прокси-сервером, необходимо явно сконфигурировать объект ИнтернетПрокси. Посмотрим на пример кода:
Прокси = Новый ИнтернетПрокси(Ложь); // Не использовать системные настройки
Прокси.Установить("https", "192.168.1.1", 8080);
Прокси.Пользователь = "proxy_user";
Прокси.Пароль = "proxy_password";
Соединение = Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, Прокси, 30, ЗащищенноеСоединение);
Обратите внимание, что использование системных настроек (параметр Истина в конструкторе ИнтернетПрокси) на сервере часто бесполезно, так как у системной службы эти настройки не заданы.
Чтобы не гадать, почему метод ОтправитьДляОбработки не срабатывает, необходимо обернуть вызов в блок Попытка...Исключение и логировать полное описание ошибки. Платформа часто дает более детальное пояснение внутри исключения, которое теряется при простом «вылете» регламентного задания.
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос, ФайлРезультата);
Исключение
Информация = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("Ошибка_API",
УровеньЖурналаРегистрации.Ошибка,
Метаданные.РегламентныеЗадания.SF_Интеграция,
,
"Ошибка при вызове ОтправитьДляОбработки: " + КраткоеПредставлениеОшибки(Информация) +
Символы.ПС + ПодробноеПредставлениеОшибки(Информация));
ВызватьИсключение "Ошибка интеграции. Подробности в журнале регистрации.";
КонецПопытки;
Этот подход позволит увидеть реальную причину: «Ошибка TLS-соединения», «Удаленный хост принудительно разорвал соединение» или «Ошибка аутентификации прокси». Это гораздо информативнее, чем сообщение о «не объектном типе».
Подведем итоги. Если вы столкнулись с подобной ошибкой в регламентном задании:
HTTPСоединение создается корректно и не возвращает Неопределено из-за подавленных ошибок внутри функций-оберток.Следуя этим шагам, вы сможете локализовать проблему и обеспечить стабильную работу интеграции 1С с внешними системами в любом контексте выполнения.