Работа с сообщениями пользователю

Печать (Ctrl+P)

Методические рекомендации

Для вывода информации пользователю в 1С:Предприятии 8.2 /8.3 существует специальный механизм сообщений. В этом механизме используется объект встроенного языка СообщениеПользователю. Он находится в разделе Общие объекты в синтаксис – помощнике электронной документации платформы

Предполагается, что сообщения выводятся для того, чтобы сообщить пользователю об ошибках. А для информирования о выполняемом действии рекомендуется использовать метод встроенного языка ПоказатьОповещениеПользователя().

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

Платформа позволяет указать, какие реквизиты объектов конфигурации должны автоматически проверяться на заполненность. Если в процессе работы пользователь хочет записать объект, а какой-либо реквизит этого объекта не заполнен, платформа отобразит пользователю сообщение об ошибке. Такое сообщение будет  “привязано” к элементу управления в форме. Если щелкнуть на сообщении в окне сообщений, фокус ввода перейдет на указанное поле, а рядом появится информационное окно с текстом сообщения.

Рассмотрим подробно, что при этом происходит и как можно добиться такого же поведения в своем коде. В качестве примера возьмем ситуацию проведения документа.

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

Когда объекту необходимо сформировать сообщение, он ничего не знает о том, где он “родился и живет”. Объект знает лишь, что его реквизит не заполнен. Поэтому он создает новый объект СообщениеПользователю и заполняет его свойство Текст описанием ошибки, а свойство Поле заполняет именем своего реквизита, который не заполнен.

После этого наступает ответственный момент – форме надо предоставить информацию о том, чьё это сообщение и в каком реквизите формы хранится наш объект. Это делается для того, чтобы форма могла впоследствии привязать сообщение к нужному элементу управления. Для установки связи объект данных вызывает у объекта сообщения метод УстановитьДанные(), передавая себя в качестве параметра. При этом происходит поиск среди запомненных ранее соответствий “объект – имя реквизита формы”. Если для объекта существует значение имени реквизита формы, метод УстановитьДанные() помещает имя реквизита формы в свойство ПутьКДанным объекта СообщениеПользователю, а ссылка объекта (или ключ записи регистра) помещается в свойство КлючДанных.

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

ПРИМЕЧАНИЕ
Пока управление не передано обратно на клиента, можно получить массив сообщений методом глобального контекста ПолучитьСообщенияПользователю().

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

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

Программное создание сообщений

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

Первое, что необходимо сделать – зарегистрировать в системе соответствие объекта и имени реквизита формы. Для этого в глобальном контексте реализована функция УстановитьСоответствиеОбъектаИФормы(). Сделать это можно следующим образом:

 &НаСервере Процедура ПроцедураВызываемаяСКлиента(ОбъектДанных)   
    Документ = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.ПоступлениеТМЦ"));   // Преобразования данных формы в объект    
     УстановитьСоответствиеОбъектаИФормы(Документ, "Объект");  / / Установка соответствия  
      ДействиеСОбъектом(Документ);  // Действия над объектом, в процессе работы которых может возникнуть необходимость вывода сообщений
 КонецПроцедуры

В данном фрагменте выполняется преобразование объекта из данных формы в реальный объект и устанавливается его соответствие с реквизитом формы по имени “Объект”.

Если в дальнейшем требуется создать сообщение, можно сделать это следующим образом:

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

В этом фрагменте создается новый объект СообщениеПользователю, в котором запоминается Текст сообщения и указывается Поле объекта, ошибка в данных которого вызвала необходимость вывода сообщения. Информация о том, как объект расположен в форме берется из предварительно запомненной пары “Объект/ИмяРеквизитаФормы”. В дальнейшем сообщение будет выведено в окно сообщений формы и привязано к соответствующему элементу управления.

ВАЖНО
Привязка объекта к имени реквизита формы действует только для конкретного экземпляр объекта, а не для его ссылки, и живет до тех пор, пока этот экземпляр существует.

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

 &НаКлиенте
Процедура ДействиеСОбъектомНаКлиенте(ОбъектДанных)

     // Какие либо действия, которые требуют создания сообщения

    // Создание сообщения
    Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = "В строке 11 табличной части ""Номенклатура"" не хватает " + 
                      НедостающееКоличество + " " + ЕдиницаИзмеренияНоменклатуры;
    Сообщение.Поле = "Номенклатура[10].Количество";

    // Привязка объекта к реквизиту формы "вручную"
    Сообщение.КлючДанных = ОбъектДанных.Ссылка;
    Сообщение.ПутьКДанным = "Объект";

    // Сообщение выводится пользователю
    Сообщение.Сообщить();

     // В дальнейшем сообщение будет показано в форме и привязано к
     // элементу управления, связанного с полем Количество 
    // в 11-й строке табличной части Номенклатура.
    ...
КонецПроцедуры;

ПРИМЕЧАНИЕ
Отметим, что в обоих примерах сообщение, устанавливаемое свойству Текст, указывает строку как 11-ю, а значение, устанавливаемое свойству Поле, указывает на 10-ю. Так сделано потому, что в интерфейсе строки табличных частей начинают нумерацию с 1, а в программном коде – с 0.

Примеры заполнения свойства Поле объекта СообщениеПользователю

Свойства Поле объекта содержит путь к реквизиту формы, для которого было выведено сообщение, или к данным объекта.
Например, путь к реквизиту Номенклатура в строке с индексом 10 табличной части документа, в которой произошла ошибка: ТабличнаяЧастьСоставДокумента[10].Номенклатура.

В следующей таблице показан пример заполнения:

ТипШаблонПример
РеквизитИмяРеквизитаКонтрагент
Табличная частьИмяТабличнойЧастиСкидки
Реквизит табличной частиИмяТабличнойЧасти[ИндексСтроки].ИмяРеквизитаНоменклатура[10].Количество
Реквизит набора записей[ИндексСтроки].ИмяРеквизита[10].Курс

См. также:

Previous Article
Next Article

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.