Имя: Пароль:
1C
1С v8
Не могу вывести сообщение пользователю
,
0 Opossum
 
14.07.16
12:35
Добрый день. Пытаюсь разобраться с 1с, решил написать простенькую конфигурацию. Сразу возникла такая проблема: есть документ "ОплатаШтрафа", в модуле идет обработкапроведения документа. Мне нужно в двух местах вывести информационное сообщение. Либо штраф начилнен и все хорошо, либо не за что начислять штраф и тоже все хорошо. Функция Сообщить() работает только при отказах, Предупреждить() не работает. Пишет какую-то ерунду. Если перед Предупредить() пишу &НаКлиенте, выдается ошибка: неопознанный оператор. Как вывести тонкому клиенту информационное сообщение перед тем, как документ проведется?
Код прилагаю:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    // Вставить содержимое обработчика.
    ЧитательВСправочнике = Справочники.Читатели.НайтиПоКоду(Читатель.Код);
    ЧитательВСправочникеОбъект = ЧитательВСправочнике.ПолучитьОбъект();
    Штраф = 0;
    Для Каждого СтрТЧ Из ЧитательВСправочникеОбъект.КнигиНаРуках Цикл
        Если СтрТЧ.ШтрафЗаПросрочку <> 0 Тогда
            Штраф = Штраф + СтрТЧ.ШтрафЗаПросрочку;
            СтрТЧ.ШтрафЗаПросрочку = 0;
            СтрТЧ.КнигаУЧитателя.ДатаВозврата = ТекущаяДата();
        КонецЕсли
    КонецЦикла;
    Если Штраф <> 0 Тогда
        Сообщить("Штраф за просроченные книги: " + Штраф);
    Иначе
        Сообщить("Неоплаченных штрафов нет");
    КонецЕсли;    
    ЧитательВСправочникеОбъект.Записать();
КонецПроцедуры
1 Горогуля
 
14.07.16
12:39
>Функция Сообщить() работает только при отказах
это как?
2 Горогуля
 
14.07.16
12:40
за первые две строчик вообще надо руки отрубить
3 Opossum
 
14.07.16
12:42
Если Штраф>0 Тогда
        Сообщить("У Вас есть несданная книга: " + НаименованиеНесданнойКниги + " . Вы не можете получить новую книгу. Сдайте книги и оплатите штраф: " + Штраф + " рублей.");
        Отказ = Истина;
Тогда сообщение выводится.
Если режим проведения, сообщение не выходит
4 Горогуля
 
14.07.16
12:42
и это... никогда не меняй данные объекта при записи
5 Гипервизор
 
14.07.16
12:44
"Сообщить() работает только при отказах" - да что вы говорите..
"Предупредить()" - что-то новенькое..
"Если перед Предупредить() пишу &НаКлиенте" - директивы компиляции не указывается внутри процедуры.
6 PiterPrg
 
14.07.16
12:44
Давно-давно, когда дискеты были большими, а программы маленькими (где-то в 2000) я осваивал 77 и написал конфу, в которой создавал/писал справочники в модуле проведения. :-)
С тех пор никогда так больше не делал. :-)
Убери табличную часть справочника.
Создай регистр (можно регистр сведений периодический)
7 DrZombi
 
гуру
14.07.16
12:46
(0) На сервере нет пользователей. Некому читать твои сообщения :)
8 Opossum
 
14.07.16
12:46
"и это... никогда не меняй данные объекта при записи"
а как их менять?
""Предупредить()" - что-то новенькое.."
Предупреждение
А внутри функции можно указать директиву выполнения?
9 Opossum
 
14.07.16
12:48
А если создать общий модуль, который будет выполняться на клиенте, написать процедуру вызова сообщений. То как к ней обратиться при проведении документа?
10 DrZombi
 
гуру
14.07.16
12:49
(8) В модуле проведения вообще нечего никогда не используй в плане вывода модальных окон.
Так же Сообщить на УФ из модуля не увидят, т.к. код выполняется на сервере 1С
11 PiterPrg
 
14.07.16
12:49
(8) Ни как не меняй.
Подумай, что произойдет, если перепроведут документ задним числом.
Регистр остатков Книга/Читатель/КОличество
12 Горогуля
 
14.07.16
12:50
(8) никак не менять. что юзер навводил - то пусть и будет
13 DrZombi
 
гуру
14.07.16
12:51
(0)Дарю

СообщениеПользователю (UserMessage)
СообщениеПользователю (UserMessage)
Свойства:

ИдентификаторНазначения (TargetID)
КлючДанных (DataKey)
Поле (Field)
ПутьКДанным (DataPath)
Текст (Text)

Методы:

Сообщить (Message)
УстановитьДанные (SetData)

Конструкторы:

По умолчанию

Описание:

Предназначен для хранения параметров сообщения, которые необходимо вывести пользователю.
Если сообщение еще не было показано пользователю (такое может быть при работе на стороне сервера, в фоновом задании, внешнем соединении или Web-сервисах), можно получить накопленные сообщения методом ПолучитьСообщенияПользователю.

В управляемых формах, в случае выполнения просмотра сообщения, выполняется следующий механизм обработки:
Если у сообщения свойство КлючДанных заполнено и не совпадает с ключевым значением основного реквизита текущей формы (ссылкой объекта или ключом записи регистра сведений), то:
открывается новая форма объекта, соответствующая значению свойства КлючДанных;
если у сообщения свойство ПутьКДанным не заполнено, то в него проставляется имя основного реквизита открытой формы объекта;
вызывается показ сообщения в только что открытой форме;
выполняется перенос всех соответствующих сообщений из окна первой формы в новую форму (с таким же значением свойств КлючДанных, как у выбранного сообщения). При этом перенесенным сообщениям аналогичным образом проставляется свойство ПутьКДанным, если оно не установлено.


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

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Пример:

Процедура ДействиеСОбъектом(ОбъектДанных)
    ...
    Сообщение = Новый СообщениеПользователю();
    Текст = "ru = ""В строке 11 табличной части ""Номенклатура"" не хватает ";"
     + " en = ""In line 11 of tabular section ""Nomenclature"" is missing ";
    Сообщение.Текст = НСтр(Текст)+НедостающееКоличество+" "+ЕдиницаИзмеренияНоменклатуры;
    Сообщение.Поле = "Номенклатура[10].Количество";
    Сообщение.УстановитьДанные(ОбъектДанных);
    Сообщение.Сообщить();

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


См. также:

Глобальный контекст, метод УстановитьСоответствиеОбъектаИРеквизитаФормы
Глобальный контекст, метод ПолучитьСоответствиеОбъектаИРеквизитаФормы
Глобальный контекст, метод ПолучитьСообщенияПользователю
14 Beretta
 
14.07.16
13:09
(0)> Пишет какую-то ерунду

О!
15 Nuobu
 
14.07.16
13:23
(14) Так и пишет "Ошибка в модуле обработки в функции "ОрботкаПроведения". Вы там пытаетесь сделать какую-то ерунду - показать диалог на сервере, в то время, как в 1С запрещен вызов окон в серверных методах.".
16 Opossum
 
14.07.16
13:54
прочитал, что сообщениеПользователю выдается, когда управление переходит на клиента. Вот код:
Если Штраф <> 0 Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Штраф за просроченные книги: " + Штраф;
        Сообщение.Сообщить();
    Иначе
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Неоплаченных штрафов нет";
        Сообщение.Сообщить();
    КонецЕсли;
    ЧитательВСправочникеОбъект.Записать();
КонецПроцедуры
Вроде все по мануалам, но сообщение не выводится. Как мне ередать управление клиенту?
17 Горогуля
 
14.07.16
14:13
(16) ничего, что проведению совсем поровну на клиента?
18 lera01
 
14.07.16
14:40
(16) Делай в обработчике ПриЗаписи() или еще каком обработчике формы, а все нужные проверки делай перед проведением.
19 PiterPrg
 
14.07.16
14:46
(16) У тебя случаем не закрывается документ после проведения? :-)
Если да - то с ним просто закрывается окно с сообщением.

А от этой дряни все-же откажись
>>ЧитательВСправочникеОбъект.Записать();

Создай 2 документа на одного читателя и проведи их несколько раз в разной последовательности.
Поле каждого раза смотри Книги на руках.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший