При интеграции внешних обработок в конфигурации на базе «Библиотеки стандартных подсистем» (БСП), таких как «1С:Документооборот», «1С:ERP» или «1С:Управление торговлей», часто возникает задача их запуска по расписанию с определенными входными данными (например, с указанием учетной записи электронной почты, организации или каталога выгрузки).
Штатный механизм регламентных заданий БСП накладывает жесткое ограничение: общее регламентное задание ЗапускДополнительныхОбработок передает в процедуру выполнения строго фиксированный массив платформенных параметров — ссылку на элемент справочника дополнительных обработок и строковый идентификатор команды. Передать произвольный параметр напрямую через интерфейс настройки расписания невозможно. Разберем штатные и надежные способы решения этой задачи без изменения конфигурации.
Наиболее универсальный и рекомендованный архитектурный подход заключается в создании отдельной формы настройки внутри самой внешней обработки. В этой форме администратор выбирает необходимые параметры (например, элемент справочника УчетныеЗаписиЭлектроннойПочты), которые сохраняются в специализированном реквизите БСП.
В справочнике ДополнительныеОтчетыИОбработки разработчиками БСП уже предусмотрен типовой реквизит ХранилищеНастроек с типом ХранилищеЗначения. Разберем по шагам реализацию этого механизма:
СведенияОВнешнейОбработке() модуля объекта регистрируем две команды: одну с типом ОткрытиеФормы (для интерактивной настройки параметров пользователем), вторую — с типом ВызовСерверногоМетода (для выполнения по расписанию).Параметры.ДополнительнаяОбработкаСсылка. В форме настраиваются нужные реквизиты, а по кнопке сохранения параметры упаковываются в структуру и записываются в справочник:
&НаСервере
Процедура СохранитьНастройкиНаСервере()
ПараметрыОбработки = Новый Структура;
ПараметрыОбработки.Вставить("УчетнаяЗапись", Объект.УчетнаяЗапись);
ОбъектСправочника = Параметры.ДополнительнаяОбработкаСсылка.ПолучитьОбъект();
ОбъектСправочника.ХранилищеНастроек = Новый ХранилищеЗначения(ПараметрыОбработки);
ОбъектСправочника.Записать();
КонецПроцедуры
ДополнительныеОтчетыИОбработки.СохранитьНастройки(...).
ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) ссылка на элемент справочника доступна через свойство ПараметрыВыполнения.ДополнительнаяОбработкаСсылка. Извлекаем ранее сохраненные данные:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "ОбработатьПочту" Тогда
СсылкаНаОбработку = ПараметрыВыполнения.ДополнительнаяОбработкаСсылка;
Хранилище = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаОбработку, "ХранилищеНастроек");
Если Хранилище <> Неопределено Тогда
Настройки = Хранилище.Получить();
Если ТипЗнч(Настройки) = Тип("Структура") Тогда
УчетнаяЗапись = Настройки.УчетнаяЗапись;
// Логика обработки писем
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Нередко разработчики используют платформенный механизм ХранилищеОбщихНастроек, однако здесь часто возникает ошибка: интерактивно сохраненные администратором настройки не видны при регламентном выполнении.
Выясним причину этой проблемы: фоновое задание выполняется в системном сеансе без интерактивного пользователя. По умолчанию методы ХранилищеОбщихНастроек.Сохранить() и ХранилищеОбщихНастроек.Загрузить() привязывают данные к имени текущего пользователя (ИмяПользователя()), поэтому при запуске из-под регламентного задания метод возвращает Неопределено.
Чтобы избежать этой проблемы, необходимо явно задавать пустую строку или системный идентификатор в качестве имени пользователя, а также выполнять чтение и запись в привилегированном режиме:
// Сохранение настроек для общего доступа
УстановитьПривилегированныйРежим(Истина);
ХранилищеОбщихНастроек.Сохранить("ВнешняяОбработка_ЗагрузкаПочты", "Параметры", СтруктураНастроек, , "");
// Чтение настроек в фоновом задании
УстановитьПривилегированныйРежим(Истина);
Настройки = ХранилищеОбщихНастроек.Загрузить("ВнешняяОбработка_ЗагрузкаПочты", "Параметры", , "");
Если нет желания разрабатывать форму настройки внутри внешней обработки, можно задействовать типовую подсистему БСП «Свойства». Справочник ДополнительныеОтчетыИОбработки включен в эту подсистему во всех типовых решениях.
СправочникСсылка.УчетныеЗаписиЭлектроннойПочты.ВыполнитьКоманду считываем значение через стандартный вызов:
ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(
ПараметрыВыполнения.ДополнительнаяОбработкаСсылка,
ПланВидовХарактеристикСсылка
);
Если список параметров заранее известен и невелик (например, два или три конкретных почтовых ящика), можно зарегистрировать в функции СведенияОВнешнейОбработке() отдельные команды на каждый вариант (ЗагрузкаЯщик1, ЗагрузкаЯщик2).
Для каждой серверной команды БСП сформирует отдельное регламентное задание с собственным расписанием, а выбор рабочей учетной записи будет производиться ветвлением по параметру ИдентификаторКоманды прямо в процедуре ВыполнитьКоманду.