1с создание регламентного задания из внешней обработки
Эта статья появилась в результате решения интересной задачи. Мы захотели поделиться опытом. Итак задача: нужно запускать по регламенту существующую уже обработку Выгрузка данных и загрузка данных в формате XML с определенными параметрами, но так, чтобы не менять типовую конфигурацию. Она могла бы называться «Программный запуск внешних обработок по регламенту в 1С 8.3».
Считаю, что всю информацию по данной теме нужно собрать в одном месте.
Для реализации задачи было принято решение написать внешнюю обработку 1С для запуска типовой обработки и настроить ее как фоновое задание. Кому-то может хватить и этой информации, а подробности для остальных будут ниже.
Чтобы не возникло путаницы, далее будем называть Главной обработкой ту, которую планируем запускать с помощью регламентной, а Фоновой обработкой ту, которая будет выполнять функцию регламентного задания для запуска Главной обработки.
Первым делом готовим Главную обработку. Все функции, которые вы планируете использовать при запуске Главной обработки в фоне, должны быть экспортными и должны находиться в модуле объекта данной Главной обработки.
Затем создаем Фоновую внешнюю обработку, которая будет работать как регламентное задание. Для этого в Сведениях о внешней обработке указываем следующий код:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.5.71");
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); ПараметрыРегистрации.Вставить("Наименование", "Автоматическая выгрузка XML");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Информация", "Автоматическая выгрузка XML");
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление=НСтр("ru = 'Автоматическая выгрузка XML'");
НоваяКоманда.Идентификатор="АвтоматическаяВыгрузкаХМЛ";
НоваяКоманда.Использование="ВызовСерверногоМетода";
НоваяКоманда.ПоказыватьОповещение=Истина;
НоваяКоманда.Модификатор="";
Возврат ПараметрыРегистрации;
КонецФункции
Важно чтобы в функции СведенияОВнешнейОбработке не было команды НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Эта команда не позволит использовать внешнюю обработку 1С как регламентное задание.
Далее создаем в модуле объекта Фоновой обработки процедуру ВыполнитьКоманду(Идентификатор, ОбъектыНазначения) Экспорт
В таком варианте обработки не нужно добавлять никаких форм.
Далее есть два варианта вызова Главной обработки.
1. Как запустить вручную обработку
Если вы планируете прикрепить свою Главную обработку к конфигурации, тогда в Фоновой обработке в функции ВыполнитьКоманду можно использовать указанный ниже вызов Главной обработки:
ВнешняяОбработка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Выгрузка и загрузка данных XML");
ДвоичныеДанные = ВнешняяОбработка.ХранилищеОбработки.Получить();
ИмяВременногоФайла = КаталогВременныхФайлов()+"ОбработкаХМЛ.epf";
ДвоичныеДанные.Записать(ИмяВременногоФайла);
СтруктураЗащита=новый ОписаниеЗащитыОтОпасныхДействий;
СтруктураЗащита.ПредупреждатьОбОпасныхДействиях=ложь;
//Создаем структуру защиты от опасных действий
Обработка = ВнешниеОбработки.Создать(ИмяВременногоФайла,Ложь,СтруктураЗащита);
Обработка.Инициализация();
Это ответ на вопрос как запустить вручную.
2. Обработка из файла
Если вы планируете запускать внешнюю обработку из файла, тогда можно использовать такой код:
АдресХранилища = "";
СтруктураЗащита=новый ОписаниеЗащитыОтОпасныхДействий;
СтруктураЗащита.ПредупреждатьОбОпасныхДействиях=ложь;
Обработка = ВнешниеОбработки.Создать("\\192.168./ваш ip/\Выгрузка и загрузка данных XML_3_0.epf",ложь,СтруктураЗащита);
Обработка.Инициализация();
Очень важно при запуске из файла указать и задать полный путь к файлу. Также важно чтобы папка, в которой будет храниться Главная обработка, была доступна по сети. Все дело в том, что фоновое задание будет выполняться на сервере. Если настроена клиент-серверная система работы, у сервера может не быть доступа к тем папкам, к которым есть доступ у клиента и у пользователя с его локальной машины. Также и при указании локальных папок, к примеру, «С:\имяГлавнойОбработки.epf» - можно получить ошибку, потому что у сервера может быть свой диск С, на котором он и будет искать папку при запуске Фоновой обработки. Поэтому лучше конкретизировать путь с указанием ip-адреса.
Также очень важно при создании обработки ставить параметр ПредупреждатьОбОпасныхДействиях в значение ложь. Далее скажу об этом подробнее.
После нужно подключить Фоновую обработку и настроить ее выполнение в фоне
После можно найти свою внешнюю обработку в списке Регламентный заданий. Для этого нужно открыть Администрирование – Обслуживание - Регламентные операции - Регламентные и фоновые задания.
И здесь, в списке фоновых заданий, иногда можно получить ошибку такого вида:
Предупреждение безопасности
Открывается "Выгрузка и загрузка данных XML" из файла "C:\Users\tempout\AppData\Local\Temp\ОбработкаХМЛ.epf".
Рекомендуется обращать внимание на источник, из которого был получен данный файл. Если с источником нет договоренности о разработке дополнительных модулей или есть сомнения в содержимом файла, то его не рекомендуется открывать, поскольку это может нанести вред компьютеру и данным.
Разрешить открывать данный файл?
Мы поставили параметр ПредупреждатьОбОпасныхДействиях в значение ложь для Главной обработки программно. Для Фоновой обработки нужно сделать следующее:
1) Указать в регламентном задании пользователя с полными правами можно и с правом на открытие внешних обработок, если это предусмотрено конфигурацией.
2) Снять у выбранного пользователя галку «Защита от опасных действий» в конфигураторе.
Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.
Если у Вас возник вопрос, как можно вообще напортачить с регламентными заданиями? Почитайте живые примеры из статьи -> Велостыли: Регламентные задания
Для экспериментов я использовал Платформы 8.3.10.2650 и 8.3.12.1412 , конфигурации БСП 2.4.6.56 и 3.0.1.127.
Устанавливаем демо конфигурацию БСП и поехали! Работать будем со Справочником «Заметки». У него есть реквизит Содержание с типом ХранилищеЗначения, а это значит, туда много, что записать можно, ну и присутствуют другие реквизиты, с которыми тоже поработаем.
Задачи и решения.
Задача 1. Создать с помощью регламента новый элемент справочника Заметки и записать в реквизит содержание «Заметка создана регламентом в Время создания»
Создаем внешнюю обработку, назовем ее, например, «БСП_ДО_Регламенты»
Добавляем код в модуль:
Сохраняем обработку и добавляем ее в нашу конфигурацию для тестов БСП демо.
Моя настройка: C 6 мая 2018 г. каждый день; по 23:59:59 каждые 60 секунд.
Записываем и проверяем.
Вот так просто можно добавить регламент, не изменяя типовой конфигурации. Когда-нибудь РЗ возможно можно будет добавлять через расширение, а пока можно использовать БСП.
Задача 2. В созданную нами дополнительную обработку необходимо добавить форму с возможностью ручного запуска регламентного задания. При этом в содержание надо писать создана заметка вручную или по регламенту.
Меняем код в модуле обработки:
Добавляем форм у и создаем команду «Задание2»
Записываем и заменяем предыдущую дополнительную обработку на эту.
Задача 3. Создать второе регламентное задание и сделать так, чтобы можно было сохранять параметры настроек, текст содержания и цвет (Пометка). При выполнении заданий параметры заполняют элемент справочника «Заметки». Ранее созданная кнопка должна запускать выбранное задание.
Редактируем функцию СведенияОВнешнейОбработке в модуле обработки. Добавляем второе регламентное задание.
К модулю вернемся позже. Переходим к редактированию формы.
Создаем параметр формы "ДополнительнаяОбработкаСсылка" с типом "СправочникСсылка.ДополнительныеОтчетыИОбработки"
Создаем реквизиты формы.
" РегламентноеЗаданиеСписок " с типом " Строка "
"СписокРЗ" с типом "ТаблицаЗначений"
-"КлючРЗ" с типом "Строка"
-"ТекстСодержания" с типом "Строка"
-"Пометка" с типом "ПеречислениеСсылка.ЦветаЗаметок"
Переименовываем команду «Задание2» в команду «ВыполнитьРЗ», соответственно процедуру тоже приводим к такому имени.
Создаем команду «ЗаписатьИзменения»
Форму делаем вот такого вида
Подготовительные работы выполнены, переходим к программированию.
Список для списка РЗ и ключи РЗ будем брать из модуля обработки, из функции СведенияОВнешнейОбработке она Экспортная. Нас интересуют все команды где Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Дальше мы будем считывать параметры, сохраненные в обработке Хранить их будем в ХранилищеНастроек
Для того чтобы делать меньше телодвижений в модуле обработки пропишем структуру для чистых настроек, для этого создадим экспортную функцию ПолучитьЧистуюСтруктуруНастроек
Создаем процедуру ПриСозданииНаСервере
Создаем процедуру для команды «ЗаписатьИзменения»
Изменяем процедуру для команды «ВыполнитьРЗ»
Изменяем в модуле обработки процедуру «ВыполнитьКоманду»
и процедуру « СоздатьНовыйЭлементСправочникаЗаметки »
Записываем и заменяем предыдущую дополнительную обработку на эту.
Проверяем ручной запуск и регламеты
В коде можно было бы проверки вынести в одну процедуру\функцию. Как вы видите просто безграничные возможности предоставлены программистам по разработке сложных регламентов без доработки конфигурации.
Отладку регламентов можно проводить по описанию из этой статьи Отладка подключаемых обработок
Корректную отладку запуска из формы можно производить после того как в Параметры.ДополнительнаяОбработкаСсылка будет закинута ссылка на добавленную дополнительную обработкую. В нашем случае, достаточно просто в процедуру формы "ПриСозданииНаСервере" добавить одну строчку.
UPD 27.07.2019. Добавил файлы (Одна обработка несколько форм Файлы.rar) к статье БСП: Дополнительные отчеты и обработки - одна обработка несколько форм
Механизм, о котором пойдет речь ниже, позволяет гибко и оперативно создавать и настраивать регламентные задания без запуска конфигуратора. Это действенный инструмент, которого порой просто не хватает под рукой.
Предлагаю рассмотреть один из способов реализации такого иснструмента собственными руками. Для тех же, у кого нет времени на болтовню автора статьи и/или же механизм нужен уже сейчас, прошу к скачиванию :)
И пока коллеги со второй категории скачивают обработку, мы ее напишем :)
1. Создать регламентное задание с названием "ВыполнениеОбработки".
2. В качестве исполнительного метода регламентного задания указать метод ВыполнениеОбработки() из общего модуля МодульРегламентныхЗаданий (или любого другого общего модуля с такими же настройками свойств). Описать логику работы метода.
3. Написать обработку, которая будет программно создавать экземпляры регламентного задания с заданными параметрами.
Важно!
Любое регламентное задание имеет такое свойство как Параметры. Это Массив, назначение которого очевидно - хранение параметров, которые передаются на вход исполнительного метода регламентного задания. Более детально можно прочесть в синтаксис помощнике. Отметим только, что устанавливаются параметры регламентного задания только программно. Также следует помнить, что количество и состав параметров должны соответствовать параметрам метода регламентного задания.
Приступим.
Первым делом, создадим регламентное задание. Укажем исполнительный метод. Опишем его логику работы исходя из следующих условий
- Регламентное задание должно уметь запускать как внешние, так и встроенные обработки.
- Уметь передавать входящие параметры (первоначальные настройки) обработке на выполнение.
- Логировать все свои действия в журнал регистрации
Первым параметром метода регламентного задания укажем ключ обработки. Он понадобится нам для идентификации обработки, которую нужно запустить на выполнение. В случае с внешней обработкой - это будет ее код из справочника "Внешние обработки", в случае со встроенной - имя из дерева метаданных. Второй параметр метода регламентного задания - произвольные настройки, которые хранятся в объекте с типом ХранилищеЗначения.
Теперь опишем обработку, которая будет создавать экземпляры выше описанного регламентного задания.
Как все работает изнутри, лучше всего расскажет программный код исполнительной процедуры (обработчик нажатия на кнопку "Запустить регламентное задание").
После всего проделанного, любая обработка может быть запущена регламентным заданием. Для этого ей достаточно в модуле объекта содержать экспортную процедуру ВыполнитьЗадание().
Оставляйте свои вопросы и предложения по улучшению функциональности механизма в комментариях.
Поскольку в интернете нет (либо я не нашел/плохо искал) нигде полноценного описания создания регламентных задач на расширении (только на нем, без всяких внешних обработок), то решил поделиться своим опытом создания механизма для типовых конфигураций от начала до конца.
Структура хранения данных следующая:
1. В качестве объекта конфигурации, где мы будем плодить виды регламентных задач, выбрано одноименное перечисление, в котором у нас будут храниться виды регламентных заданий с их названиями
2. Для хранения настроек данного регламентного задания мы возьмем одноименный регистр сведений
Измерением выступает регламентное задание - ссылка на наше перечисление
Ресурсами: Использование (булево) - переключатель который отвечает за собственно работу регламентного задания
Расписание (ХранилищеЗначений) - информация о расписании выполнения регламентного задания (необязательно)
Идентификатор (Уникальный идентификатор) - Здесь сидит идентификатор самой регламентной задачи, которая была сгенерирована в момент записи в данном регистре. Вот этот реквизит по хорошему самый ВАЖНЫЙ здесь
3. Теперь собственно самое интересное: как уже выяснили выше, при записи в данном регистре у нас должно появляться новое регламентное задание. Для того чтоб это произошло, необходимо немного пописать, или хотя бы скопипастить
Прочитав код, вы наверняка догадались, что мы прикручиваемся к стандартному регламентному заданию "ЗапускДополнительныхОбработок", так как по смыслу оно ближе всех к нашей задаче из всей БСП. А также увидели, что здесь у нас создается регламентное задание, из которого Идентификатор присваивается нашему регистру для того, чтобы при дальнейшей перезаписи у нас изменялось созданное регламентное задание, а не генерировалось новое.
5. Следующим шагом нам надо в расширении подменить типовую процедуру, которая вызывается при запуске нашей регламентной задачи, для этого в модуле ДополнительныеОтчетыИОбработки с помощью расширения подменяем процедуру ВыполнитьОбработкуПоРегламентномуЗаданию:
Каждый раз, соответственно, дополняя очередную регламентную задачу в перечислении, здесь необходимо тоже будет добавить ссылку на свою процедуру.
6. Для удобства я использовал отдельную подсистему в расширении, чтоб вывести туда кнопку для настройки регламентных задач:
На форме записи регистра можно сразу управлять расписанием выполнения задачи в пользовательском режиме. Как сделать диалог расписания, расписывать здесь уже не буду, так как наверняка есть множество тем на этот счет, не является обязательным для работоспособности, да и не относится это к теме
На выходе соответственно мы можем управлять нашим регламентным заданием в стандартной обработке:
Разработка велась на УТ11.5 (БСП 3.1.3.548), но думаю что подойдет для любой актуальной базы на БСП
В приложенном файле вы увидите рабочий вариант расширения с регламентной задачей из статьи, который (или с которым) можно накатить, в том числе, на свое расширение, сохранив себе от полудня времени и нервов, в зависимости от Вашей квалификации.
Спасибо за внимание! И надеюсь, что в скором времени мы увидим полноценный типовой функционал регламентных задач в расширениях, без всяких обходных путей =)
upd: В версии 1.1.5.1 расширения
- при копировании записи в регистре ЛР_ПараметрыРегламентныхЗаданий не обнулялся идентификатор регламентного задания, в связи с чем новая настройка была связана со старой регламентной задачей - исправлено
- при удалении записи из регистра ЛР_ПараметрыРегламентныхЗаданий не удалялась запись из регламентных заданий информационной базы - исправлено
Эта статья появилась в результате решения интересной задачи. Мы захотели поделиться опытом. Итак задача: нужно запускать по регламенту существующую уже обработку Выгрузка данных и загрузка данных в формате XML с определенными параметрами, но так, чтобы не менять типовую конфигурацию. Она могла бы называться «Программный запуск внешних обработок по регламенту в 1С 8.3».
Считаю, что всю информацию по данной теме нужно собрать в одном месте.
Для реализации задачи было принято решение написать внешнюю обработку 1С для запуска типовой обработки и настроить ее как фоновое задание. Кому-то может хватить и этой информации, а подробности для остальных будут ниже.
Чтобы не возникло путаницы, далее будем называть Главной обработкой ту, которую планируем запускать с помощью регламентной, а Фоновой обработкой ту, которая будет выполнять функцию регламентного задания для запуска Главной обработки.
Первым делом готовим Главную обработку. Все функции, которые вы планируете использовать при запуске Главной обработки в фоне, должны быть экспортными и должны находиться в модуле объекта данной Главной обработки.
Затем создаем Фоновую внешнюю обработку, которая будет работать как регламентное задание. Для этого в Сведениях о внешней обработке указываем следующий код:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.5.71");
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); ПараметрыРегистрации.Вставить("Наименование", "Автоматическая выгрузка XML");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Информация", "Автоматическая выгрузка XML");
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление=НСтр("ru = 'Автоматическая выгрузка XML'");
НоваяКоманда.Идентификатор="АвтоматическаяВыгрузкаХМЛ";
НоваяКоманда.Использование="ВызовСерверногоМетода";
НоваяКоманда.ПоказыватьОповещение=Истина;
НоваяКоманда.Модификатор="";
Возврат ПараметрыРегистрации;
КонецФункции
Важно чтобы в функции СведенияОВнешнейОбработке не было команды НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Эта команда не позволит использовать внешнюю обработку 1С как регламентное задание.
Далее создаем в модуле объекта Фоновой обработки процедуру ВыполнитьКоманду(Идентификатор, ОбъектыНазначения) Экспорт
В таком варианте обработки не нужно добавлять никаких форм.
Далее есть два варианта вызова Главной обработки.
1. Как запустить вручную обработку
Если вы планируете прикрепить свою Главную обработку к конфигурации, тогда в Фоновой обработке в функции ВыполнитьКоманду можно использовать указанный ниже вызов Главной обработки:
ВнешняяОбработка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Выгрузка и загрузка данных XML");
ДвоичныеДанные = ВнешняяОбработка.ХранилищеОбработки.Получить();
ИмяВременногоФайла = КаталогВременныхФайлов()+"ОбработкаХМЛ.epf";
ДвоичныеДанные.Записать(ИмяВременногоФайла);
СтруктураЗащита=новый ОписаниеЗащитыОтОпасныхДействий;
СтруктураЗащита.ПредупреждатьОбОпасныхДействиях=ложь;
//Создаем структуру защиты от опасных действий
Обработка = ВнешниеОбработки.Создать(ИмяВременногоФайла,Ложь,СтруктураЗащита);
Обработка.Инициализация();
Это ответ на вопрос как запустить вручную.
2. Обработка из файла
Если вы планируете запускать внешнюю обработку из файла, тогда можно использовать такой код:
АдресХранилища = "";
СтруктураЗащита=новый ОписаниеЗащитыОтОпасныхДействий;
СтруктураЗащита.ПредупреждатьОбОпасныхДействиях=ложь;
Обработка = ВнешниеОбработки.Создать("\\192.168./ваш ip/\Выгрузка и загрузка данных XML_3_0.epf",ложь,СтруктураЗащита);
Обработка.Инициализация();
Очень важно при запуске из файла указать и задать полный путь к файлу. Также важно чтобы папка, в которой будет храниться Главная обработка, была доступна по сети. Все дело в том, что фоновое задание будет выполняться на сервере. Если настроена клиент-серверная система работы, у сервера может не быть доступа к тем папкам, к которым есть доступ у клиента и у пользователя с его локальной машины. Также и при указании локальных папок, к примеру, «С:\имяГлавнойОбработки.epf» - можно получить ошибку, потому что у сервера может быть свой диск С, на котором он и будет искать папку при запуске Фоновой обработки. Поэтому лучше конкретизировать путь с указанием ip-адреса.
Также очень важно при создании обработки ставить параметр ПредупреждатьОбОпасныхДействиях в значение ложь. Далее скажу об этом подробнее.
После нужно подключить Фоновую обработку и настроить ее выполнение в фоне
После можно найти свою внешнюю обработку в списке Регламентный заданий. Для этого нужно открыть Администрирование – Обслуживание - Регламентные операции - Регламентные и фоновые задания.
И здесь, в списке фоновых заданий, иногда можно получить ошибку такого вида:
Предупреждение безопасности
Открывается "Выгрузка и загрузка данных XML" из файла "C:\Users\tempout\AppData\Local\Temp\ОбработкаХМЛ.epf".
Рекомендуется обращать внимание на источник, из которого был получен данный файл. Если с источником нет договоренности о разработке дополнительных модулей или есть сомнения в содержимом файла, то его не рекомендуется открывать, поскольку это может нанести вред компьютеру и данным.
Разрешить открывать данный файл?
Мы поставили параметр ПредупреждатьОбОпасныхДействиях в значение ложь для Главной обработки программно. Для Фоновой обработки нужно сделать следующее:
1) Указать в регламентном задании пользователя с полными правами можно и с правом на открытие внешних обработок, если это предусмотрено конфигурацией.
2) Снять у выбранного пользователя галку «Защита от опасных действий» в конфигураторе.
Читайте также: