1с внешняя обработка как регламентное задание
Перейти к содержимому

1с внешняя обработка как регламентное задание

  • автор:

1с внешняя обработка как регламентное задание

В процессе использования учётной системы на базе 1С:Предприятие иногда возникает необходимость выполнять какую-то однотипную операцию через определённые промежутки времени.

В системе 1С:Предприятие есть объект, позволяющий решать такие задачи. Это объект «Регламентное задание». Мы можем создать его и настроить под свои потребности. Однако, когда мы имеем дело с типовыми конфигурациями 1С, находящимися на поддержке, создание дополнительного регламентного задания повлечёт за собой невозможность обновления системы в автоматическом режиме.

Выход: сделать внешнюю обработку с возможностью запускать её по расписанию.

Возможность запускать внешнюю обработку по расписанию задаётся в модуле объекта внешней обработки. А именно в теле функции СведенияОВнешнейОбработке () .

Существует три варианта запуска внешней обработки:

  • Открытие формы
  • Вызов серверного метода
  • Вызов клиентского метода

Задаётся вариант запуска в параметрах процедуры ДобавитьКоманду () .

Настраивать расписание можно только для обработок с режимом запуска «Вызов серверного метода» и «Вызов клиентского метода».

Вариант «Вызов серверного метода» означает, что будет вызвана процедура, размещённая в модуле объекта внешней обработки.
Вариант «Вызов клиентского метода» означает, что будет вызвана процедура, размещённая в модуле формы внешней обработки.

Код в модуле объекта внешней обработки:

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

После добавления обработки в систему 1С:Предприятие через механизм подключения внешних обработок, станет доступной настройка расписания.

Регламентное задание

Есть некоторая обработка на УФ, которая выполняет алгоритм при нажатии кнопки на клиенте,
то есть вызывается процедура, находящаяся в общем модуле с флажком Клиент.

Подскажите пож, можно ли сделать регламентное задание, на основании кода этой обработки?
То есть вызвать код на клиенте?

(4) не совсем понял..

&НаКлиенте
Процедура ВыполнитьОбмен() Экспорт
ИнтеграцияКлиент.ВыполнитьОбмен();
КонецПроцедуры

хотелось бы — это уже в модуле обработки для регламентного задания

Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
Если ИдентификаторКоманды = "ОбменФоновая" Тогда
ИнтеграцияКлиент.ВыполнитьОбмен(); — вот тут естественно ошибка
КонецЕсли;
КонецПроцедуры

<ВнешняяОбработка.Обмен.МодульОбъекта(59,3)>: Переменная не определена (ИнтеграцияКлиент)
<<?>>ИнтеграцияКлиент.ВыполнитьОбмен(); (Проверка: Сервер)

для модуля ИнтеграцияКлиент
поставил флажок Сервер.. вроде как прошло, но выдалось сообщение в другом месте

Обработчик = Новый ОписаниеОповещения("ПодготовитьСообщенияКПередачеПодтверждениеПроведения", ИнтеграцияСлужебныйКлиент, Контекст);

сейчас по кнопке

&НаКлиенте
Процедура ВыполнитьОбмен(Команда)
ИнтеграцияКлиент.ВыполнитьОбмен();
КонецПроцедуры

мне надо вместо этого написать то, что есть в ИнтеграцияКлиент.ВыполнитьОбмен(), то есть что в ней

Процедура ВыполнитьОбмен(Организация = Неопределено, МестоДеятельности = Неопределено, ОповещениеПриЗавершении = Неопределено) Экспорт

ДанныеДляВыполненияОбменаНаКлиенте = ИнтеграцияВызовСервера.ВыполнитьОбмен(Организация, МестоДеятельности);

ИнтеграцияСлужебныйКлиент.ОбработатьОчередьПередачиДанных(
ДанныеДляВыполненияОбменаНаКлиенте,
ОповещениеПриЗавершении);

(23) я и делал аналогично..

в СведенияОВнешнейОбработке написал

ДобавитьКоманду(Команды, "Обмен (фоновая)", "ОбменФоновая", "ВызовКлиентскогоМетода", Истина, "");

Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
Если ИдентификаторКоманды = "ОбменФоновая" Тогда
ВыполнитьОбмен(); — вот эта находится в модуле формы и ее не видит
КонецЕсли;
КонецПроцедуры

&НаСервере // не видит он с сервака твоих клиентских процедур

Процедура ВыполнитьОбмен(Команда)
ИнтеграцияКлиент.ВыполнитьОбмен();
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьОбменКлиент(Команда)
ВыполнитьОбменКлиентСервер();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьОбменКлиентСервер()
ИнтеграцияКлиент.ВыполнитьОбмен();
КонецПроцедуры

Но в описании сказано:

Вариант "Вызов клиентского метода" означает, что будет вызвана процедура, размещённая в модуле формы внешней обработки.

(26) и так я писал, но ИнтеграцияКлиент — он на клиенте.. если только у него флажок поставить Сервер

Сейчас напишу как сделал.

