Фоновые задания в файловом режиме 1С 8.x средствами 1С без дополнительных компонент

Опубликовал kosilov в раздел Обмен - 1С7.7 <-> 1C8.X

Необходимость использования фоновых задач в файловом варианте есть, а вот возможность как это осуществить совсем не очевидна.
Можно конечно воспользоваться дополнительными Active-X компонентами (http://infostart.ru/public/66660/) или запускать две копии приложения. Я же нашел (как мне) кажется более простой и гибкий вариант и при этом все только средствами самой 1С.

Понадобилось мне в фоне длительные операции делать и при этом чтобы пользователь мог спокойно работать с программой. В 8.1 появились фоновые задания, которые предназначены как раз для этой цели. Но оказывается всё не так просто. Всё хорошо в клиент\серверном варианте, а вот в файловом...

Для того, чтобы можно было выполнять фоновые задания должы быть:

1. До запуска фонового задания вызвана процедура "ВыполнитьОбработкуЗаданий()"

2. Для собственно выполнения заданий должна периодически вызываться процедура ВыполнитьОбработкуЗаданий()

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

При Com соединении вызывать эту процедуру тоже бестолку, так как опять таки синхронная работа (ожидание вызывающим вызываемого).

 Но оказывается из этого замкнутого круга есть выход.

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

Я сделал так:

1. Добавил специального пользователя Server (в списке не выводить)

2. Определил глобальную экспотрную переменную V8Com в модуле приложения .

3. В модуле приложения добавил следущий код:

 

Перем V8Com Экспорт;


Процедура
ПередНачаломРаботыСистемы(Отказ)

если
ИмяПользователя() = "Server" тогда
     
ПодключитьОбработчикОжидания("ОбработчикОжидания",1);
КонецЕсли;

КонецПроцедуры

Процедура
ОбработчикОжидания() экспорт
     
ВыполнитьОбработкуЗаданий();
КонецПроцедуры

Если обрабатывать фоновые задания необходимо сразу, а не по специальному требованию пользователя, то можно прямо в модуле приложения добавить:

 

V8Com = Новый COMОбъект("V81.Application");

Попытка
   
Открытие = V8Com.Connect(СтрокаСоединенияИнформационнойБазы()+ "Usr=""Server"";Pwd=""123"";");
Исключение
   
Предупреждение("Ошибка открытия фоновой копии!!!");
   
Отказ = истина;
    Возврат;
КонецПопытки;

В противном случае этот код исполняем по требованию пользователя из формы или откуда угодно.

После можно запускать фоновые задания штатными методами. 

Например: ФоновыеЗадания.Выполнить("ОбработкаФоновыхЗаданий.ВыполнитьЦикл",
МассивПараметров,"Индикатор2");

В демонстрационной обработке можно посмотреть как это работает.

За основу обработки я взял обработку от сюда.

Кое-что правда не удалось (по крайней мере пока):

 1. Не получилось использовать обработчики событий для обмена данными между фоновой копией и основной. Не ясно какое и как событие генерировать в фоновой функции и как его потом ловить в главном приложении. (если кто знает подскажите). В демонстрационной конфигурации передача данных происходит через регистр сведений. 

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

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

P.S. Если такое решение "всем известно", то прошу меня сильно не бить, так как я еще неделю назад активно искал решение но не нашел. Вариант с внешней Active-X компонентой у меня не заработал.      

Наименование Файл Дата Размер Кол. Скачив.
Фоновые задания в файловой среде
.dt 19.05.10 14,44Kb 180 Скачать
28

См. также

Установка и удаление Платформы 1С на клиентских компьютерах удалённо через скрипт (с доменом и без)
Выгрузка данных из Управления торговлей 10.3 в Бухгалтерию предприятия, ред. 3.0 (Версия 1.6.2)
Подбор номенклатуры как в 7.7 для УТ11 + ВИДЕО (ОБНОВЛЕНИЕ ДЛЯ УТ11.1.7)
Обработка "Консоль администратора 1С"
Мастер печатных форм (Управляемое приложение) v 1.8
Мегапрайс PRO: подсистема импорта, обработка и анализ прайсов в 1С УТ10 и УТ 11
Групповая обработка справочников и документов (Управляемая форма) v 2.6
Adaptersoft : HelpDesk_Corp - автоматизация сопровождения 1С
Проверка данных
Коллекция полезных кнопок и процедур для отчетов и обработок v3.00
Конфигурация "СКАТ-Профессионал" для 1С:Предприятие 8.2
Алкогольная декларация для 1С 8 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 формы) с подписью и шифрованием, редакция 2.3

Комментарии

Показать все сообщения
5. dushelov 25.05.2010 18:03
Кстати, обычные фоновые задания довольно часто зависают. Решения проблемы так и не нашли - только перезапуск сервиса.
Ответили: (6)
# Ответить
6. kosilov 26.05.2010 00:56
(5) Пока не сталкивался. А как виснут? В смысле виснет среда?
А что 1С по этому поводу говорит?
Ответили: (7)
# Ответить
7. dushelov 26.05.2010 01:05
(6) В смысле то, что фоновое задание висит бесконечно со статусом "выполняется" и никак его не удалить, ни через консоль заданий, ни через консоль серверов, что в 8.1, что в 8.2 встречается. Поэтому и пришлось писать свою компоненту для многопоточности.
# Ответить
8. sas2006 29.10.2010 15:12
У у меня появился вопрос, получается будет запускаться еще одна копия 1с и следовательно должна быть еще одна свободная лицензия?
# Ответить
9. Kazan 12.10.2011 06:14
не понятно какой конкретно оператор запускает механизм выполнения заданий от имени сервера - ВыполнитьОбработкуЗаданий или оновыеЗадания.Выполнить ???
# Ответить
10. krevedgo (файл скачал) 27.12.2012 23:03
Спасибо автору за тему!
Очень нужная вещь, но...
Помогите плиз начинающему
Что куда вписывать? Платформа 8.2
Открыл конфигуратор, открыл модуль управляемого приложения
Сделал так:
// Конец СтандартныеПодсистемы
Перем V8Com Экспорт;

Процедура ПередНачаломРаботыСистемы(Отказ)
	
	// СтандартныеПодсистемы
	СтандартныеПодсистемыКлиент.ДействияПередНачаломРаботыСистемы(Отказ);
	// Конец СтандартныеПодсистемы
	
	//выполняем фоновые задания
если ИмяПользователя() = "Server" тогда
       ПодключитьОбработчикОжидания("ОбработчикОжидания",1);
   КонецЕсли;
   //конец выполняем фоновые задания

	
КонецПроцедуры

 Процедура ОбработчикОжидания() экспорт
       ВыполнитьОбработкуЗаданий();
 КонецПроцедуры

Процедура ПриНачалеРаботыСистемы()
	
	НеобходимаНачальнаяНастройкаПрограммы = ОбновлениеИнформационнойБазыУТ.НеобходимаНачальнаяНастройкаПрограммы();
	
	// СтандартныеПодсистемы
	СтандартныеПодсистемыКлиент.ДействияПриНачалеРаботыСистемы(Истина);
	// Конец СтандартныеПодсистемы
	
	//Диалог выбора варианта настройки системы
	Если НеобходимаНачальнаяНастройкаПрограммы Тогда
		ОткрытьФормуМодально("ОбщаяФорма.ВыборВариантаНастройкиПрограммы");
	КонецЕсли;
	//Конец Диалог выбора варианта настройки системы
	
	//ОткрытиеФормПриНачалеРаботыСистемы
	ОткрытиеФормПриНачалеРаботыСистемыКлиент.ПриНачалеРаботыСистемы();
	//Конец ОткрытиеФормПриНачалеРаботыСистемы
	
	V8Com = Новый COMОбъект("V81.Application");

 Попытка
     Открытие = V8Com.Connect(СтрокаСоединенияИнформационнойБазы()+ "Usr=""Server"";Pwd=""123"";");
 Исключение
     Предупреждение("Ошибка открытия фоновой копии!!!");
     Отказ = истина;
     Возврат;
 КонецПопытки;

КонецПроцедуры

...Показать Скрыть


Запускаю отладку и получаю ошибку
{МодульУправляемогоПриложения(97)}: Ошибка при вызове конструктора (COMОбъект)
V8Com = Новый COMОбъект("V81.Application");
по причине:
Недопустимая строка с указанием класса


Попробовал это - не помогло.

Подскажите, что я делаю не так?
Смущает "СтрокаСоединенияИнформационнойБазы" - может тут должно быть что-то более конкретное?
Требуется выполнять всего одно задание "обмен с сайтом", как-то в УТ10 это работало без дополнительной химии, а вот в УТ11 уже не получается.
Ответили: (11)
# Ответить
11. nikbrik 07.02.2013 16:50
(10)
Что куда вписывать? Платформа 8.2
V8Com = Новый COMОбъект("V81.Application");

Ответ очевиден:
V8Com = Новый COMОбъект("V82.Application");

Вопрос: метод работает, фоновые задания выполняются, НО необходимо фоновым заданием принудительно завершить работу пользователя в определенное время. Если запускал от имени текущего пользователя - все работало, но с этим методом вообще ничего не происходит. Может нашли уже какой-то способ передать сообщение о выполнении задания?
# Ответить
12. kosilov 07.02.2013 17:43
Уже не припомню.

Но как крайний вариант, сделайте так:
1. Создайте регистр сведений или используйте какой-то предопределенный элемент БД, который синхронизируется между разными потоками.
2. На клиентком процессе сделайе регулярный опрос ( каждый 30 сек например) этого регистра (или эл-та который вы использовали).
3. Если фоновый поток требует завершения пользователей,то в БД выставляется флаг (в этот ваш эл-т или регистр)
4. Клиентский поток смотрит это значение и если там стоит флаг завершения, то клиентский поток сам завершается по собственному т.с. желанию.

Если, я конечно правильно понял вашу задачу.
Ответили: (13)
# Ответить
13. nikbrik 07.02.2013 17:58
(12)Спасибо за ответ
Дело в том, что фоновый процесс нужен был, чтобы в файловом варианте не мешать работе пользователя постоянными проверками фоновых заданий. А то что вы предлагаете - значит опять проверять каждые 30 секунд на наличие флага) опять будут подвисания, тогда просто нет смысла в фоновом процессе... Или может я ошибаюсь, и есть способ проверять на наличие флага как-то незаметно?
P.S. Извините что не могу более ясно выражать мысли)) после работы голова гудит...
# Ответить
14. kosilov 07.02.2013 19:15
Я пробовал играться с нотификациями, но что-то не очень у меня это получилось.

У вас таймаут большой может быть (будет не критично) 30 сек или минута.
Там есть хэндлер (к сожалению уже не помню название) который может быть вызван только тогда когда нет активности на стороне пользователя. Если вы используете этот метод, то пользователь не будет замечать что система что-то опрашивает.
# Ответить
Логин:
Пароль:
Текст сообщения*
Прикрепить файл
28
Другие публикации автора:

Создание 19.05.10 03:21

Обновление 19.05.10 00:00

№ Публикации 70415

Статистика:

Просмотры 7794

Загрузки 180

Комментарии 14

Характеристики:

Рубрики 1С7.7 <-> 1C8.X

Тип Внешняя обработка (ert,epf)

Платформа 1C: Предприятие 8.1 ,
1C: Предприятие 8.2

Конфигурация

Операционная система Не имеет значения