1. a.o.popova 7 27.09.12 09:59 Сейчас в теме

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

Добрый день, коллеги!

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

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

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


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

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

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

КонецПроцедуры
2. DenisCh 27.09.12 10:10 Сейчас в теме
Да, так и получается. и об этом явно написано в документации
3. Dmitr033 109 27.09.12 10:20 Сейчас в теме
Нужно из новой вызвать старую, ну или наоборот, смотря какая должна выполняться чаще.
13. Sergoninfostarru 2 01.10.16 23:38 Сейчас в теме
(3) Dmitr033, Вызывать одну обработку из другой - отключает действие первой обработки. Когда прийдет время завершить работу пользователей - начнет формироваться отчет, а завершения - не будет. Лучше в середине обработки проверки завершения работы пользователей поставить проверку времени формирования отчета в виде диапазона времени > времени1 и < времени2. В таком варианте, достаточно одной обработки ожидания и отчет будет сохраняться на экране.
4. vcv 84 27.09.12 12:12 Сейчас в теме
Для периодического формирования отчета лучше не делать обработку ожидания, а завести специального пользователя, например, Робот. ПриНачалеРаботыСистемы проверять, если пользовать "Робот", формировать нужные отчеты и рассылать по электронной почте и/или сохранять в нужную папку. После формирования отчетов завершать работу 1С.
1С запускать из штатного планировщика с конкретным пользователем и паролем с командной строке примерно так:
"C:\Program Files\1Cv77\bin\1cv7.exe" entreprise /D"C:\Bases\MyBase\" /N"Робот" /P""
5. vcv 84 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 84 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 84 27.09.12 12:47 Сейчас в теме
Отчет сохранять в MXL, тогда все ссылки и расшифровки с нём остаются. Готовый сформированный отчет уже можно открывать у пользователя.
Ну вот вы представьте, я пользователь, работаю, провожу документы и формирую отчеты и ВДРУГ, 1С встаёт в ступор, что-то делает сама с собой энное время, потом выдаёт на экран мне то, чего я не просил. И еще хорошо, если эти тормоза и этот выскочивший отчет появятся как-то уместно, а не тогда, когда я только-только собрался нажать ОК на документе, над которым сидел последние полчаса.
Не знаю кто как, а я бы этого программиста с такими методами бы постарался найти и долго бы его... объяснял что он не прав. :-)
firuzji; a.o.popova; +2 Ответить
11. Ёпрст 1027 02.10.12 13:36 Сейчас в теме
(0) взять обработку ожидания у формекса - запускай хоть сколько угодно раз..
или класс Таймер.
14. imax26 52 03.10.16 03:20 Сейчас в теме
Все же проще и правильнее, на мой взгляд, завести специального пользователя, который раз в три часа формирует отчет и кладет его в какую-либо папочку/рассылает по почте...
И нагрузка на сервер меньше...
15. Dnki 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 года жил.... не понимаю...
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 100 000 руб.
Полный день

Консультант-аналитик 1С (ЗУП)
Санкт-Петербург
Полный день

Руководитель группы сервисов ЭДО, ЭЦП и криптографии
Москва
зарплата от 150 000 руб.
Полный день

Руководитель группы интеграций (1С)
Москва
зарплата от 150 000 руб.
Полный день

Руководитель группы сервисов FRM на 1С
Москва
зарплата от 150 000 руб.
Полный день