Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Периодический запуск обработки в сеансе пользователя
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
AlexHummer
1С:Предприятие 8.2 (8.2.19.102)
УПП Укр. (1.3.47.2)

Добрый день.
Необходимо реализовать периодический запуск обработки в сеансе пользователя. В настройках пользователя уже имеются признаки по которым нужно проверять саму необходимость запуска обработки и интервал запуска. Не удается только выполнить сам запуск.
Казалось бы, оптимальный вариант - Обработчик ожидания... Но как-то не складывается sad.gif Возможно неправильно делаю.
Делаю так:
"Модуль обычного приложения" - Процедура "ПриНачалеРаботыСистемы" - в ней есть вызов процедуры в моем общем модуле (сервер,внешнее соединение, клиент-обычное прилож.). В той процедуре такая вставка

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


Сама Процедура, которую подключаю является экспортной и лежит рядом:

#Если Клиент тогда
Процедура ЗапуститьОбработкуКонтроля() Экспорт
    ТекОбъект                     = Обработки.ПереченьДокументов.Создать();
    ТекОбъект.КоличествоДней    = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "КоличествоДнейКонтроля");
    ТекОбъект.Дата                 = КонецДня(ТекущаяДата());
    ТекОбъект.НачальнаяДата     = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "НачальнаяДатаКонтроля");
    ТекОбъект.Ответственный     = ПараметрыСеанса.ТекущийПользователь;
    Результат                     = ТекОбъект.ПолучитьДеревоДокумнетов();
    //Если Не Результат.Пустой() Тогда
        ФормаОбъекта             = ТекОбъект.ПолучитьФорму("Форма");
        ТабличноеПоле             = ФормаОбъекта.ЭлементыФормы.Найти("ТабличноеПоле");
        ТабличноеПоле.Значение     = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
        ТабличноеПоле.СоздатьКолонки();
        ФормаОбъекта.Открыть();
    //КонецЕсли;
КонецПроцедуры
#КонецЕсли


В целом, текст процедуры полностью рабочий, он же используется при единоразовом запуске, при начале работы системы - все работает. А вот при попытке подключить его в обработчик ожидания - ругается, причем ошибка указывает именно на первый параметр - Имя процедуры. Что-то не так указано.
По справке:
Цитата
Имя экспортируемой процедуры модуля управляемого приложения (модуля обычного приложения) или глобального общего модуля.
Процедура должна располагаться на клиенте.

Вид модуля вроде соответствует требованиям. подскажите, что не так, куда копнуть.
Заранее благодарен. smile.gif
Acid
Копайте в "НастройкиПрограммы" -- "Регламентные задания" -- "Интервал опроса"
AlexHummer
Дело в том, что это не регламентное задание. Мне необходимо конкретному пользователю, в работающий сеанс, с определенной периодичностью запускать обработку и соотв. открывать ее форму. И пользователь чтоб мог видеть что открылось и дальше работать.
Регламентное задание, насколько я понимаю такого не делает, оно отрабатывает где-то "в тени", по крайней мере так, как я пробовал - так и получалось.
Vofka
AlexHummer, система ищет процедуру ЗапуститьОбработкуКонтроля в текущем модуле и в глобальных. Но не там не там её не находит.

Цитата
<ИмяПроцедуры> (обязательный)
Тип: Строка.
Имя экспортируемой процедуры модуля управляемого приложения (модуля обычного приложения) или глобального общего модуля.


Acid, причем тут регламентные задания? И что такое НастройкиПрограммы?
bakalavr
AlexHummer @ Сегодня, 15:28 необходимо зарегистрироваться для просмотра ссылки ,
Для эксперимента попробуйте переместить процедуру ЗапуститьОбработкуКонтроля в глобальный общий модуль, который выполняется только на клиенте
logist
Вы не допускаете, что вот здесь возвращается значение отличное от необходимого? поэтому обработчик не подключается...
Цитата(AlexHummer @ 17.11.16, 16:28) необходимо зарегистрироваться для просмотра ссылки
УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ИнтервалПроверкиКонтроля")


Цитата(bakalavr @ 17.11.16, 18:43) необходимо зарегистрироваться для просмотра ссылки
Для эксперимента

Сомнительный эксперимент, я бы даже сказал бессмысленный.
Vofka
Цитата(logist @ 17.11.16, 19:18) необходимо зарегистрироваться для просмотра ссылки
Сомнительный эксперимент, я бы даже сказал бессмысленный.

Можно узнать почему?
logist
Vofka, если процедура не выполняется в том же модуле в котором она вызывается, 100% она не выполнится и в глобальном. Проблема же не в процедуре, а в запуске обработчика.
Acid
AlexHummer @ Вчера, 17:08 необходимо зарегистрироваться для просмотра ссылки ,
Я вам намекнул где копать - от интервала опроса. Посмотрите как и где он используется.
Кстати, есть еще процедура периодической проверки отличия файла конфигурации. Да там много что с периодом опроса связано. Напоминания и прочее. Используйте уже готовый код.

