Процедура регламентного задания:
Процедура мод_ВнешняяОбработка(Код=Неопределено) Экспорт Если Код=Неопределено Тогда ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! Не правильно указан параметр '"+Код+"'", УровеньЖурналаРегистрации.Предупреждение); Иначе СсылкаНаВнешнююОбработку = Неопределено; Если СтрНайти(Код,"\")>0 Тогда ДвоичныеДанные = Новый ДвоичныеДанные(Код); Если ДвоичныеДанные=Неопределено Тогда ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! Не получилось получить ДвоичныеДанные '"+Код+"'", УровеньЖурналаРегистрации.Ошибка); Возврат; КонецЕсли; Иначе Если НЕ Метаданные.Справочники.Найти("ВнешниеОбработки")=Неопределено Тогда ИмяМетаданного = "ВнешниеОбработки"; ИмяРеквизитыХранилища = "ХранилищеВнешнейОбработки"; ИначеЕсли НЕ Метаданные.Справочники.Найти("ДополнительныеОтчетыИОбработки")=Неопределено Тогда ИмяМетаданного = "ДополнительныеОтчетыИОбработки"; ИмяРеквизитыХранилища = "ХранилищеОбработки"; Иначе Возврат; КонецЕсли; Выполнить("СсылкаНаВнешнююОбработку = Справочники."+ИмяМетаданного+".НайтиПоКоду("""+Код+""");"); Если НЕ СсылкаНаВнешнююОбработку.Пустая() Тогда ДвоичныеДанные = СсылкаНаВнешнююОбработку[ИмяРеквизитыХранилища].Получить(); Иначе ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! В справочнике "+ИмяМетаданного+" не найдена обработка по коду '"+Код+"'", УровеньЖурналаРегистрации.Ошибка); Выполнить("СсылкаНаВнешнююОбработку = Справочники."+ИмяМетаданного+".НайтиПоНаименованию("""+Код+""",Истина);"); Если НЕ СсылкаНаВнешнююОбработку.Пустая() Тогда ДвоичныеДанные = СсылкаНаВнешнююОбработку[ИмяРеквизитыХранилища].Получить(); Иначе ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! В справочнике "+ИмяМетаданного+" не найдена обработка по наименованию '"+Код+"'", УровеньЖурналаРегистрации.Ошибка); Возврат; КонецЕсли; КонецЕсли; КонецЕсли; Попытка АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные); ИмяОбработки = ВнешниеОбработки.Подключить(АдресВоВременномХранилище, , Ложь); внОбработка = ВнешниеОбработки.Создать(ИмяОбработки); Попытка внОбработка.ВыполнитьЗадание(); Исключение ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! Внешняя обработка '"+СсылкаНаВнешнююОбработку+"' должна иметь в модуле экспортную процедуру 'ВыполнитьЗадание() Экспорт'", УровеньЖурналаРегистрации.Ошибка); КонецПопытки; Исключение ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! '"+ОписаниеОшибки()+"'", УровеньЖурналаРегистрации.Ошибка); КонецПопытки; КонецЕсли; КонецПроцедуры
Данный блок тестировался на конфигурациях: УПП 1.3.124.2, БП 3.0.67.43, БП 2.0.66.77 и будет работать в любой типовой и НЕ типовой конфигурации, при условии выбора файла в качестве внешней обработки.
Тип передаваемого параметра выявляется по наличию символа "\", что означает путь к файлу, в противном случае ищется обработка по коду либо по имени обработки в справочнике.
В коде описано 2 вида справочника: ВнешниеОбработки с реквизитом ХранилищеВнешнейОбработки (это в конфигурации УПП, БП2.0, Комплексная и т.п.) и ДополнительныеОтчетыИОбработки с реквизитом ХранилищеОбработки (это БП 3.0 и т.д.)
П.С. Если Вы используете запуск обработки через указанный путь к файлу, и если у пользователя, под которым запускается данное регламентное задание стоит галка Защита от опасных действий, то нужно: либо снять галку, либо зайти под данным пользователем и открыть указанный файл в базе, и дать согласие на открытие.
П.П.С. По умолчанию в форме Консоля заданий указано имя Регламентного задания мод_ВнешняяОбработка. Если же Вы в качестве имени в своей базе укажите какое-то другое, то имя можно поменять в Модуле объекта обработки ИмяРегламентногоЗаданияДоработка
П.П.П.С. Во внешней обработке, любого варианта, в Модуле объекта должна быть Экспортная процедура Выполнить задание, например:
Процедура ВыполнитьЗадание() Экспорт //Текст процедуры КонецПроцедуры