User Rating: 5 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Active
 

Приветсвую.

Ранее я писал о том, Как правильно выдавать сообщения пользователю. Но некоторые моменты по работе с объектом "Сообщение пользователю" остались в ней не освещенными. Например, что писать в поле "Поле", если имя 

реквизита отличается от именя поля на форме. Что писать в поле "ПутьКДанным". И наконец, самое вкусное, как работать с табличной частью.

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

 

Все что я пишу ниже проверено на 1С:Предприятие 8.3 (8.3.7.1860). Не самая последняя на сегодняшний день, но пишу как есть.

 


1. Просто сообщение.

Начнем с простого: просто выведем сообщение в форме, без привязки к полям, данным и прочее.

Об этом я рассказывал ранее, но для целостности статьи напишу еще раз. Тем более с некоторыми дополнениями.

 

	Сообщение1 = новый СообщениеПользователю;
Сообщение1.Текст = "1. просто сообщение без привязок";
Сообщение1.Сообщить();

 

Этот код можно исполнить как на клиенте, так и на сервере. Это почти полный аналог строки:

Сообщить("1. просто сообщение без привязок");

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

получить на сервере в клиентском сеансе методом "ПолучитьСообщенияПользователю(...)" пока фоновое задание живо.

Тут я немного соврал Вам, я этого никогда не проверял. Вполне возможно, что сообщения выданные процедурой "Сообщить(...)" тоже можно получить из фонового задания, а может и нельзя. В документации про это не сказано, а значит мы так 

делать не будем.

Итак, вывод: теперь всегда делайте сообщения объектом, это типа хороший тон новой платформы, а процедуру забудьте. Если Вам не нравится писать сообщение в три строки, то напишите свою процедуру в общем модуле и радйтесь. Это будет даже 

 

очень хороший тон, т.к. Вы получите целый ряд плюсов:

1. Расширенный функционал нового объекта (подробнее ниже)

2. Возможность выводить сообщения своим способом. Например в текстовое поле или файл, а не в окно сообщений.

3. Возможность логирования. Например можно сохранять все сообщения в БД или в файл или дублировать их в журнале регистрации, для этого просто ковырните свою процедуру общего модуля. И тогда споры о том, что программа пользователю ничего 

не сообщала прекратятся навсегда.

 


2. Сообщение привзанное к реквизиту объекта.

Как я писал в предыдущей статье, для привязки надо заполнить поля "Поле" и "ПутьКДанным". Но тему я в статье подробно не раскрыл.

Итак пример 2й в документе есть реквизит шапки "Клиент", надо на нем спозиционироваться и сообщить что-то в клиентской процедуре. Вот код, который это делает:

Сообщение2 = новый СообщениеПользователю;
Сообщение2.Текст = "2. Сообщение привязанное к реквизиту шапки Клиент";
Сообщение2.Поле = "Клиент";
Сообщение2.ПутьКДанным = "объект";
Сообщение2.Сообщить();

 

И тут нюансы:

1. Поле - это не поле, т.к. в моем примере элемент управления называется "ПолеКлиент", а реквизит объекта - "Клиент". Со строкой Сообщение2.Поле = "ПолеКлиент" не работает.

2. ПутьКДанным не "Объект.Клиент", а просто "Объект", т.к. нам надо сообщение показать не в форме контрагента, а в форме текущего документа. "Объект.Клиент" - не работает.

3. Это пример работы на клиенте. В серверных процедурах, немного по другому. Это ВАЖНО, не путайте привзяку сообщений на сервере и на клиенте.

 

Еще один пример я приведу с целью, чтобы Вы прочувствовали, разницу между клиентом и сервером. Дело в том, что у нас в распоряжении есть метод объекта "УстановитьДанные(...)". В синтаксис-помощнике написано "Объект, с которым должно быть 

связано сообщение". Это важно. Для примера напишем такой код:

Сообщение3 = новый СообщениеПользователю;
Сообщение3.УстановитьДанные(Объект);
Сообщение3.Текст = "3. Сообщение привязанное к реквизиту шапки Номер, но оно не привяжется, т.к. Объект - это не объект";
Сообщение3.Поле = "Номер";
Сообщение3.Сообщить();

Этот код не сработает, т.к. на клиенте реквизит формы "Объект" это и не объект вовсе а какая-то гадость, вот что нам говорит отладчик про переменную объект:

В 1С в форме на клиенте вместо объекта нам дают штуковину вот такого типа ДанныеФормыСтруктура

Точнее, пользователь конечно сообщение увидит, но двойной хлоп по нему не приведет ни к чему.

А теперь попробуем тоже самое, но на сервере. Создадим серверную процедуру "Сообщить4НаСервере()" и вызовем её с клиента

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

Тут все будет хорошо, единственное замечание по коду это то, что переменную "объект" надо конвертнуть из "ДанныеФормыСтруктура" в реальный объект вызвав процедуру "РеквизитФормыВЗначение(...)".

Вывод: метод "УстановитьДанные(...)" можно использовать только на сервере, т.к. только на сервере есть возможность получить объект.

3. Сообщения привязанные к реквизиту табличной части объекта

Эту тему я опустил в предыдущей статье. Зная нюансы описанные выше, проблем тут быть не должно. Вот рабочий клиентский код:

Сообщение5 = новый СообщениеПользователю;
Сообщение5.Текст = "5. Строка 1 поле количество";
Сообщение5.Поле = "Товары[0].Количество";
Сообщение5.ПутьКДанным = "объект";
Сообщение5.Сообщить();

Хоть нюансы почти теже, но повторенье мать ученье:

1. Поле - это не  имя элемента управления, элемент управления у меня назван "ТоварыКоличество", а не просто "Количество". "Товары" это имя табличной части, а не элемента управления связанного с табличной частью.

2. Путь к данным - объект, просто объект.

3. Номер строки в квадратных скобках - нумерация с нуля и это номер строки, а не идентификатор строки в колекции данных формы. При сдвиге строк, их удалении, идентификатор присвоенный при открытии формы сохраняется, а номера строк пересчитываются заново.

 

Вот и все на этот раз. Сразу озвучу не раскрытые темы, о которых напишу позже:

1. Как привязывать сообщения не к текущему объекту, а к любому, чтобы по двойному щелчку открывалась другая форма

2. Как привязывать сообщения к форме, где нет объектов

3. Как брать сообщения о статусе выполнения долгофо фонового задания

4. Что такое "КлючДанных" и когда надо им пользоваться

 

Ниже база с примером, в ней заходите в документ и жмете по очереди три кнопки. Код в модуле формы документа.

 

Вложения
Download this file (TestMessage.dt)TestMessage.dt[Пример того, что описано в статье]46 kB

Авторизуйтесь пожалуйста

Comments   

+1 # Sergey 2016-06-07 07:37
А где база?
+1 # popitka1 2016-10-19 12:13
Ах, автор шайтан, забыл пример приложить к статье.

Хотя все равно спасибо, и так все понятно :lol:
+2 # Антон Филоненко 2016-10-19 12:18
Базу с примером приляпал, все есть, все на месте :-)