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) Снять у выбранного пользователя галку «Защита от опасных действий» в конфигураторе.