Процедура регламентного задания:
Процедура мод_ВнешняяОбработка(Код=Неопределено) Экспорт Если Код=Неопределено Тогда ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! Не правильно указан параметр '"+Код+"'", УровеньЖурналаРегистрации.Предупреждение); Иначе СсылкаНаВнешнююОбработку = Неопределено; Если СтрНайти(Код,"")>0 Тогда ДвоичныеДанные = Новый ДвоичныеДанные(Код); Если ДвоичныеДанные=Неопределено Тогда ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! Не получилось получить ДвоичныеДанные '"+Код+"'", УровеньЖурналаРегистрации.Ошибка); Возврат; КонецЕсли; Иначе Если НЕ Метаданные.Справочники.Найти("ВнешниеОбработки")=Неопределено Тогда ИмяМетаданного = "ВнешниеОбработки"; ИмяРеквизитыХранилища = "ХранилищеВнешнейОбработки"; ИначеЕсли НЕ Метаданные.Справочники.Найти("ДополнительныеОтчетыИОбработки")=Неопределено Тогда ИмяМетаданного = "ДополнительныеОтчетыИОбработки"; ИмяРеквизитыХранилища = "ХранилищеОбработки"; Иначе Возврат; КонецЕсли; Выполнить("СсылкаНаВнешнююОбработку = Справочники."+ИмяМетаданного+".НайтиПоКоду("""+Код+""");"); Если НЕ СсылкаНаВнешнююОбработку.Пустая() Тогда ДвоичныеДанные = СсылкаНаВнешнююОбработку[ИмяРеквизитыХранилища].Получить(); Иначе ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! В справочнике "+ИмяМетаданного+" не найдена обработка по коду '"+Код+"'", УровеньЖурналаРегистрации.Ошибка); Выполнить("СсылкаНаВнешнююОбработку = Справочники."+ИмяМетаданного+".НайтиПоНаименованию("""+Код+""",Истина);"); Если НЕ СсылкаНаВнешнююОбработку.Пустая() Тогда ДвоичныеДанные = СсылкаНаВнешнююОбработку[ИмяРеквизитыХранилища].Получить(); Иначе ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! В справочнике "+ИмяМетаданного+" не найдена обработка по наименованию '"+Код+"'", УровеньЖурналаРегистрации.Ошибка); Возврат; КонецЕсли; КонецЕсли; КонецЕсли; Попытка АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные); ИмяОбработки = ВнешниеОбработки.Подключить(АдресВоВременномХранилище, , Ложь); внОбработка = ВнешниеОбработки.Создать(ИмяОбработки); Попытка внОбработка.ВыполнитьЗадание(); Исключение ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! Внешняя обработка '"+СсылкаНаВнешнююОбработку+"' должна иметь в модуле экспортную процедуру 'ВыполнитьЗадание() Экспорт'", УровеньЖурналаРегистрации.Ошибка); КонецПопытки; Исключение ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! '"+ОписаниеОшибки()+"'", УровеньЖурналаРегистрации.Ошибка); КонецПопытки; КонецЕсли; КонецПроцедуры
Данный блок тестировался на конфигурациях: УПП 1.3.124.2, БП 3.0.67.43, БП 2.0.66.77 и будет работать в любой типовой и НЕ типовой конфигурации, при условии выбора файла в качестве внешней обработки.
Тип передаваемого параметра выявляется по наличию символа "", что означает путь к файлу, в противном случае ищется обработка по коду либо по имени обработки в справочнике.
В коде описано 2 вида справочника: ВнешниеОбработки с реквизитом ХранилищеВнешнейОбработки (это в конфигурации УПП, БП2.0, Комплексная и т.п.) и ДополнительныеОтчетыИОбработки с реквизитом ХранилищеОбработки (это БП 3.0 и т.д.)
П.С. Если Вы используете запуск обработки через указанный путь к файлу, и если у пользователя, под которым запускается данное регламентное задание стоит галка Защита от опасных действий, то нужно: либо снять галку, либо зайти под данным пользователем и открыть указанный файл в базе, и дать согласие на открытие.
П.П.С. По умолчанию в форме Консоля заданий указано имя Регламентного задания мод_ВнешняяОбработка. Если же Вы в качестве имени в своей базе укажите какое-то другое, то имя можно поменять в Модуле объекта обработки ИмяРегламентногоЗаданияДоработка
П.П.П.С. Во внешней обработке, любого варианта, в Модуле объекта должна быть Экспортная процедура Выполнить задание, например:
Процедура ВыполнитьЗадание() Экспорт //Текст процедуры КонецПроцедуры
За качественное оформление уже достойно плюса!
Спасибо.
Красиво, на заметку.
А можно выложить не только обработку, а архив с обработкой и картинками настройки (можно их и в doc оформить)?
(3) EmpireSer, а что Вам мешает сохранить картинки и составить инструкцию самим?
Несомненно полезно!
хорошая идея
Спасибо!
Пожалуйста =)
пользуйтесь на здоровье!
Только одно хочу добавить, во внешней обработке нужно создавать форму, обязательно. Иначе при подгрузке в во внешние обработки, будет ругаться.
хорошо оформлено, зачет! 🙂
И еще…учтите что при подвязке внешней обработки в регламентные задачи, в результате не отрабатываются некоторые команды, т.е. завершится с ошибкой!
Например:
Предупредить(), НайтиФайлы(), Вопрос(), вроде Сообщить() и т.п.
Это ограничение самой 1С, то что выполняется строго на клиенте.
Спасибо, реально полезная обработка. Удивительно что подобные очень удобные мелочи не включаются в стандарт системы…
спасибо автору за данный труд, забираю себе для работы
Спасибо автору за данную разработку. Очень интересная идея, попробую приобщить к своей работе.
Пользуйтесь с удовольствием!
Прост когда-то передо мной также стояла задача усовершенствовать фоновую задачу, менять параметры, добавлять некие условия. Каждый раз приходилось вмешиваться в конфигурацию, в результате родилась идея подключения внешней обработки.
Спасибо за идею и за работу. автор подскажите ваша обработка будет работать с УТ для украины типовой
Откуда на 12 скрине берется форма для добавления регламентного задания для внешней обработки?
(16) Alex1c, если внимательно всмотреться в скрины, то это обработка создается Вами, и загружается в базу, во внешние обработки.
Вроде подробные сканы, а вопросы остаются… =))
Свою обработку я с закрытыми глазами узнаю )) Речь идет о форме с заголовком «Новое регламентное задание» в которой предлагается выбрать внешнюю обработку и установить для нее расписание.
Попробовал сделать все по инструкции. Не работает. В журнале ошибка «Количество фактических параметров фонового задания не совпадает с количеством параметров метода фонового задания. «. Ошибка возникает при вызове общего модуля с параметрами. Если передача параметров не предусмотрена, модуль вызывается. В качестве параметра вы передаете код и затем ищете обработку по коду. Каким образом вы передаете параметр «код» в общий модуль?
С параметром так и не разобрался. Для своей задачи чуть упростил. Сделал два регламентных задания и соответственно два общих модуля. Одно задание выполняется раз в 10 минут, второе один раз в день. В общих модулях не используется поиск по передаваемому в параметре коду обработки, а выполняются соответственно все обработки из папки «Автомат 10 минут» и из папки «Автомат 1 день». Для генерации и отправки ежедневных отчетов папка «Автомат 1 день». Сколько в ней обработок , столько и будет рассылаться. Для синхронизации со сторонней базой вторая папка с более частым запуском. За идею плюс поставил ))
Большое спасибо за идею и экономию времени. Плюс.
Спасибо большое очень облегчит работу с заданиями.
(10)
Плюс за смекалку!
—
Вызов
на стороне сервера исключения не вызывает — просто игнорися.
Остальное верно для клиент-серверной базы, где задания крутятся на сервере 1С.
Для файловой базы задания крутятся в отдельной клиентской сессии, поэтому,
я полагаю, есть возможность использовать указанные «интерактивные» функции.
Правда более правомерно сказать «а кому это надо»?
У планировщика глаз нет!
🙂
(22)
мое замечание — только для обычного приложения!
в управляемом все более занятно
…
Из-за задницы с инкапсуляцией функционала для переиспользования:
Один из старых способов (еще с 8.0) — размещать функционал в модуле объекта
с доступом через Объект
Новый способ (появился в 8.2) — размещать функционал в модуле менеджера объекта
с доступом через МенеджерОбъекта
Ни то — ни другое на стороне клиента — НЕ ДОСТУПНО!
—
Поэтому приходится все выполнять на стороне сервера,
даже если обращение к базе данных не требуется.
🙂
Не совсем понял, откуда взялась форма регламентного задания, где можно указать, какую конкретно обработку запускать?
можете пояснить?
(24)+1 Я в (16) спрашивал, но ответ автора не пояснил вопрос
(25)обработка, которая создает регламентные задания, находится в файле статьи.
можешь скачать…..
(25) Alex1c, обработка добавления нового, или редактирования существующего фонового задания (только с прикрепленной внешней обработкой) прикреплена к данной статье.
Библиотека стандартных подсистем. Такая хорошая штука. И почему никто туда не смотрит?
Подсистема «Дополнительные отчеты и обработки»
Подсистема «Регламентные и фоновые задания»
Взял, да скопировал в свою конфу. И делов-то.
Как раз недавно избавлялись от создания временных файлов при создании внешних обработок в фоновых заданиях.
Получилось как-то так:
(0)
Пару лет назад сделал по другому, и никаких внешних обработок:
Универсальное регламентное задание
Часто такая задача возникает, когда нельзя менять конфигурацию.
http://infostart.ru/public/151693/
Для такого случая предложенное решение не подходит.
Мне больше понравилась оригинальная идея, предложенная в это статье
(29) zhloby3k, спасибо за подсказку! Подправил =)
Подскажите пожалуйста, как происходит заполнение параметра процедуры «мод_ВнешняяОбработка»?
(33) podzemelchik, присмотритесь повнимательнее к скрину 6.
Создается новая регламентная задача, и указывается процедура мод_ВнешняяОбработка.
В данную обработку передается Код элемента справочника Внешние обработки.
А как создать новую фоновую задачу, обработка во вложении.
Создала:Регл.задан -«мод_ВнешняяОбработка» и ОбщийМодуль-«мод_ОбщийМодуль»!
Закрепила обработку.( В модуле ______Процедура ВыполнитьЗадание() Экспорт)
Запустила «Регламентные и фон. задания»!
Фон.задания: Состояние= Задание выполнено
Но обработка не отработала! Хотя с формы по кнопке— отлично проходит!
Что может быть?
Хочется автору сказать спасибо! отпринтскринила все ! боюсь забыть где это . пишу сейчас обработку под регламент 🙂
Скорость выполнения фонового задания (для обычной обработки с экспортной процедурой ) была значительно ниже, чем вызов процедуру обработки bat файлом.
пример: