Имя: Пароль:
1C
1С v8
Как вывести сообщение пользователю из модуля объекта?
0 Майбах
 
11.12.16
14:01
Добрый день!

Есть внешняя обработка. Как из модуля объекта внешней обработки вывести сообщение пользователю?
1 quest
 
11.12.16
14:02
переписать обработку, так что бы функции возвращали текст, этот текст - вывести пользователю.
2 h-sp
 
11.12.16
14:02
(0) так же как и не из модуля. Одинаково
3 Майбах
 
11.12.16
14:06
(2)
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
            
    // Реализация логики команды
    Если ИдентификаторКоманды = "ПересчетИтогов" Тогда
        
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Проверка выполнена";
        Сообщение.Сообщить();
                                    
    КонецЕсли;
    
КонецПроцедуры

Не работает так...
4 ColonelAp4u
 
11.12.16
14:18
(3) а если просто
  
Если ИдентификаторКоманды = "ПересчетИтогов" Тогда
      Сообщить("Проверка выполнена");                                  
КонецЕсли;
5 Майбах
 
11.12.16
14:26
(4) не работает. Просто не показывается ничего, но в "Если.." заходит проверял, но сообщения нет.
6 quest
 
11.12.16
15:23
ты форму не закрываешь случаем по итогу работы?
7 quest
 
11.12.16
15:24
ну и попутно скажи - управляемое приложение?
8 Мигрень
 
11.12.16
15:30
Модуль объекта выполняется на сервере.
На сервере, Карл.
Кому ты хочешь показывать сообщение не сервере?
9 Майбах
 
11.12.16
15:35
Управляемое.
Бухгалтерия 3.0
10 Майбах
 
11.12.16
15:36
(8) согласен, но как мне тогда сообщить пользователю или открыть форму обработки?
11 Undefined
 
11.12.16
15:36
(8) СообщениеПользователю  работает на сервере

(0) попробуй обновить платформу. помню в каком то релизе был такой баг, сообщения  сервера не доходили до клиента.
12 Майбах
 
11.12.16
16:00
(11) Попробовал под 8.3.8 и 8.3.9 - результат тотже.
13 Майбах
 
11.12.16
16:06
Может быть из внешней обработки никак нельзя вывести сообщение пользователю?
14 Limes
 
11.12.16
16:11
(13) Код в модуле формы:&НаСервере
Процедура СообщитьНаСервере()
    
    Обработка = РеквизитФормыВЗначение("Объект");
    Обработка.ВыполнитьКоманду("ПересчетИтогов", "Параметры");
    
КонецПроцедуры

&НаКлиенте
Процедура СообщитьТекст(Команда)
    СообщитьНаСервере();
КонецПроцедуры

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

Сообщение выводит...
15 Майбах
 
11.12.16
16:15
У Вас открывается форма, у меня же использование стоит -  "ВызовСерверногоМетода", т.е. обработка работает по расписанию (функция БП 3.0) форма не открывается. Вот как тут быть? Т.е. если все ок - сообщаем пользователю, если не ОК - тогда ничего не делаем.
16 Майбах
 
11.12.16
16:18
Наверное сложно объясняю, в общем обработка выполняется по расписанию, на кнопку - соообщитьТекст (как у вас) пользователь не должен нажимать.
17 Undefined
 
11.12.16
16:19
(15) если обработка работает по расписанию значит она работает под дефолтным пользователем DefUser под которым выполняются регламентные задания, поэтому твой пользователь и не получит никогда сообщение, потому что обработка выполняется не в его сеансе
18 1sanekmaloi1
 
11.12.16
16:20
Как на счет :

Глобальный контекст (Global context)
ПолучитьСообщенияПользователю (GetUserMessages)
Синтаксис:

ПолучитьСообщенияПользователю(<УдалятьПолученные>)
Параметры:

<УдалятьПолученные> (необязательный)

Тип: Булево.
Признак необходимости удаления полученных сообщений из списка.
Истина - удалять.
Значение по умолчанию: Ложь.
Возвращаемое значение:

Тип: ФиксированныйМассив.

Описание:

Получает массив объектов СообщениеПользователю, которые еще не были выведены пользователю.
Такое может происходить при работе в регламентных заданиях, на стороне сервера или в Web-сервисах.
19 Undefined
 
11.12.16
16:21
(16) в таких случаях надо использовать метод ПолучитьСообщенияПользователя() или как то так, которое надо выполнить на клиенте
20 Chameleon1980
 
11.12.16
16:21
писать в жр не вариант?
или вам оперативно чтобы видеть?
21 Майбах
 
11.12.16
16:25
По журналу регистрации фоновое задание выполняется от Пользователя под которым работаю - Администратор.

А как использовать ПолучитьСообщенияПользователя() ?
22 Майбах
 
11.12.16
16:26
К примеру получу я массив объектов, но я же опять не смогу его вывести с помощью - сообщить()
23 Chameleon1980
 
11.12.16
16:29
"...По журналу регистрации фоновое задание выполняется от Пользователя под которым работаю - Администратор. ..."
это как это?

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

потому и спросил - нужно оперативно чтоли видеть?

может тупой костыль, но писать куданить
в нужном юзере через обработку ожидания проверять есть запись или нет и показывать юзеру, что там написалось.
24 Майбах
 
11.12.16
16:36
Да, ошибочка - пользователь не определен при запуске, т.е. ты был прав про работу фоновых заданий.
25 Майбах
 
11.12.16
17:55
А как потом проверять через обработку ожидания по данным пользователем?
26 Chameleon1980
 
11.12.16
17:58
Можно завести константу типа какому пользователю выдавать сообщения от регламентов.

В обработке ожидания сравнивать с этой константой
если <> Возврат
иначе выводить накопленные сообщения пользователю

может быстро не понятно ответил.

спрашивайте

я бы так, наверное, сделал
27 Майбах
 
11.12.16
18:06
Конфигурацию снимать с поддержки нельзя
28 Chameleon1980
 
11.12.16
18:10
ну по строке что-ли тогда сравнивайте имя пользователя (хотя за такое ругают обычно)

а что страшного от добавления константы.

Боитесь за обновления?

Это жеж новый объект
29 Chameleon1980
 
11.12.16
18:14
ну сделать обработку
держать ее открытой только для нужного пользователя

т.к. ПоключитьОбработчикОжидания все равно бы пришлось где-то прописать
30 Chameleon1980
 
11.12.16
18:27
типа так, наверное. не пробовал.

&НаСервере
Функция ПолучитьСообщения()
    
    Сообщения=ПолучитьСообщенияПользователю(Истина);
    
    Возврат Сообщения;
    
КонецФункции

&НаКлиенте
Процедура ОбработчикОжидания()
    
    СообщенияПользователю=ПолучитьСообщения();
    
    Если СообщенияПользователю.Количество()=0 Тогда
        Возврат;
    КонецЕсли;
    
    Для Каждого Сообщение Из СообщенияПользователю Цикл
        Сообщить(Сообщение.Текст);
    КонецЦикла;
    
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    ПодключитьОбработчикОжидания("ОбработчикОжидания", 5);
    
КонецПроцедуры
31 Garykom
 
гуру
11.12.16
18:27
(27) Не надо ничего никуда снимать, штатный механизму "отложенных сообщений" изучи и заюзай.
Ну или по топорному пиши в текстовый файлик - лог.
32 Chameleon1980
 
11.12.16
18:28
ну и вместо сообщить можно
Новый СообщениеПользователю тут нарисовать
33 Chameleon1980
 
11.12.16
18:29
(31) ну вот это типа такого жеж?
34 Garykom
 
гуру
11.12.16
18:29
(31)+ Только сначала реши какому именно пользователю хочешь показывать сообщения... Потому что обработке по расписанию типа (15) пофиг
35 Garykom
 
гуру
11.12.16
18:30
(33) Да способов сообщений от одного пользователя - другому куча.
36 Chameleon1980
 
11.12.16
18:36
(30) в пустой обработке
и она будет ловить сообщения, отправленнные, из регламенты через СообщениеПользователю
37 Майбах
 
11.12.16
18:37
Все это конечно хорошо, но мне нужно показывать сообщения текущему пользователю, обработка запустилась, сообщения отложились, и что дальше? Я ведь получается вообще не могу из обработок внешних сообщения показывать
38 Chameleon1980
 
11.12.16
18:42
да как это

вот попробуй так:

и не закрывай обработку:

&НаСервере
Функция ПолучитьСообщения()
    
    Сообщения=ПолучитьСообщенияПользователю(Истина);
    
    Возврат Сообщения;
    
КонецФункции

&НаКлиенте
Процедура ОбработчикОжидания()
    
    Сообщить(""+ТекущаяДата());
    
    СообщенияПользователю=ПолучитьСообщения();
    
    Если СообщенияПользователю.Количество()=0 Тогда
        Возврат;
    КонецЕсли;
    
    Для Каждого Сообщение Из СообщенияПользователю Цикл
        Сообщить(Сообщение.Текст);
    КонецЦикла;
    
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    ПодключитьОбработчикОжидания("ОбработчикОжидания", 5);
    
КонецПроцедуры


она тебе будет показывать каждые 5 секунд текущее дату и время

+ если есть накопленные на сервере (в твоем регламенте) сообщения - они тут тоже вылезут
39 Chameleon1980
 
11.12.16
18:43
даже (вроде), если у тебя другое приложение открыто (активно) при получении сообщения активизируется 1с в и окне сообщений будет твоя информация.

пора уже начинать пробовать.
40 Garykom
 
гуру
11.12.16
18:45
(37) Какому именно текущему? Объясни вот как телефон поймет какому знакомому ты звонишь если ты ему не скажеешь это набирая номер.

Так и тут твой код в "обработке по расписанию" откуда знает кому написать и как?
41 Chameleon1980
 
11.12.16
18:46
просто держи обработку свернутой
если у тебя в отдельных окнах
а так не знаю, как себя поведет
думаю, ничего страшного тоже не дут
42 Chameleon1980
 
11.12.16
18:47
"...Я ведь получается вообще не могу из обработок внешних сообщения показывать..."

С чего это?

+обработка у тебя будет запущена только у нужного пользователя
43 Chameleon1980
 
11.12.16
18:49
Только ПолучитьСоообщенияПользователю
поймает все не показанные сообщения

Глобальный контекст (Global context)
ПолучитьСообщенияПользователю (GetUserMessages)
Синтаксис:

ПолучитьСообщенияПользователю(<УдалятьПолученные>)
Параметры:

<УдалятьПолученные> (необязательный)

Тип: Булево.
Признак необходимости удаления полученных сообщений из списка.
Истина - удалять.
Значение по умолчанию: Ложь.
Возвращаемое значение:

Тип: ФиксированныйМассив.

Описание:

Получает массив объектов СообщениеПользователю, которые еще не были выведены пользователю.
Такое может происходить при работе в регламентных заданиях, на стороне сервера или в Web-сервисах.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное
44 Майбах
 
11.12.16
19:17
Получается одна обработка будет по расписанию проверять данные и создавать сообщения, а вторая должна тоже при открытии проверять, но как программно запустить обработку т.е. открыть при запуске 1С?
45 Майбах
 
11.12.16
19:19
/Execute "Адрес внешней обработки" — параметр предназначен для автоматического запуска внешней обработки после запуска системы.

нашел кажется)
46 mistеr
 
11.12.16
19:25
А про самого пользователя никто не подумал? Ему оно надо получать всякий спам от регламентных заданий?
47 Chameleon1980
 
11.12.16
19:38
(46)

это да

я поправился

"в пустой обработке
и она будет ловить сообщения, отправленнные, из регламенты через СообщениеПользователю"

можно придумать какой-нить РС в котором помимо сообщений и юзера писать, которому предназначается.

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

я бы, наверное, рс сделал и ничего страшного, что это новый объект метаданных. На обновление то не скажется.
48 Chameleon1980
 
11.12.16
19:41
надоть посмотреть, может в бп3 уже есть что подходящее
49 Chameleon1980
 
11.12.16
19:50
может вообще в скуль писать.
50 Chameleon1980
 
11.12.16
19:51
типа этого, думаю, можно подумать

РС "СостоянияНовостей"
51 Майбах
 
11.12.16
19:52
А можно ли как то обработку с формой в которой выполняется обработчик - ОбработчикОжидания, не показывать пользователю, то есть обработка открыта а форма ему не видна, чтобы не раздражало?
52 Garykom
 
гуру
11.12.16
19:53
(49) (50) Думаю 1С если еще нету то скоро добавит в платформу "очереди сообщений" с отправителем и получателем.

Главное чтобы не забыли что отправителем/получателем может быть не только пользователь.
53 Chameleon1980
 
11.12.16
19:56
(52)
возможно

многие типа такого, зачастую, просто сами допиливают.

тут можно тупа через лог писать.
в обработке ожидания смотреть наличие, сообщать и очищать лог.
54 Майбах
 
11.12.16
19:58
В принципе с обработчиком ожидания хороший вариант, но только вот постоянно открытая форма обработки не очень хорошо для пользователя, можно ли как то ее скрыть?
55 Chameleon1980
 
11.12.16
19:58
а ты про "На уровне платформы"
56 Майбах
 
11.12.16
19:59
Хотя бы как то :)
57 Chameleon1980
 
11.12.16
20:02
только вот конфликта не получится при записи в файл и при очистке файла после прочтения в одно время.