Две обработки ожидания в глобальном модуле

1. a.o.popova 7 27.09.12 09:59 Сейчас в теме
Добрый день, коллеги!

Столкнулась с такой ситуацией: в глобальном модуле определяется обработка ожидания (для местной выгонялки системы). По желанию заказчика потребовалось, чтобы несколько групп пользователей каждые три часа и при запуске 1С видели отчет по ДЗ. Пришлось в коде глобального модуля определить еще одну обработку ожидания.

Теперь возникла проблема: предыдущая обработка ожидания перестала работать. Получается, что в глобальном модуле может быть определена только одна обработка ожидания?
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
10. alexstav 8 01.10.12 21:28 Сейчас в теме
(1) a.o.popova,

В обработке ожидания запускается процедура, например


ОбработкаОжидания("ЗапускРобота",50);

при этом каждые 50 секунд программа заходит в процедуру ЗапускРобота()

например у меня в этой процедуре вызов нескольких обработок:
Процедура ЗапускРобота()
//1 процедура
ПроверитьСообщения();
// 2 процедура
ФайлШторк();

КонецПроцедуры
2. DenisCh 27.09.12 10:10 Сейчас в теме
Да, так и получается. и об этом явно написано в документации
3. Dmitr033 131 27.09.12 10:20 Сейчас в теме
Нужно из новой вызвать старую, ну или наоборот, смотря какая должна выполняться чаще.
13. Sergoninfostarru 2 01.10.16 23:38 Сейчас в теме
(3) Dmitr033, Вызывать одну обработку из другой - отключает действие первой обработки. Когда прийдет время завершить работу пользователей - начнет формироваться отчет, а завершения - не будет. Лучше в середине обработки проверки завершения работы пользователей поставить проверку времени формирования отчета в виде диапазона времени > времени1 и < времени2. В таком варианте, достаточно одной обработки ожидания и отчет будет сохраняться на экране.
4. vcv 89 27.09.12 12:12 Сейчас в теме
Для периодического формирования отчета лучше не делать обработку ожидания, а завести специального пользователя, например, Робот. ПриНачалеРаботыСистемы проверять, если пользовать "Робот", формировать нужные отчеты и рассылать по электронной почте и/или сохранять в нужную папку. После формирования отчетов завершать работу 1С.
1С запускать из штатного планировщика с конкретным пользователем и паролем с командной строке примерно так:
"C:\Program Files\1Cv77\bin\1cv7.exe" entreprise /D"C:\Bases\MyBase\" /N"Робот" /P""
5. vcv 89 27.09.12 12:20 Сейчас в теме
Можно еще интересней. Для пользователя Робот проверять наличие *.ert в личной папке пользователя. Если есть - открываем их ОткрытьФорму(...) по очереди. 1С запускаем из планировщика с указанием личной папки пользователя
"C:\Program Files\1Cv77\bin\1cv7.exe" entreprise /D"C:\Bases\MyBase\" /N"Робот" /P"" /U"C:\Bases\MyBase\Робот\Авто1\"
В результате имеем возможность в разное время и с разной периодичностью выполнять в 1С разные обработки.
У меня подобным образом раз в пятнадцать минут расчитывается управленческая себестоимость, ночью формируется и рассылается по мылу пакет отчетности по результатам дня, в обед формируется и рассылается ряд отчетов ко времени совещания у руководителей. Ну и прочие автонужды.
6. a.o.popova 7 27.09.12 12:32 Сейчас в теме
Круто, vcv - большое спасибо, что поделились опытом. Планировщиком пользоваться умею (как раз для рассылки электронных отчетов) - проблема в том, что мне свой отчет надо открывать именно в 1с - он достаточно сложный, он содержит ссылки, благодаря которым открываются документы реализации и прочая информация, поэтому очень важно, чтобы отчет именно в 1С открывался.
7. vcv 89 27.09.12 12:39 Сейчас в теме
(6) А я о чём?
Помещаем в ПриНачалеРаботыСистемы примерно такой код:
Если ИмяПользователя() = "Робот" Тогда
	СписокАвтоОтчетов = СоздатьОбъект("СписокЗначений");
	ФС.УстТекКаталог(КаталогПользователя());
	ИмяФайлаАвтоВыполнения = ФС.НайтиПервыйФайл("*.ert");
	Пока ПустоеЗначение(ИмяФайлаАвтоВыполнения)=0 Цикл
		СписокАвтоОтчетов.ДобавитьЗначение(КаталогПользователя()+"\"+ИмяФайлаАвтоВыполнения);
		ИмяФайлаАвтоВыполнения = ФС.НайтиСледующийФайл();
	КонецЦикла;
	Для Номер=1 По СписокАвтоОтчетов.РазмерСписка() Цикл
		ИмяАвтоотчета = СписокАвтоОтчетов.ПолучитьЗначение(Номер);
		Попытка
			ОткрытьФорму("Отчет",,ИмяАвтоотчета);
		Исключение
			ЗаписьЖурналаРегистрации(ОписаниеОшибки(),"Робот",ИмяАвтоотчета);
		КонецПопытки;
	КонецЦикла;
	СтатусВозврата(0);
	ЗавершитьРаботуСистемы(0);
	Возврат;
КонецЕсли;
Показать

Делаем отдельную папочку, куда складываем все внешние обработки/отчеты, которые должны выполниться. И запускаем из планировщика 1С с указанием этой самой папки личной для пользователя.
9. firuzji 27.09.12 21:03 Сейчас в теме
(7) vcv, Самый аптемальный вариант. Пользуюсь таким же методом. Правда у нас таких роботов много, в зависимости от задачи.
12. Sergoninfostarru 2 01.10.16 23:31 Сейчас в теме
(7) vcv, Ну, не совсем удобно. Если пользователь не возле экрана, то не видит отчет и нигде нет сохранения результата в файл mxl для последующего открытия и ознакомления
8. vcv 89 27.09.12 12:47 Сейчас в теме
Отчет сохранять в MXL, тогда все ссылки и расшифровки с нём остаются. Готовый сформированный отчет уже можно открывать у пользователя.
Ну вот вы представьте, я пользователь, работаю, провожу документы и формирую отчеты и ВДРУГ, 1С встаёт в ступор, что-то делает сама с собой энное время, потом выдаёт на экран мне то, чего я не просил. И еще хорошо, если эти тормоза и этот выскочивший отчет появятся как-то уместно, а не тогда, когда я только-только собрался нажать ОК на документе, над которым сидел последние полчаса.
Не знаю кто как, а я бы этого программиста с такими методами бы постарался найти и долго бы его... объяснял что он не прав. :-)
firuzji; a.o.popova; +2 Ответить
11. Ёпрст 1063 02.10.12 13:36 Сейчас в теме
(0) взять обработку ожидания у формекса - запускай хоть сколько угодно раз..
или класс Таймер.
14. imax26 91 03.10.16 03:20 Сейчас в теме
Все же проще и правильнее, на мой взгляд, завести специального пользователя, который раз в три часа формирует отчет и кладет его в какую-либо папочку/рассылает по почте...
И нагрузка на сервер меньше...
15. Dnki 4 03.10.16 09:31 Сейчас в теме
Про Робота все написали, только не ответили на тему: "Как сделать несколько Ожиданий ?".
Разумеется в 7.7 может работать только одна процедура. Я делаю так:
Перем ТекВызов;			// текущий счетчик вызовов

//----------------------------------------------------------
//		Вызывается периодически (5 сек)
Процедура Ожидание()

	//	При первом вызове
	Если ПустоеЗначение(ТекВызов) = 1 Тогда
		ТекВызов = 0;
	КонецЕсли;
	ТекВызов = ТекВызов + 1;
	
	//------	Сигнал или Завершение системы
	Если (ТекВызов % 5 = 0) Тогда
		ОжиданиеСигнал();
	КонецЕсли;

	//------	Звуковой
	Если (ТекВызов % 29 = 0) Тогда
		ОжиданиеЗвук();
	КонецЕсли;

	//------	Автоснятие резерва
	Если (ТекВызов % 17 = 0) Тогда
		ОжиданиеРезерв();
	КонецЕсли;
	
	//------	АвтоИмпорт
	Если (ТекВызов % 3 = 0) Тогда
		ОжиданиеИмпорт();
	КонецЕсли;
	
КонецПроцедуры	// Ожидание

ОбработкаОжидания("Ожидание", 5);

Показать

И, разумеется, вызываемые процедуры должны быть быстрые, почти не заметными для пользователя.
16. vip 03.10.16 09:35 Сейчас в теме
17. falcon 03.10.16 09:39 Сейчас в теме
как автор без Ваших советов 4 года жил.... не понимаю...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот