Ситуация, когда код для отправки СМС прекрасно работает при ручном запуске из внешней обработки, но «молчит» при подключении через регламентное задание, является классической для разработчиков 1С. Основная сложность заключается в том, что регламентные задания выполняются в фоновом режиме на стороне сервера, что накладывает ряд ограничений и специфических требований к коду. Рассмотрим подробнее, почему это происходит и как исправить ситуацию.
Первое, на что мы должны обратить внимание — это разница между клиентским и серверным контекстом. Когда вы запускаете обработку вручную, часть кода может выполняться на клиенте (в контексте вашего приложения), используя ваши настройки ОС, доступ в интернет и права доступа. Регламентное задание всегда запускается на сервере.
Разберем основные требования к коду для регламентного задания:
ВызовСерверногоМетода.Предупреждение(), Вопрос(), ОткрытьФорму(). Если в коде отправки СМС затесалось хотя бы одно Сообщить() (без проверки на серверный контекст), выполнение задания может прерваться.Часто проблема кроется не в коде 1С, а в системных настройках. Рассмотрим ситуацию: ваш компьютер имеет прямой выход в интернет, а сервер 1С находится в закрытом контуре или работает через прокси-сервер.
Проанализируем следующие моменты:
USR1CV8). У этой записи может не быть прав на использование сетевых ресурсов или выход за пределы локальной сети.inetcfg.xml на сервере 1С, либо явно инициализировать объект ИнтернетПрокси в коде.Пример инициализации прокси в коде:
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("http", "192.168.1.1", 8080, "Логин", "Пароль");
HTTPСоединение = Новый HTTPСоединение("api.sms-pro.ru",,,, Прокси);
Одной из самых больших ошибок разработчиков является использование пустых блоков Попытка...Исключение. В регламентном задании вы не увидите сообщение об ошибке на экране. Если код «споткнулся», задание просто завершится с неочевидным статусом.
Посмотрим, как правильно собирать информацию об ошибках. Вместо пустого исключения обязательно используем ЗаписьЖурналаРегистрации(). Это позволит нам зайти в журнал регистрации и увидеть реальную причину сбоя.
Рассмотрим пример правильной обработки:
Процедура ОтправитьСМСНаСервере()
Попытка
// Ваш код отправки СМС
// ...
Исключение
ТекстОшибки = ИнформацияОбОшибке().Описание;
ЗаписьЖурналаРегистрации("ОтправкаСМС",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Произошла ошибка при отправке: " + ТекстОшибки);
КонецПопытки;
КонецПроцедуры
Используя метод ОписаниеОшибки() или ИнформацияОбОшибке(), мы получим детальный стек вызовов, который укажет, на какой именно строке кода или методе HTTP-соединения произошел отказ.
Выяснить причину сбоя «вслепую» сложно. Разберем шаги для эффективной отладки:
ТекущийПользователь) могут быть не заполнены. Если ваша логика опирается на настройки конкретного пользователя, перепишите ее так, чтобы данные брались из констант или справочников.В современных конфигурациях, таких как УТ 11, построенных на базе БСП (Библиотеки стандартных подсистем), рекомендуется использовать штатные механизмы.
Рассмотрим более надежную схему:
Резюме: Если регламентное задание не отправляет СМС, первым делом проверьте доступ сервера к внешним URL, оберните код в ЗаписьЖурналаРегистрации и убедитесь, что в коде нет обращений к клиентскому контексту. Использование Попытка...Исключение с записью подробностей в журнал — это не просто хороший тон, а единственный способ выживания кода в серверной среде.