1 в СведенияОВнешнейОбработке() пишем
ДобавитьКоманду(Команды, "Обмен (фоновая)", "ОбменФоновая", "ВызовКлиентскогоМетода", Ложь, "");

2 в модуле формы

&НаКлиенте
Процедура ВыполнитьОбмен(Команда)
ВыполнитьОбменНаКлиенте();
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
Если ИдентификаторКоманды = "ОбменФоновая" Тогда
ВыполнитьОбменНаКлиенте();
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьОбменНаКлиенте()
ИнтеграцияКлиент.ВыполнитьОбмен();
КонецПроцедуры

а я писал в модуле объекта..

в итоге фоновое задание срабатывает, но настроить расписание нельзя, так как
"Неприменимо для команд с вариантом запуска "Вызов клиентского метода"

вот теперь второй вопрос, как заставить все это работать каждые 5 минут :).

Надо сделать регламентное задание по расписанию.
Для этого необходимо что бы вызов был на сервере — это сделал.

Алгоритм уже работает, но на клиенте.

Вот надо как это это соеденить.

Не хотелось бы вызывать конечно 1с с вызовом внешней обработкой.

ВозвращаемоеЗначение = Новый Структура;
ВозвращаемоеЗначение.Вставить("Изменения" , Новый Массив);
ВозвращаемоеЗначение.Вставить("СообщенияКПередаче" , Новый Массив);
ВозвращаемоеЗначение.Вставить("НастройкиОбмена" , Новый Соответствие);
ВозвращаемоеЗначение.Вставить("РегистраторыВыбытия" , Новый Соответствие);
ВозвращаемоеЗначение.Вставить("ВыполнитьОбменПоРасписанию", Ложь);

НастройкиОбмена = НастройкиОбмена(Организация, МестоДеятельности, ДатыПоследнегоЗапуска);

ВозвращаемоеЗначение.НастройкиОбмена = НастройкиОбмена.ОбменНаКлиенте;
ВозвращаемоеЗначение.РегистраторыВыбытия = НастройкиОбмена.РегистраторыВыбытия;
//ВозвращаемоеЗначение.ВыполнитьОбменПоРасписанию =
// ДатыПоследнегоЗапуска <> Неопределено
// И НастройкиОбмена.ОбменНаКлиенте.Количество() > 0;

РезультатОбработкиОчереди = ОбработатьОчередьПередачиДанных(НастройкиОбмена);
Для Каждого ЭлементДанных Из РезультатОбработкиОчереди.Изменения Цикл
ВозвращаемоеЗначение.Изменения.Добавить(ЭлементДанных);
КонецЦикла;
Для Каждого ЭлементДанных Из РезультатОбработкиОчереди.СообщенияКПередаче Цикл
ВозвращаемоеЗначение.СообщенияКПередаче.Добавить(ЭлементДанных);
КонецЦикла;

Для Каждого ТранспортныйМодуль Из НастройкиОбмена.ОбменНаСервере Цикл
Если ТранспортныйМодуль.Значение.ЗагружатьВходящиеДокументы Тогда
Транспорт.ПолучитьВходящиеСообщения(ТранспортныйМодуль.Значение);
КонецЕсли;
КонецЦикла;

Если НастройкиОбмена.ОбменНаСервере.Количество() > 0 Тогда
Результат = ОбработатьВходящиеСообщения(ИнтеграцияКлиентСервер.СубъектыОбращенияНастроекОбмена(НастройкиОбмена.ОбменНаСервере));
Для Каждого ЭлементДанных Из Результат.Изменения Цикл
ВозвращаемоеЗначение.Изменения.Добавить(ЭлементДанных);
КонецЦикла;
КонецЕсли;

ШаблонСообщения = НСтр("ru = ‘Для места деятельности %1 не заданы настройки подключения.’");
Для Каждого ОрганизацияБезНастроек Из НастройкиОбмена.БезНастроек Цикл
Если ЗначениеЗаполнено(ОрганизацияБезНастроек.МестоДеятельности) Тогда
ПредставлениеОрганизации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 (%2)", ОрганизацияБезНастроек.Организация, ОрганизацияБезНастроек.МестоДеятельности);
Иначе
ПредставлениеОрганизации = Строка(ОрганизацияБезНастроек.Организация);
КонецЕсли;
ОбщегоНазначения.СообщитьПользователю(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ПредставлениеОрганизации));
КонецЦикла;

(45) поставить на модуль ИнтеграцияВызовСервера галку сервер — уже есть..

С одной этой процедурой не получается обмен. Да и по тексту вижу, что все построено на клиенте. Например

В итоге надо переписывать все под сервер. Или пусть винда запускает 1с с открытием внешней обработки..

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

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

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

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

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

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

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

Запуск внешних обработок 1С из внешних обработок в фоне в 1С 8.3

Эта статья появилась в результате решения интересной задачи. Мы захотели поделиться опытом. Итак задача: нужно запускать по регламенту существующую уже обработку Выгрузка данных и загрузка данных в формате 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) Снять у выбранного пользователя галку «Защита от опасных действий» в конфигураторе.

Добавить комментарий

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