*может быть глоб.модуль должен быть привелегированным?
AlexHummer
Цитата(Vofka @ 17.11.16, 17:12) необходимо зарегистрироваться для просмотра ссылки
система ищет процедуру ЗапуститьОбработкуКонтроля в текущем модуле и в глобальных

Процедура ЗапуститьОбработкуКонтроля лежит буквально рядом, следующей процедурой, в текущем модуле. Она экспортная.

Цитата(logist @ 17.11.16, 19:18) необходимо зарегистрироваться для просмотра ссылки
Вы не допускаете, что вот здесь возвращается значение отличное от необходимого?

Нет. Выдает результат корректный. Именно данный блок также работает при запуске системы, запуская обработку при начале работы первый раз. Также проверял отладчиком и в момент подключения обработчика.

Цитата(Acid @ 18.11.16, 2:40) необходимо зарегистрироваться для просмотра ссылки
интервала опроса

Никак не пойму, при чем интервал опроса, когда, как я и описал, ругается на вызов процедуры, на имя процедуры, на первый параметр.
Вот собственно текст ошибки:
{ОбщийМодуль.Рез.Модуль(324)}: Ошибка при вызове метода контекста (ПодключитьОбработчикОжидания)
        ПодключитьОбработчикОжидания("ЗапуститьОбработкуКонтроля",УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ИнтервалПроверкиКонтроля"));
по причине:
Недопустимое значение параметра (параметр номер '1')
Vofka
Цитата(logist @ 17.11.16, 22:30) необходимо зарегистрироваться для просмотра ссылки
Vofka, если процедура не выполняется в том же модуле в котором она вызывается, 100% она не выполнится и в глобальном. Проблема же не в процедуре, а в запуске обработчика.

Цитата(AlexHummer @ 18.11.16, 8:57) необходимо зарегистрироваться для просмотра ссылки
Процедура ЗапуститьОбработкуКонтроля лежит буквально рядом, следующей процедурой, в текущем модуле.

Меня сбило с толку вот это:
Цитата(AlexHummer @ 17.11.16, 15:28) необходимо зарегистрироваться для просмотра ссылки
в ней есть вызов процедуры в моем общем модуле (сервер,внешнее соединение, клиент-обычное прилож.)


AlexHummer, а если убрать от процедуры
#Если Клиент тогда
#КонецЕсли

?
AlexHummer
Цитата(Vofka @ 18.11.16, 9:04) необходимо зарегистрироваться для просмотра ссылки
а если убрать от процедуры

Изначально пробовал без всего этого) не отработало, и начал уже экспериментировать..

Цитата(Vofka @ 18.11.16, 9:04) необходимо зарегистрироваться для просмотра ссылки
Меня сбило с толку вот это:

Уточните, что именно пожалуйста.
Все дело происходит в общем модуле. у него включены галочки: сервер,внешнее соединение, клиент-обычное прилож.. В этом модуле в одной из процедур, которая запускается при начале работы системы происходит разовый запуск требуемой обработки (вызов процедуры ЗапуститьОбработкуКонтроля), и пытаюсь подключить обработчик ожидания на эту же процедуру.
Vofka
AlexHummer, где у вас определена процедура ЗапуститьОбработкуКонтроля?
Продублирую:
Цитата(Vofka @ 17.11.16, 17:12) необходимо зарегистрироваться для просмотра ссылки
Имя экспортируемой процедуры модуля управляемого приложения (модуля обычного приложения) или глобального общего модуля.


Цитата(logist @ 17.11.16, 22:30) необходимо зарегистрироваться для просмотра ссылки
Vofka, если процедура не выполняется в том же модуле в котором она вызывается, 100% она не выполнится и в глобальном. Проблема же не в процедуре, а в запуске обработчика.

Ага, как же. Советую проверять и убеждаться в том, что утверждаете, прежде чем утверждать. Ваше утверждение верно с небольшой оговоркой: если модуль глобальный или это модуль управляемого/обычного приложения. Если же это все делается в общем модуле, то так работать не будет. Об этом даже говорится в СП, цитату из которого я выше приводил. Поэтому совет bakalavr @ Вчера, 17:43 необходимо зарегистрироваться для просмотра ссылки , не бессмысленный, а очень даже правильный.
AlexHummer
Разместил процедуру, которую подключаю обработчиком ожидания в глобальном модуле - все пошло работать.
Как и задумывалось:
при запуске открывается первый раз всегда, и ту же процедуру подключаю обработчиком ожидания согласно интервалу из настроек пользователя. Работает.
Сейчас осталось только с формами разобраться, чтоб не открывалась новая каждый раз, если вдруг пользователь не закрыл предыдущую...
Спасибо Всем за помощь и подсказки.
Отдельная благодарность Vofka и bakalavr
Acid
Если у вас
Цитата(AlexHummer @ 17.11.16, 15:28) необходимо зарегистрироваться для просмотра ссылки
"Модуль обычного приложения"


то у вас режим "Толстый клиент". Тогда конструкция
#Если Клиент тогда
лишняя. Это раз.

Смотрите в синтакс-помошнике описание метода ПодключитьОбработчикОжидания

Почти в самом низу есть такие строки:
Доступность: Толстый клиент.


Вам нужно из Клиента вызвать Серверный метод.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.