Регламентные/фоновые задачи с запуском внешней обработки подгруженной в справочник или указанного на диске файла (*.epf). Управляемые формы/Обычные формы











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

Процедура регламентного задания:

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

Данный блок тестировался на конфигурациях: УПП 1.3.124.2, БП 3.0.67.43, БП 2.0.66.77 и будет работать в любой типовой и НЕ типовой конфигурации, при условии выбора файла в качестве внешней обработки.

Тип передаваемого параметра выявляется по наличию символа "", что означает путь к файлу, в противном случае ищется обработка по коду либо по имени обработки в справочнике.

В коде описано 2 вида справочника: ВнешниеОбработки с реквизитом ХранилищеВнешнейОбработки (это в конфигурации УПП, БП2.0, Комплексная и т.п.) и ДополнительныеОтчетыИОбработки с реквизитом ХранилищеОбработки (это БП 3.0 и т.д.)

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

П.П.С. По умолчанию в форме Консоля заданий указано имя Регламентного задания мод_ВнешняяОбработка. Если же Вы в качестве имени в своей базе укажите какое-то другое, то имя можно поменять в Модуле объекта обработки ИмяРегламентногоЗаданияДоработка

П.П.П.С. Во внешней обработке, любого варианта, в Модуле объекта должна быть Экспортная процедура Выполнить задание, например:  

Процедура ВыполнитьЗадание() Экспорт
//Текст процедуры
КонецПроцедуры

37 Comments

  1. gucci76

    За качественное оформление уже достойно плюса!

    Спасибо.

    Reply
  2. bobaG

    Красиво, на заметку.

    Reply
  3. EmpireSer

    А можно выложить не только обработку, а архив с обработкой и картинками настройки (можно их и в doc оформить)?

    Reply
  4. iones

    (3) EmpireSer, а что Вам мешает сохранить картинки и составить инструкцию самим?

    Reply
  5. vladismi

    Несомненно полезно!

    Reply
  6. alexey_1c

    хорошая идея

    Reply
  7. fishca

    Спасибо!

    Reply
  8. iones

    Пожалуйста =)

    пользуйтесь на здоровье!

    Только одно хочу добавить, во внешней обработке нужно создавать форму, обязательно. Иначе при подгрузке в во внешние обработки, будет ругаться.

    Reply
  9. Raminus

    хорошо оформлено, зачет! 🙂

    Reply
  10. iones

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

    Например:

    Предупредить(), НайтиФайлы(), Вопрос(), вроде Сообщить() и т.п.

    Это ограничение самой 1С, то что выполняется строго на клиенте.

    Reply
  11. Кебабыч

    Спасибо, реально полезная обработка. Удивительно что подобные очень удобные мелочи не включаются в стандарт системы…

    Reply
  12. TrinitronOTV

    спасибо автору за данный труд, забираю себе для работы

    Reply
  13. isn

    Спасибо автору за данную разработку. Очень интересная идея, попробую приобщить к своей работе.

    Reply
  14. iones

    Пользуйтесь с удовольствием!

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

    Reply
  15. dyak84

    Спасибо за идею и за работу. автор подскажите ваша обработка будет работать с УТ для украины типовой

    Reply
  16. Alex1c

    Откуда на 12 скрине берется форма для добавления регламентного задания для внешней обработки?

    Reply
  17. iones

    (16) Alex1c, если внимательно всмотреться в скрины, то это обработка создается Вами, и загружается в базу, во внешние обработки.

    Вроде подробные сканы, а вопросы остаются… =))

    Reply
  18. Alex1c

    Свою обработку я с закрытыми глазами узнаю )) Речь идет о форме с заголовком «Новое регламентное задание» в которой предлагается выбрать внешнюю обработку и установить для нее расписание.

    Попробовал сделать все по инструкции. Не работает. В журнале ошибка «Количество фактических параметров фонового задания не совпадает с количеством параметров метода фонового задания. «. Ошибка возникает при вызове общего модуля с параметрами. Если передача параметров не предусмотрена, модуль вызывается. В качестве параметра вы передаете код и затем ищете обработку по коду. Каким образом вы передаете параметр «код» в общий модуль?

    Reply
  19. Alex1c

    С параметром так и не разобрался. Для своей задачи чуть упростил. Сделал два регламентных задания и соответственно два общих модуля. Одно задание выполняется раз в 10 минут, второе один раз в день. В общих модулях не используется поиск по передаваемому в параметре коду обработки, а выполняются соответственно все обработки из папки «Автомат 10 минут» и из папки «Автомат 1 день». Для генерации и отправки ежедневных отчетов папка «Автомат 1 день». Сколько в ней обработок , столько и будет рассылаться. Для синхронизации со сторонней базой вторая папка с более частым запуском. За идею плюс поставил ))

    Reply
  20. eaKozlova

    Большое спасибо за идею и экономию времени. Плюс.

    Reply
  21. irbush

    Спасибо большое очень облегчит работу с заданиями.

    Reply
  22. yuraos

    (10)

    Плюс за смекалку!



    Вызов

     Сообщить()

    на стороне сервера исключения не вызывает — просто игнорися.

    Остальное верно для клиент-серверной базы, где задания крутятся на сервере 1С.

    Для файловой базы задания крутятся в отдельной клиентской сессии, поэтому,

    я полагаю, есть возможность использовать указанные «интерактивные» функции.

    Правда более правомерно сказать «а кому это надо»?

    У планировщика глаз нет!

    🙂

    Reply
  23. yuraos

    (22)

    мое замечание — только для обычного приложения!

    в управляемом все более занятно



    Из-за задницы с инкапсуляцией функционала для переиспользования:

    Один из старых способов (еще с 8.0) — размещать функционал в модуле объекта

    с доступом через Объект

    Новый способ (появился в 8.2) — размещать функционал в модуле менеджера объекта

    с доступом через МенеджерОбъекта

    Ни то — ни другое на стороне клиента — НЕ ДОСТУПНО!



    Поэтому приходится все выполнять на стороне сервера,

    даже если обращение к базе данных не требуется.

    🙂

    Reply
  24. SpartakM

    Не совсем понял, откуда взялась форма регламентного задания, где можно указать, какую конкретно обработку запускать?

    можете пояснить?

    Reply
  25. Alex1c

    (24)+1 Я в (16) спрашивал, но ответ автора не пояснил вопрос

    Reply
  26. SpartakM

    (25)обработка, которая создает регламентные задания, находится в файле статьи.

    можешь скачать…..

    Reply
  27. iones

    (25) Alex1c, обработка добавления нового, или редактирования существующего фонового задания (только с прикрепленной внешней обработкой) прикреплена к данной статье.

    Reply
  28. kser87

    Библиотека стандартных подсистем. Такая хорошая штука. И почему никто туда не смотрит?

    Подсистема «Дополнительные отчеты и обработки»

    Подсистема «Регламентные и фоновые задания»

    Взял, да скопировал в свою конфу. И делов-то.

    Reply
  29. zhloby3k

    Как раз недавно избавлялись от создания временных файлов при создании внешних обработок в фоновых заданиях.

    Получилось как-то так:

    НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(СсылкаНаВнешнююОбработку, «ХранилищеОбработки»);
    ИмяОбработки = ВнешниеОбработки.Подключить(НавигационнаяСсылка, Имя, Ложь);
    
    ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяОбработки);
    ВнешняяОбработка.ОбработатьУведомление(Источник, СсылкаНаВнешнююОбработку);
    
    Reply
  30. Abadonna

    (0)

    Каждый раз лезть в конфигуратор, и вручную добавлять новое регламентное задание, как-то не удобно.

    Пару лет назад сделал по другому, и никаких внешних обработок:

    Универсальное регламентное задание

    Reply
  31. Lemkus

    Часто такая задача возникает, когда нельзя менять конфигурацию.

    Для такого случая предложенное решение не подходит.

    Мне больше понравилась оригинальная идея, предложенная в это статье http://infostart.ru/public/151693/

    Reply
  32. iones

    (29) zhloby3k, спасибо за подсказку! Подправил =)

    Reply
  33. podzemelchik

    Подскажите пожалуйста, как происходит заполнение параметра процедуры «мод_ВнешняяОбработка»?

    Reply
  34. iones

    (33) podzemelchik, присмотритесь повнимательнее к скрину 6.

    Создается новая регламентная задача, и указывается процедура мод_ВнешняяОбработка.

    В данную обработку передается Код элемента справочника Внешние обработки.

    А как создать новую фоновую задачу, обработка во вложении.

    Reply
  35. Белка13

    Создала:Регл.задан -«мод_ВнешняяОбработка» и ОбщийМодуль-«мод_ОбщийМодуль»!

    Закрепила обработку.( В модуле ______Процедура ВыполнитьЗадание() Экспорт)

    Запустила «Регламентные и фон. задания»!

    Фон.задания: Состояние= Задание выполнено

    Но обработка не отработала! Хотя с формы по кнопке— отлично проходит!

    Что может быть?

    Reply
  36. natarezn

    Хочется автору сказать спасибо! отпринтскринила все ! боюсь забыть где это . пишу сейчас обработку под регламент 🙂

    Reply
  37. Светлый ум

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

    пример:

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *