Как запустить процедуру из внешней обработки или расширения по расписанию в 1С

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

В процессе разработки часто возникает задача автоматического запуска определенного программного кода по расписанию. Это может быть импорт контрагентов с сайта, выгрузка заказов, синхронизация данных или отправка уведомлений. Если конфигурация находится на поддержке, разработчики стараются избегать внесения изменений в основную конфигурацию и используют механизмы расширений или внешних обработок.

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

Ограничения платформы и выбор архитектурного решения

При планировании разработки важно учитывать версию платформы «1С:Предприятие» и режим совместимости, установленный в вашей информационной базе. Выясним, почему стандартный механизм регламентных заданий в расширениях подходит не всегда:

  1. Ограничение старых версий совместимости: Создавать собственные объекты метаданных типа РегламентныеЗадания напрямую в расширении разрешено только начиная с платформы 8.3.23. Если ваша конфигурация работает в режиме совместимости 8.3.12 (или любом другом ниже 8.3.23), попытка добавить регламентное задание в расширение приведет к ошибке компиляции.
  2. Альтернатива через БСП (Рекомендуется): Использование Библиотеки стандартных подсистем (БСП) позволяет зарегистрировать обычную внешнюю обработку в справочнике ДополнительныеОтчетыИОбработки. Механизм БСП автоматически создает регламентное задание под каждую команду обработки и позволяет гибко настраивать расписание прямо в пользовательском интерфейсе.
  3. Метод «заглушек» в расширениях: Если необходимо использовать именно расширение, в основной конфигурации должно существовать хотя бы одно предопределенное регламентное задание, вызывающее процедуру общего модуля. Мы можем заимствовать этот общий модуль в расширение и применить аннотацию &После или &Вместо для внедрения своего кода.

Ниже мы подробно разберем наиболее гибкий и безопасный вариант — создание внешней обработки, запускаемой по расписанию механизмами БСП.

Пошаговое создание внешней обработки для БСП

Рассмотрим структуру программного кода модуля объекта внешней обработки. Чтобы БСП распознала обработку и позволила настроить для нее расписание, в модуле объекта должны быть обязательно определены две экспортные процедуры: СведенияОВнешнейОбработке и ВыполнитьКоманду.

Проанализируем пример правильной инициализации и исправим распространенные синтаксические ошибки:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.0");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка;
    ПараметрыРегистрации.Версия = "1.5";
    
    // Безопасный режим на уровне кода. 
    // Если требуется доступ к файловой системе или внешним API сайтов, устанавливаем Ложь.
    ПараметрыРегистрации.БезопасныйРежим = Ложь; 
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Получить контрагентов с сайта (фоновое выполнение)";
    НоваяКоманда.Идентификатор = "ПолучитьКонтрагентовССайта";
    
    // Для запуска по расписанию критически важно использовать вызов серверного метода
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;

КонецФункции

После успешной регистрации БСП обращается к предопределенной процедуре ВыполнитьКоманду. Обратите внимание на важный нюанс: в модуле объекта внешней обработки запрещено использовать директивы компиляции (такие как &НаСервере или &НаКлиенте). Модуль объекта всегда выполняется на стороне сервера приложения 1С. Наличие директив компиляции приведет к ошибкам при синтаксической проверке или во время выполнения фонового задания.

Напишем корректный обработчик выполнения команды:


Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт

    Если ИмяКоманды = "ПолучитьКонтрагентовССайта" Тогда
        ВыполнитьЗагрузкуКонтрагентов(ПараметрыВыполнения);
    КонецЕсли;

КонецПроцедуры

Проблема безопасного режима и запросы разрешений в БСП

Зачастую при интеграциях с внешними сайтами разработчики сталкиваются с тем, что обработка отказывается отправлять HTTP-запросы или считывать файлы с диска, даже если в коде прописано ПараметрыРегистрации.БезопасныйРежим = Ложь. Это происходит из-за жестких настроек профилей безопасности в кластере серверов 1С.

Выясним, как правильно решить проблему ограничения прав. Вместо полной деактивации безопасного режима, современный стандарт разработки рекомендует явно запрашивать разрешения у системы безопасности БСП. Для этого в функции СведенияОВнешнейОбработке() мы программно декларируем необходимые внешние ресурсы:


// Пример добавления разрешения на работу с внешним API-сервисом по сети HTTP/HTTPS
РазрешениеСеть = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
    "HTTPS", 
    "api.mysite.com", 
    443, 
    "Взаимодействие с личным кабинетом для получения контрагентов"
);
ПараметрыРегистрации.Разрешения.Добавить(РазрешениеСеть);

При интерактивной загрузке такой обработки администратор базы данных увидит запрос на предоставление разрешений и сможет безопасно одобрить работу только с указанными адресами, не открывая полный доступ ко всей операционной системе сервера.

Особенности ведения Журнала регистрации в фоновых заданиях

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

Единственный надежный способ контролировать ход выполнения фонового процесса — использование Журнала регистрации. Разберем шаблон написания безопасной процедуры с логированием результатов выполнения:


Процедура ВыполнитьЗагрузкуКонтрагентов(ПараметрыВыполнения)

    ИмяСобытияЛога = "ДополнительнаяОбработка.ПолучитьКонтрагентов";
    ЗаписьЖурналаРегистрации(ИмяСобытияЛога, УровеньЖурналаРегистрации.Информация, , , "Запуск процедуры интеграции.");

    Попытка
        
        // Пример работы с базой данных внутри транзакции безопасности
        Настройки = РегистрыСведений.НастройкаПодключений.СоздатьНаборЗаписей();
        Настройки.Прочитать();
        
        // Бизнес-логика интеграции...
        
        ЗаписьЖурналаРегистрации(ИмяСобытияЛога, УровеньЖурналаРегистрации.Информация, , , "Загрузка успешно завершена.");
        
    Исключение
        
        // Обязательно перехватываем все непредвиденные ошибки
        ОписаниеОшибкиСтрокой = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
        
        ЗаписьЖурналаРегистрации(
            ИмяСобытияЛога, 
            УровеньЖурналаРегистрации.Ошибка, 
            , , 
            "Произошел сбой при выгрузке: " + ОписаниеОшибкиСтрокой
        );
        
        // Перевызываем исключение, чтобы БСП зафиксировала статус выполнения задания как "Ошибка"
        ВызватьИсключение "Ошибка выполнения регламентного задания: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
        
    КонецПопытки;

КонецПроцедуры

Если записи всё равно не появляются в Журнале регистрации, проверьте настройки фильтрации событий в Конфигураторе через меню Администрирование -> Настройка журнала регистрации. Должен быть выбран уровень детализации не ниже "Регистрировать ошибки и предупреждения" (а лучше "Регистрировать информационные сообщения").

Как передавать параметры в обработку, запускаемую по расписанию

Поскольку фоновое регламентное задание запускается сервером автоматически, интерактивно запросить у пользователя параметры запуска (например, диапазон дат или выбор конкретной организации) невозможно. Посмотрим на два лучших архитектурных способа решения этой задачи.

Способ 1. Использование «Хранилища общих настроек» (Рекомендуемый)

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

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

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


&НаСервере
Процедура СохранитьНастройкиНаСервере()

    СтруктураНастроек = Новый Структура;
    СтруктураНастроек.Вставить("АдресСервера", Объект.АдресСервера);
    СтруктураНастроек.Вставить("ЗагружатьИзображения", Объект.ЗагружатьИзображения);
    
    // Получаем ссылку на текущий элемент справочника БСП из параметров формы
    СсылкаНаДопОбработку = Параметры.ДополнительнаяОбработкаСсылка;
    
    Если ЗначениеЗаполнено(СсылкаНаДопОбработку) Тогда
        КлючНастроек = "НастройкиРегламента_" + Строка(СсылкаНаДопОбработку.УникальныйИдентификатор());
        ХранилищеОбщихНастроек.Сохранить(КлючНастроек, "", СтруктураНастроек);
        СообщитьПользователю("Настройки успешно сохранены для регламентного задания!");
    КонецЕсли;

КонецПроцедуры

Теперь рассмотрим, как получить эти настройки в фоновом режиме внутри модуля объекта обработки при плановом запуске:


Процедура ВыполнитьЗагрузкуКонтрагентов(ПараметрыВыполнения)

    // БСП автоматически передает ссылку на элемент справочника в параметрах выполнения
    СсылкаНаОбработку = ПараметрыВыполнения.ДополнительнаяОбработкаСсылка;
    
    КлючНастроек = "НастройкиРегламента_" + Строка(СсылкаНаОбработку.УникальныйИдентификатор());
    СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить(КлючНастроек, "");
    
    Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
        АдресСервера = СтруктураНастроек.АдресСервера;
        ЗагружатьИзображения = СтруктураНастроек.ЗагружатьИзображения;
    Иначе
        // Настройки не найдены, используем значения по умолчанию
        АдресСервера = "https://default.api.com";
        ЗагружатьИзображения = Ложь;
    КонецЕсли;
    
    // Дальнейший алгоритм выполнения с использованием полученных переменных...

КонецПроцедуры

Способ 2. Использование параметров команды БСП

При регистрации обработки через СведенияОВнешнейОбработке() вы можете задействовать штатную табличную часть параметров, доступную в справочнике дополнительных отчетов и обработок. Этот способ подходит для простых параметров (например, передача текстовой строки или булева значения), которые системный администратор может отредактировать непосредственно в карточке зарегистрированной обработки без открытия ее интерактивной формы.

Данные параметры будут доступны для чтения напрямую через переданную в обработчик структуру ПараметрыВыполнения.

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

← На главную