В процессе разработки часто возникает задача автоматического запуска определенного программного кода по расписанию. Это может быть импорт контрагентов с сайта, выгрузка заказов, синхронизация данных или отправка уведомлений. Если конфигурация находится на поддержке, разработчики стараются избегать внесения изменений в основную конфигурацию и используют механизмы расширений или внешних обработок.
В этой статье мы подробно разберем, как реализовать запуск серверной процедуры по расписанию без изменения типовой конфигурации, рассмотрим ограничения платформы 1С:Предприятие, исправим частые ошибки начинающих разработчиков при написании кода для фоновых заданий и научимся передавать параметры в выполняемую обработку.
При планировании разработки важно учитывать версию платформы «1С:Предприятие» и режим совместимости, установленный в вашей информационной базе. Выясним, почему стандартный механизм регламентных заданий в расширениях подходит не всегда:
РегламентныеЗадания напрямую в расширении разрешено только начиная с платформы 8.3.23. Если ваша конфигурация работает в режиме совместимости 8.3.12 (или любом другом ниже 8.3.23), попытка добавить регламентное задание в расширение приведет к ошибке компиляции.ДополнительныеОтчетыИОбработки. Механизм БСП автоматически создает регламентное задание под каждую команду обработки и позволяет гибко настраивать расписание прямо в пользовательском интерфейсе.&После или &Вместо для внедрения своего кода.Ниже мы подробно разберем наиболее гибкий и безопасный вариант — создание внешней обработки, запускаемой по расписанию механизмами БСП.
Рассмотрим структуру программного кода модуля объекта внешней обработки. Чтобы БСП распознала обработку и позволила настроить для нее расписание, в модуле объекта должны быть обязательно определены две экспортные процедуры: СведенияОВнешнейОбработке и ВыполнитьКоманду.
Проанализируем пример правильной инициализации и исправим распространенные синтаксические ошибки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.0");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка;
ПараметрыРегистрации.Версия = "1.5";
// Безопасный режим на уровне кода.
// Если требуется доступ к файловой системе или внешним API сайтов, устанавливаем Ложь.
ПараметрыРегистрации.БезопасныйРежим = Ложь;
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Получить контрагентов с сайта (фоновое выполнение)";
НоваяКоманда.Идентификатор = "ПолучитьКонтрагентовССайта";
// Для запуска по расписанию критически важно использовать вызов серверного метода
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
После успешной регистрации БСП обращается к предопределенной процедуре ВыполнитьКоманду. Обратите внимание на важный нюанс: в модуле объекта внешней обработки запрещено использовать директивы компиляции (такие как &НаСервере или &НаКлиенте). Модуль объекта всегда выполняется на стороне сервера приложения 1С. Наличие директив компиляции приведет к ошибкам при синтаксической проверке или во время выполнения фонового задания.
Напишем корректный обработчик выполнения команды:
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт
Если ИмяКоманды = "ПолучитьКонтрагентовССайта" Тогда
ВыполнитьЗагрузкуКонтрагентов(ПараметрыВыполнения);
КонецЕсли;
КонецПроцедуры
Зачастую при интеграциях с внешними сайтами разработчики сталкиваются с тем, что обработка отказывается отправлять HTTP-запросы или считывать файлы с диска, даже если в коде прописано ПараметрыРегистрации.БезопасныйРежим = Ложь. Это происходит из-за жестких настроек профилей безопасности в кластере серверов 1С.
Выясним, как правильно решить проблему ограничения прав. Вместо полной деактивации безопасного режима, современный стандарт разработки рекомендует явно запрашивать разрешения у системы безопасности БСП. Для этого в функции СведенияОВнешнейОбработке() мы программно декларируем необходимые внешние ресурсы:
// Пример добавления разрешения на работу с внешним API-сервисом по сети HTTP/HTTPS
РазрешениеСеть = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
"HTTPS",
"api.mysite.com",
443,
"Взаимодействие с личным кабинетом для получения контрагентов"
);
ПараметрыРегистрации.Разрешения.Добавить(РазрешениеСеть);
При интерактивной загрузке такой обработки администратор базы данных увидит запрос на предоставление разрешений и сможет безопасно одобрить работу только с указанными адресами, не открывая полный доступ ко всей операционной системе сервера.
Распространенная ситуация: регламентное задание запускается, ошибок в интерфейсе нет, но разработчик не видит результатов работы. Попытки использовать метод Сообщить() внутри фонового задания не дадут никакого эффекта, так как фоновые задания выполняются в изолированном серверном сеансе, где отсутствует графический интерфейс пользователя.
Единственный надежный способ контролировать ход выполнения фонового процесса — использование Журнала регистрации. Разберем шаблон написания безопасной процедуры с логированием результатов выполнения:
Процедура ВыполнитьЗагрузкуКонтрагентов(ПараметрыВыполнения)
ИмяСобытияЛога = "ДополнительнаяОбработка.ПолучитьКонтрагентов";
ЗаписьЖурналаРегистрации(ИмяСобытияЛога, УровеньЖурналаРегистрации.Информация, , , "Запуск процедуры интеграции.");
Попытка
// Пример работы с базой данных внутри транзакции безопасности
Настройки = РегистрыСведений.НастройкаПодключений.СоздатьНаборЗаписей();
Настройки.Прочитать();
// Бизнес-логика интеграции...
ЗаписьЖурналаРегистрации(ИмяСобытияЛога, УровеньЖурналаРегистрации.Информация, , , "Загрузка успешно завершена.");
Исключение
// Обязательно перехватываем все непредвиденные ошибки
ОписаниеОшибкиСтрокой = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(
ИмяСобытияЛога,
УровеньЖурналаРегистрации.Ошибка,
, ,
"Произошел сбой при выгрузке: " + ОписаниеОшибкиСтрокой
);
// Перевызываем исключение, чтобы БСП зафиксировала статус выполнения задания как "Ошибка"
ВызватьИсключение "Ошибка выполнения регламентного задания: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
КонецПроцедуры
Если записи всё равно не появляются в Журнале регистрации, проверьте настройки фильтрации событий в Конфигураторе через меню Администрирование -> Настройка журнала регистрации. Должен быть выбран уровень детализации не ниже "Регистрировать ошибки и предупреждения" (а лучше "Регистрировать информационные сообщения").
Поскольку фоновое регламентное задание запускается сервером автоматически, интерактивно запросить у пользователя параметры запуска (например, диапазон дат или выбор конкретной организации) невозможно. Посмотрим на два лучших архитектурных способа решения этой задачи.
Идея метода заключается в следующем: пользователь открывает форму внешней обработки интерактивно один раз, заполняет настройки в интерфейсе, и система сохраняет их в базу данных. При запуске по расписанию код фонового процесса считывает сохраненную структуру настроек.
Для уникальной идентификации настроек конкретного экземпляра обработки используется ссылка на элемент справочника ДополнительныеОтчетыИОбработки, которую БСП автоматически передает в модуль объекта.
Проанализируем программный код сохранения настроек из формы обработки:
&НаСервере
Процедура СохранитьНастройкиНаСервере()
СтруктураНастроек = Новый Структура;
СтруктураНастроек.Вставить("АдресСервера", Объект.АдресСервера);
СтруктураНастроек.Вставить("ЗагружатьИзображения", Объект.ЗагружатьИзображения);
// Получаем ссылку на текущий элемент справочника БСП из параметров формы
СсылкаНаДопОбработку = Параметры.ДополнительнаяОбработкаСсылка;
Если ЗначениеЗаполнено(СсылкаНаДопОбработку) Тогда
КлючНастроек = "НастройкиРегламента_" + Строка(СсылкаНаДопОбработку.УникальныйИдентификатор());
ХранилищеОбщихНастроек.Сохранить(КлючНастроек, "", СтруктураНастроек);
СообщитьПользователю("Настройки успешно сохранены для регламентного задания!");
КонецЕсли;
КонецПроцедуры
Теперь рассмотрим, как получить эти настройки в фоновом режиме внутри модуля объекта обработки при плановом запуске:
Процедура ВыполнитьЗагрузкуКонтрагентов(ПараметрыВыполнения)
// БСП автоматически передает ссылку на элемент справочника в параметрах выполнения
СсылкаНаОбработку = ПараметрыВыполнения.ДополнительнаяОбработкаСсылка;
КлючНастроек = "НастройкиРегламента_" + Строка(СсылкаНаОбработку.УникальныйИдентификатор());
СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить(КлючНастроек, "");
Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
АдресСервера = СтруктураНастроек.АдресСервера;
ЗагружатьИзображения = СтруктураНастроек.ЗагружатьИзображения;
Иначе
// Настройки не найдены, используем значения по умолчанию
АдресСервера = "https://default.api.com";
ЗагружатьИзображения = Ложь;
КонецЕсли;
// Дальнейший алгоритм выполнения с использованием полученных переменных...
КонецПроцедуры
При регистрации обработки через СведенияОВнешнейОбработке() вы можете задействовать штатную табличную часть параметров, доступную в справочнике дополнительных отчетов и обработок. Этот способ подходит для простых параметров (например, передача текстовой строки или булева значения), которые системный администратор может отредактировать непосредственно в карточке зарегистрированной обработки без открытия ее интерактивной формы.
Данные параметры будут доступны для чтения напрямую через переданную в обработчик структуру ПараметрыВыполнения.
Используя предложенные методики, вы сможете быстро и надежно разворачивать фоновые процессы интеграции любой сложности в базах «1С:Предприятие» без изменения типовой конфигурации.