1с 8.3 повідомити про статус повідомлення. Повідомлення користувачеві в керованих формах (ще раз). Повідомлення, притягнуте до реквізиту об'єкта

11.05.2020 Безпека

Добридень.

Сьогодні ми поговоримо про таку просту начебто речі, як повідомлення користувачеві.

У 8 перекочував метод із 7.7 - " Повідомити(...)Метод цей дуже простий, він відкриває вікно повідомлення, якщо воно не відкрите, і додає туди текст повідомлення. Як і в 1С 7.7 в ньому є другий параметр, який визначає іконку навпроти повідомлення. Ця іконка визначає важливість повідомлення.

Час минав, і ми отримали руки керовані форми. У керованих формахнемає єдиного вікна повідомлень. Проте метод досі підтримується. У новому інтерфейсі повідомлення приліплюються до активного вікна. При переключенні в інше вікно повідомлення пропадаю з виду, а при поверненні відображаються знову. У деяких випадках це не зручно, але тут нічого не вдієш, керована форма передбачає відсутність головного вікна, до якого можна було б прив'язати повідомлення.

Однак, коли повідомлення пов'язане з конкретною формою, це дозволяє авторам платформи розширити функціонал простого повідомлення. Можливо, Ви вже бачили в типових конфігураціях, що тепер повідомлення інтегративні, клацання по повідомленню позиціонує нас на певному полі, подвійне клацання може відкрити якийсь інший елемент бази.

Справа в тому, що тепер прийнято використовувати не метод глобального контексту "Повідомити (...)", а об'єкт ПовідомленняКористувачуЦей об'єкт доступний скрізь, і на клієнті і на сервері. У нього є кілька властивостей і кілька методів.

У випадку, якщо Вам потрібно видати користувачеві просто повідомлення, без будь-якого інтерактиву, достатньо написати:



Повідомлення.Повідомити();

Ці три рядки абсолютно ідентичні вже відомому нам методу, а тому використовувати цей об'єкт для такого повідомлення безглуздо.

Основними полями, які розширюють можливості повідомлення, є:

  • КлючДаних
  • Поле

Ключ даних- Посилання на об'єкт інформаційної базидо якого це повідомлення відноситься, або ключ запису. Так написано у довідці. Якщо ми сюди засунемо посилання на документ або довідник, то подвійне клацання призведе до відкриття цього об'єкта, незалежно від того, у чиїй формі було виведено повідомлення. Відповідно, якщо повідомлення вилізло у формі документа, а в ключі даних лежить посилання на нього, то нова формане відкриється.

Дурниця може вийти, якщо ми видаємо повідомлення у формі ще не записаного об'єкта. І тут ми маємо порожнє посилання. Але платформа не губиться, і нічого не відкриває, тобто. Ви залишаєтеся у тій формі, яка була.

Поле- це рядок із ім'ям поля, яке треба активувати. Причому не важливо, чи відкриється форма іншого об'єкта, чи ми залишимося в поточній формі.

Ось приклад, як це працює:

Допустимо перед записом елемента довідника в модулі форми ми перевіряємо унікальність реквізиту "Id" і, якщо така вже є, видаємо повідомлення:


Якщо виб.Наступний() Тоді
Відмова = Істина;
Повідомлення = Новий ПовідомленняКористувачеві;
Повідомлення.КлючДаних = Виб.Посилання;
Повідомлення.Поле = "id";
Повідомлення.Текст = "Розділ з таким Id вже існує";
Повідомлення.Повідомити();
КінецьЯкщо;

У даному прикладіпо подвійному клацаннювідкриється елемент довідника з таким самим Id, а поле Id буде активно і в ньому буде підказка:

Начебто зручно, ми можемо змінити як Id нового елемента, так і відредагувати старий, в нього легко потрапити, клацнувши за повідомленням. Але поле в поточному елементі у нас не активізовано, що при великій кількості полів може бути кориснішим, ніж відкрити форму іншого об'єкта. Адже інший об'єкт вже записаний і використовується і ймовірність, що помилка у ньому – мала. Швидше за все, нам треба правити поточний елемент.

для цього змінюємо свій код наступним чином:

//якщо є дублі, у вибірці будуть дані
Якщо виб.Наступний() Тоді
Відмова = Істина;
Повідомлення = Новий ПовідомленняКористувачеві;
Повідомлення.КлючДаних = Об'єкт.Посилання;
Повідомлення.Поле = "id";
Повідомлення.Текст = "Розділ з таким Id вже існує";
Повідомлення.Повідомити();
КінецьЯкщо;

Відмінність тільки в тому, що в КлючДанихми надаємо посилання на елемент, який ми відкрили. На жаль, цей код не працює: (По подвійному клацанню у нас відкриється модальне вікно.

Щоб це запрацювало, є нюанс, що потрібно заповнити поле. ШляхДаним". Не можу точно пояснити навіщо, просто це треба запам'ятати. Відкриваємо інший об'єкт - шлях до данихне потрібен, позиціонуємося всередині поточного – потрібен. Висновок – краще заповнювати завжди, не помилитеся. Додаємо в код рядок:

Повідомлення.ШляхКДаним = "об'єкт";

І все гарно:

Ще один нюанс, про який хочу розповісти. Якщо "поле" залишити порожнім, то не відбуватиметься позиціонування на елементі управління і поряд з ним не вилізе підказки. Якщо ж "поле" заповнити невірно, то позиціонування відбудеться на формі в цілому і підказка буде, але в кінці форми, без привзяки до реального поля введення.

Наступний нюанс - у повідомлення є метод - ВстановитиДані". Він на підставі об'єкта заповнює поля КлючДанихі ШляхДаним. Це набагато зручніше зробити все в один рядок. Як правило, у формі елемента/документа у нас є об'єкт. Єдине, що на сервері треба писати так:

Повідомлення.ВстановитиДані(РеквізитФормиЗначення("Об'єкт"));

Але у визначеній процедурі форми ПередЗаписомНа Серверінасправді є вже параметр ПоточнийОб'єкт. А на клієнті ми взагалі об'єкту не отримаємо. Ще в модулі об'єкта (не у формі) потрібно писати так:

Повідомлення.ВстановитиДані (Цей Об'єкт);

Наприкінці хочу наговорити гидот про керовані форми. Це стосується як ТАКСІ, так і звичайних УФ. Річ у тім, що УФ дуже погано передаються інтерфейсні списки. Таблиця, що містить у собі 1000 рядків, дуже повільно промальовується, а в web браузері вона може взагалі кілька хвилин відкриватися. Це стосується і списку повідомлень. для експерименту виведіть 1000 повідомлень і спробуйте перемикатися між віконцями. Система помре одразу. причому чітко видно, як система думає саме над виведенням повідомлень. Перехід у вікно з купою повідомлень виглядає так:

Відображається вміст вікна
-що різко мерехтить і з'являється панель повідомлень
-Все повисає і ви дивіться, як скрол у вікні повідомлень повзе вниз

Тобто. як раніше, вивести в панель повідомлень балку роботи тривалої обробки, в якій кілька тисяч записів - не можна. Я б радив обмежитися 10 повідомленнями. Логи треба виводити в багаторядковий рядок, вона відображається майже миттєво незалежно від кількості рядків. Звичайно, якщо ви перевіряєте заповненість реквізиту табличної частини, рядків в ній 1000 і в кожній помилці, то так, доведеться потервіти:) Хоча можна в цьому випадку продумати свій спосіб відображення повідомлень, наприклад, у полі HTML документа.

1С Повідомлення Користувачеві виводить повідомлення користувачу (після закінчення обробки) або зберігає його в чергу, якщо повідомлення неможливо вивести прямо зараз, наприклад:
Повідомлення = Новий ПовідомленняКористувачеві();
Повідомлення.Текст = "Привіт, мир!";
Повідомлення.Повідомити();

У багатьох випадках повідомлення масово генеруються під час певної обробки. Наприклад, під час перевірки великої таблиці, може з'явитися безліч повідомлень про помилки – у різних рядках таблиці. Або під час обробки проведення. При цьому обробка може вестись на сервері або в регламентному завданніта вивести дані повідомлення важко.

1С Повідомлення Користувачеві записує повідомлення в «деяку» чергу, і після закінчення обробки виводить їх користувачеві, якщо це можливо. Інакше – весь список повідомлень можна отримати за допомогою методу Отримати Повідомлення Користувачеві().

Щоб вивести повідомлення користувачу за допомогою 1С Повідомлення Користувачеві в конкретній, вже відкритій формі, додатково потрібно встановити ідентифікатор форми:
Повідомлення.ІдентифікаторПризначення = Форма.УнікальнийІдентифікатор;

Щоб повідомлення 1С Повідомлення Користувачеві було виведено у спливаючому вікні біля конкретного поля форми, в модулі якої виконується код, потрібно вказати «шлях» до нього:
Повідомлення.Поле = "Найменування"; //де Найменування – це реквізит форми
Повідомлення.Поле = "Об'єкт.Найменування"; //де Найменування – це реквізит об'єкта (тобто довідника, чия форма редагується)
Повідомлення.Поле = "Товари.Ціна"; //де Товари – таб.частина на формі, Ціна – колонка цієї таб.частини

Щоб зробити те саме, але в модулі іншого об'єкта (загальний модуль), потрібно додатково вказати об'єкт (ДовідникОб'єкт, ДокументОб'єкт і т.п.):
Повідомлення.Поле = "Найменування"; //де Найменування - це реквізит ДовідникОб'єкт
Повідомлення.ВстановитиДані(ДовідникОб'єкт);
//При подвійному клацанні на повідомлення буде відкрито форму об'єкта з спливаючою повідомленням у потрібного поля

Інший спосіб зв'язати повідомлення 1С Повідомлення Користувачеві з даними об'єкта:
//для довідника, документа.
Повідомлення.КлючДаних = ДовідникПосилання;
Повідомлення.ШляхКДаним = "Об'єкт";

//для записів регістру
Повідомлення.КлючДаних = РеєстрМенеджерЗаписи.ВихіднийКлючЗаписи; //зазвичай основний реквізит форми, пов'язані з регістром
Повідомлення.ШляхКДаним = "Запис";

У типових конфігураціях на керованих формах для тонкого клієнта, наприклад «Керування торгівлею, редакція 11» та «Бухгалтерія, редакція 3», у загальному модулі Загального Призначення КлієнтСервер є функція Повідомити Користувачеві(), яка «універсалізує» роботу з даним об'єктом. Синтаксис функцій у різних конфігураціях – різний.

Так як 1С Повідомлення Користувачеві формує список повідомлень, щоб його обнулити (наприклад, перед виконанням складної обробки), можна викликати функцію:
Отримати ПовідомленняКористувачеві(Істина);

Стаття продовжує цикл статей "Перші кроки у розробці на 1С".

У ній ми розглянемо способи інформування користувача, які є у платформі «1С:Підприємство» 8, а також акцентуємо вашу увагу на деяких особливостях роботи цих механізмів, ці особливості пов'язані з режимом використання модальності.

Застосовність

У статті розглядається функціональність:

  • Інтерфейс у варіанті «Версії 8.2» для конфігурації, розробленої на платформі «1С:Підприємство» 8.2.19.130
  • Інтерфейсу «Таксі» для конфігурації, розробленої на платформі «1С:Підприємство» 8.3.4.496 до 8.3.9+
  • Інтерфейсу «Таксі» для конфігурації, розробленої на платформі «1С:Підприємство» 8.3.10-8.3.11

Як у 1С вивести повідомлення користувачу

Виведення повідомлень в режимі користувача вирішує ряд завдань:

  • відображення ходу виконання поточного процесу (показ стадії виконання процесу; показ розрахункових значень, отриманих під час роботи алгоритму);
  • видача помилок користувачеві для можливого їх виправлення;
  • видача рекомендацій;

Типи повідомлень:

  • терміни, які зупиняють виконання програми і не дають продовжити її, поки користувач не ознайомиться з цим повідомленням і не виконає певних дій. Наприклад, на екран користувачеві буде видано питання, на яке потрібно буде відповісти Так чи Ні. Поки користувач не відповість – програма не виконує подальші дії;
  • ознайомлювальні повідомлення, які просто виводяться для користувача та дозволяють працювати далі (тобто використовуються в режимі оповіщення).

Термінуючими повідомленнями повинні бути повідомлення про помилки, а ознайомлювальні: рекомендації, повідомлення про поточний етап процесу та показ розрахункових значень (налагоджувальний друк).

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

Необхідно, щоб користувач з нею обов'язково ознайомився і, можливо, зробив якісь дії, описані в цьому повідомленні.

Дуже важливо, щоб користувач дійсно читав ці повідомлення, тому вони повинні містити лише важливу інформацію.

Тестові та налагоджувальні повідомлення видавати користувачеві не варто, т.к. рано чи пізно він почне ігнорувати всі повідомлення.

У концепції керованого інтерфейсу змінився підхід до видачі повідомлення. Воно тепер прив'язане до форми, де виникло. Його не можна закрити те щоб текст було зовсім невидно.

Відкріпити вікно з повідомленням від форми не можна.

Синтаксис функції:

Повідомити (<Текст сообщения>, <Статус>)

Тобто. Першим параметром є текст.

Другий параметр (статус повідомлення) є необов'язковим. Для статусу можна вказувати значення: Звичайне, Важливе, Дуже важливеі т.д.

Від даного значеннязалежить, який значок буде розташовано поряд із повідомленням. Однак це працює лише у звичайному інтерфейсі.

У концепції керованого інтерфейсу значок завжди у вигляді знака оклику, перевизначити його не можна.

Справа в тому, що якщо повідомлення буде формуватися в момент запису елемента довідника, може статися така ситуація.

Користувач натискає кнопку Записати та закрити, у разі повідомлення виводиться у відповідне вікно (право форми).

Але форма миттєво закривається, і користувач не побачить, що йому виводилася якась інформація.

Тому в концепції керованого додатка ознайомлювальні повідомлення рекомендується виводити за допомогою так званих оповіщень. Приклад неправильного використання функції Повідомитипредставлений малюнку.

Тим не менш, функція Повідомитиможе використовуватися для виведення інформації про деякі помилки, наприклад, у момент проведення документа.

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

Функція Повідомитиповністю підтримується у Платформі 8.3. Її можна використовувати і вона буде працювати (і у файловому варіанті, і в клієнт-серверному).

Але також слід зазначити, що функції Повідомитиє подальший розвиток - це клас повідомлення користувачу, який дозволяє крім того, що виводити повідомлення, прив'язувати його контекстно до будь-яких елементів форми.

Наприклад, повідомлення про помилку можна прив'язати до елементу форми, що дуже наочно для користувача. Дещо пізніше до розгляду цього питання ми повернемося. У функції Повідомитиє цікава особливість.

Так, програмний код Платформі 8.3 може бути виконаний як на стороні Клієнта, так і на стороні Сервера.

У цьому клієнтський програмний код відповідає взаємодію Космосу з користувачем, тобто. за клієнта відкриваються форми, виводяться звіти.

Різні діалогові документи також відображаються лише на клієнті. На сервері вони можуть бути виконані, оскільки сервер немає можливості взаємодії з користувачами.

Але функція Повідомитиможе бути виконана як на стороні Клієнта, так і на стороні Сервера. При цьому використання методу Повідомитина Сервері зовсім не означає, що повідомлення виводитиметься саме на Сервері, там їх просто нікуди виводити.

Це означає, що якщо ми в серверній процедурі виводитимемо повідомлення за допомогою цього методу, вони будуть накопичуватися в деякому буфері і виведуться вони на екран лише тоді, коли серверна процедура закінчиться і відбудеться повернення на Клієнта.

У цей момент система запитатиме дані з буфера і виведе їх на екран.

Ця ж особливість стосується і класу ПовідомленняКористувачу. На малюнку наведено приклад використання методу Повідомитина стороні Сервера.

В результаті використання методу Повідомитина стороні Сервера вивели повідомлення на екран на стороні Клієнта.

Механізм оповіщень потрібен, щоб інформувати користувача у тому, що у системі “щось” сталося і це “щось” вимагає уваги користувача. Оповіщення створюються двома сценаріями:

  1. Самою платформою при інтерактивному запису або зміні об'єкта
  2. Розробником під час виклику в коді методу .

Саме оповіщення є невеликим віконцем, яке з'являється, як правило, в нижньому правому кутку і повідомляє про досконалу дію. Протягом кількох секунд воно поступово гасне та пропадає. При цьому якщо навести на оповіщення курсор мишки, воно не гасне і можна уважно його прочитати.

Крім того, до оповіщень можна звернутися у відповідній області інформаційної панелі (кнопка "Історія" зліва внизу форми програми у варіанті інтерфейсу "Версії 8.2").

Щоб створювати власні оповіщення, необхідно використовувати метод глобального контексту ПоказатиОповідьКористувача(). Його синтаксис до редакції 8.3.10 подано нижче:

ПоказатиОповідання Користувача (<Текст>, <НавигационнаяССылка>, <Пояснение>, <Картинка>)

У першому параметрі передається текст, який виводитиметься в оповіщенні.

Далі другим параметром можна передати якесь навігаційне посилання будь-який елемент інформаційної бази (той елемент, який відповідає тексту нашого повідомлення). При натисканні користувачем на оповіщення буде виконано перехід за цим посиланням.

За допомогою третього параметра можна передати пояснення повідомлення, тобто. якийсь розширений опис.

Також можна надати картинку, що відображає статус оповіщення.

Слід зазначити, що ці параметри є необов'язковими для заповнення. Нижче наведено приклад використання даного методу(у конфігураторі та в режимі користувача у варіанті інтерфейсу «Версії 8.2»).

У редакції платформи 8.3.10.216 для інтерфейсу у варіанті «Таксі» механізм оповіщень був істотно доопрацьований з метою підвищення зручності роботи як у тонкому, так і веб-клієнті. З цієї причини змінилися і параметри, що передаються в метод ПоказатиОповідьКористувача(). Тепер синтаксис виглядають так:

ПоказатиОповідьКористувача(<Текст>, <ДействиеПриНажатии>, <Пояснение>, <Картинка>, <СтатусОповещенияПользователя>, <КлючУникальности>)

Видно, що другий параметр, раніше званий НавігаційнеПосилання, отримав нове ім'я ДіяПри Натисканні. Це пов'язано з тим, що тепер у нього стало можливим передавати не лише рядок із навігаційним посиланням, а й опис оповіщення. Це проілюстровано скріншотом нижче:

Як видно з прикладу, у нас з'явилася можливість програмним чином обробляти натискання на вікно з оповіщенням згідно з логікою, яка необхідна.

Наступний параметр СтатусОповіданняКористувачаз'явився вперше. У ньому вказується статус оповіщення (Інформація чи Важливе).

У випадку варіанта Важливо, якщо користувач не відреагував на повідомлення, то після того, як воно буде приховано з екрана, його можна буде прочитати через Центр оповіщень (про нього нижче). У випадку варіанта Інформація, оповіщення видаляється без запам'ятовування в цьому центрі. Давайте перепишемо код нашого прикладу, як показано нижче:

Після виконання команди отримаємо приблизно такий вид вікна програми:

На панелі інструментів з'явилася кнопка з піктограмою дзвінка, за якою викликається згаданий вище Центр оповіщень. У ньому накопичуються нові важливі оповіщення, на які користувач поки що ніяк не відреагував.

Якщо в Центрі є якісь оповіщення, то поруч із ним з'являється маленька помаранчева точка, щоб привернути увагу користувача. Користувач може відкрити Центр оповіщень, прочитати текст і, якщо необхідно, виконати якісь дії.

З Центру оповіщення забирається натисканням на кнопку очищення, проте якщо з оповіщенням пов'язана якась дія, то, як користувач клацне мишею по тексту повідомлення, воно теж пропаде.

І, нарешті, останнім доданим параметром став КлючУнікальності. З його допомогою можна знайти відображене на екрані оповіщення та змінити його. Якщо оповіщення з таким параметром немає, то буде показано нове оповіщення.

Як бачимо, можливостей, які надаються відповідним методом, стало ще більше! Але це не всі зміни у механізмі сповіщень.

Як ви вже, напевно, встигли помітити, чи змінився їх зовнішній вигляд. Тепер оповіщення виглядають більш сучасно та ергономічно, але їх не можна переміщати по екрану та змінювати їх розмір. Зверніть увагу, в нашому прикладі, текст оповіщення просто не помістився повністю в самому вікні, і читати його повністю користувач зможе, тільки відкривши Центр Оповіщень. Тому не варто в тексті сповіщення писати велику кількість тексту.

Також до нових можливостей відноситься і одночасне відображення на екрані до трьох оповіщень.

На цьому завершимо наше знайомство із програмним формуванням оповіщень. Проте згадаємо, що оповіщення формуються як розробником програмно, а й самої платформою на момент інтерактивної запису чи зміни об'єкта. І часто цей факт викликає нерозуміння насамперед у користувачів-початківців: навіщо потрібні ці службові оповіщення, які, до речі, не можна відключити?

Давайте уявимо таку просту ситуацію: користувач встановив фільтр у якомусь списку для зручності. Допустимо, він зробив це у формі списку довідника Номенклатури. Потім, через якийсь час, вирішив запровадити новий елементз найменуванням “Стілець”, який відповідає встановленому раніше фільтру. Вводить його, записує та…? І не бачить його у списку. Що робитиме середньостатистичний користувач? Звісно, ​​введе його вдруге, але знову не побачить. Далі може бути третій, четвертий, вп'яте. Коли йому набридне вводити те саме, він, нарешті, запитає у вас: а куди все пропадає?

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

Термінуючі повідомлення

Термінуючі повідомлення – це повідомлення, які дозволять працювати, доки користувач не здійснить певні дії, тобто. доки він не опрацює повідомлення.

Про можливість використання термінуючих повідомлень у Платформі 8.3 ми поговоримо трохи пізніше (останнім часом їх намагаються не використати, тому розглянутий приклад більше стосується Платформи 8.2).

Існують два методи для видачі повідомлень, що термінують Попередженняі Питання. Попередженнявідрізняється від питаннятим, що має єдину кнопку ОК.

У питанні можуть визначатися різні набори варіантів відповідей ( Та ні, ДаНі Скасування, ОК, ОКОтмена, ПовторитиСкасувати, ПерерватиПовторитиПропустити), які задаються за допомогою параметра.

Виведемо якесь попередження за допомогою рядка (наприклад, у модулі керованого додатка):

Попередження (“Зараз буде відкрито базу”);

Щоб відкрити модуль керованої програми, слід у дереві конфігурації вибрати об'єкт Конфігурація, викликати контекстне менюта вибрати пункт Відкрити модуль керованої програми.

В даному випадку, при запуску програми буде виводитися вікно, яке є модальним. Модальне вікно перекриває всі вікна, які існують у додатку. Поки ми не обробимо це вікно, подальші дії неможливі.

Аналогічно працює і функція Питання.

Синтаксис:
Питання(<ТекстВопроса>,<Кнопки>,<Таймаут>,<КнопкаПоУмолчанию>,<Заголовок>,
<КнопкаТаймаута>);

Обов'язковими є лише перші два параметри. Для другого параметра тип даних складової ( РежимДіалогаПитанняабо СписокЗначень). Третій параметр ( <Таймаут> ) характеризує інтервал часу в секундах, протягом якого система чекатиме на відповідь користувача.

Після закінчення інтервалу вікно питання буде закрито. Аналогічний параметр ( <Таймаут> ) є і у функції Попередження.

Як приклад використання функції Питанняможна використовувати наступний код, записаний у модулі керованої програми:

Звертаю Вашу увагу, що ці методи ( Попередженняі Питання) не доступні на сервері. І це логічно, тому що інтерфейсні методи не можуть бути виконані на сервері, де немає користувача.

Особливості використання модальних вікону Платформі 8.3

У платформі 8.3 є режими роботи з використанням і без використання модальності. За замовчуванням стоїть параметр Не використовувати режим модальності.

У цьому випадку використання термінуючих повідомлень неможливе. У разі потреби використання термінуючих повідомлень (функції Попередженняі Питання) слід змінити значення якості конфігурації на Використати.

Модальне вікно виводиться на верх і блокує роботу з іншими вікнами до завершення дій з модальним вікном. Крім того, зупиняється виконання програмного коду на місці, де відбувається виклик цього вікна. Виконання коду продовжиться лише після закриття модального вікна.

По-перше, проблеми з використанням модальних вікон виникають для мобільного додатку. По-друге, у браузері модальність вікон реалізується за допомогою окремих вікон, що спливають.

У налаштуваннях браузера за замовчуванням спливаючі вікна часто заборонені. Користувача доводиться змушувати встановлювати дозвіл на вікна.

Браузери для планшетних комп'ютеріві для телефонів у більшості випадків взагалі не підтримують спливаючі вікна.

Для заміни функцій Питанняі Попередженнярозроблено нові методи: ПоказатиПитання, ПоказатиПопередження.

Ці методи дозволяють викликати вікно, але зупиняти виконання програмного коду. Технічно це реалізується формуванням псевдоокна усередині батьківського вікна. Псевдовікно не перекриває батьківське вікно. Після відкриття такого вікна код продовжує виконуватись.

Отримання та обробка введених користувачем значень здійснюється в окремій процедурі, що викликається під час закриття діалогового вікна.

Синтаксис функції ПоказатиПопередження:

ПоказатиПопередження(<ОписаниеОповещенияОЗавершении>, <ТекстПредупреждения>, <Таймаут>, <Заголовок>)

Параметр <ОписаниеОповещенияОЗавершении> (Необов'язковий)

Тип даних: Опис Оповіщення.

Містить опис процедури, яка буде викликана після закриття вікна попередження.

Синтаксис функції ПоказатиПитання:

ПоказатиПитання(<ОписаниеОповещенияОЗавершении>, <ТекстВопроса>, <Кнопки>, <Таймаут>, <КнопкаПоУмолчанию>, <Заголовок>, <КнопкаТаймаута>)

Обов'язковими є перші три параметри.

Нижче наведено приклад використання функції.

Клас ПовідомленняКористувачеві

Основна зручність класу повідомлень ПовідомленняКористувачуполягає в тому, що це контекстне повідомлення (на відміну від методів Попередженняі Питання).

Повідомлення можуть бути пов'язані з конкретним екранним елементом. Цей об'єкт доступний і на сервері.

Слід звернути увагу, що, по-перше, цей об'єкт потрібно створювати. Наприклад: Повідомлення = Новий ПовідомленняКористувачеві;

Таким чином, ми створюємо екземпляр даного об'єкта.

По-друге, потрібно прописувати текст повідомлення окремою властивістю.

По-третє, у властивості Полеможна вказати, до якого елементу форми це повідомлення має бути прив'язане.

Увага! Для прив'язки до потрібного поля форми зверніть увагу на ініціалізацію властивостей ШляхДанимі КлючДаних. Для документа при розміщенні коду в модулі об'єкта можна писати:

Повідомлення.ШляхКДаним = "Об'єкт";
Повідомлення.КлючДаних = ЦейОб'єкт.Посилання;

Щоб відкрити модуль документа, слід у вікні редагування об'єкта (документа) на закладці Іншенатиснути на кнопку Модуль об'єкту.

Для експерименту в модулі об'єкта документа розмістимо код.

Нижче представлений отриманий в режимі користувача результат для Платформи 8.3.

Слід зазначити, що повідомлення, які виводяться за допомогою нового об'єкта системи ПовідомленняКористувачуу випадку є термінирующими. Тобто. система дозволить користувачеві продовжити подальші дії не відреагувавши на повідомлення, що виводяться.

Але, по-перше, дані повідомлення досить помітні. По-друге, зазвичай повідомлення користувачеві виводяться на момент запису елементів довідників чи проведення документів, тобто, коли виконуються якісь перевірки. І якщо були виявлені помилки, то користувач побачить ці повідомлення.

Відповідно, на момент виявлення помилок скасовується транзакція, тобто. забороняється запис елемента довідника або забороняється проведення документа.

Таким чином, відбувається своєрідна емуляція термінуючого повідомлення. Тому що дія скасовується, поки користувач не відреагує на повідомлення, завершити дію, наприклад, провести документ, буде не можна.

Але, з іншого боку, можна закрити документ без проведення, ніяк не прореагувавши на повідомлення. Тому дані повідомлення користувачу не є такими, що термінують.

Повідомлення про стан процесу

Існує спеціальна функція, за допомогою якої можна відображати зразковий хід виконання будь-якого процесу.

Синтаксис: Стан(<ТекстСообщения>, <Прогресс>, <Пояснение>, <Картинка>)
Параметри:<ТекстСообщения>і<Пояснение>– не обов'язкові, тип – Рядок.
Текст виводиться на спеціальну панель стану.
<Прогресс>параметр також необов'язковий, але наочний.
Тип: Число. Значення індикатора прогресу (від 1 до 100).
<Картинка>також необов'язковий параметр.
При обробці якоїсь події можуть використовуватися періодичні виклики функції типу:

При цьому можуть змінюватись написи, а можуть змінюватися значення параметра Прогрес.

Функція може викликатися як із однієї процедури (функції), і з кількох. Таким чином, можна відстежувати стан виконання процесу.

Якщо ви хочете ознайомитися з механізмом сповіщення більш детально, то зараз перервіться і прочитайте нашу нову статтю Відображення прогресу тривалих операцій в 8.3.10 . У ній вже не на рівні новачка пояснюються всі тонкощі та підводні каменіроботи цього механізму.

Ми завершуємо знайомство зі способами інформування користувача. Сподіваємося, що у вас склалося розуміння, у яких ситуаціях слід застосовувати той чи інший спосіб.

Хочеться ще раз наголосити на тому факті, що якщо ваша конфігурація (версії 8.3.3+) передбачає роботу за допомогою веб-клієнта, то:

  • на рівні конфігурації має бути встановлене налаштування режиму модальності «Не використовувати»
  • у коді мають використовуватися методи асинхронної моделі взаємодії з користувачем. Такі методи починаються зі слів Показатиабо Почати.

Більш детально про відмову від використання модальних вікон у платформі 1С:Підприємство 8.3 можна почитати у фінальній статті циклу. А ми йдемо далі і, нарешті, приступаємо до вивчення довгоочікуваного інтерфейсу «Таксі», який вже неодноразово згадувався у наших матеріалах.

Протягом уроку ми створили базу, створили обробку, створили форму.

Тепер ми розповімо Вам 5 способів повідомлень із 1С «Привіт, мир!»

Як мінімум про два способи знають не всі 🙂

Як і куди писати текст програми?

Перейдіть на закладку вікна з формою «Модуль». Ви переконаєтесь, що у вас там уже є якийсь текст («Процедура…»).

Якщо тексту немає, то:

  • У товстому клієнті Ви неправильно додали форму до обробки, повторіть спочатку
  • У тонкому клієнтуВи забули додати кнопку, повторіть спочатку.

Усередині тексту є рядок:

// Вставити вміст оброблювача

Ваше завдання стерти цей рядок і замість нього вписати текст програми. Після цього зберегти обробку та відкрити її в режимі підприємства.

При натисканні Виконати тепер виконуватимуться вписані Вами дії.

А тепер перейдемо безпосередньо до самих способів!

Повідомлення в 1С, спосіб 1 - найпростіший

Отже, Ви повинні замість тексту «// Вставити вміст обробника.» написати текст програми.

Повідомити («Привіт мир!»);

Власне, це все 🙂

Повідомлення в режимі Підприємство у товстому клієнті буде знизу у вікні 1С, у тонкому клієнті – праворуч у вікні обробки.

Це найпростіший спосіб, що дуже широко використовується програмістами.

Повідомлення в 1С, спосіб 2 - теж простий

Попередження («Привіт мир!»);

Власне, це все 🙂

Повідомлення в режимі Підприємство в обох варіантах клієнта буде у спливаючому вікні.

Повідомлення в 1С, спосіб 3 - з'явився лише в 1С версії 8.2

ПоказатиОповідьКористувача("Привіт, мир!","Справді привіт!");

Цей спосіб з'явився лише у 1С версії 8.2. Це спливаюче вікно в правому нижньому кутку екрану, яке гасне з часом.

Повідомлення в 1С, спосіб 4 - програмістський

Викликати Виняток "Привіт, мир!";

Під час виконання будь-якої програми може бути помилка. Іноді ця помилка може бути обчислена заздалегідь (наприклад, потрібно порахувати a = b/c і в момент виконання програми стало відомо, що c дорівнює 0).

І тут є спосіб повідомити про помилку таким методом.

Повідомлення в 1С, спосіб 5 - технологічний, тільки для типової конфігурації

Загального призначення. Повідомити про помилку ( "Привіт, мир!");

Програміст 1С повинен знати не тільки ті способи програмування, які є в платформі 1С, але й ті, що є в типових конфігураціях.

Новачки при спробі дописати будь-яку типову конфігурацію починає винаходити велосипед.

Ось чудовий приклад. Ця функція є у багатьох типових конфігураціях (тільки для товстого клієнта!). Здавалося б вона за результатом дорівнює дії способу 1.
Однак ні – в деяких конфігураціях (наприклад, УПП) повідомлення про помилки дублюються в журнал реєстрації. Також при додаткове налаштуванняповідомлення виглядає зовсім інакше.

Отже, тепер можете відчути себе справжнім програмістом!

Саме це є програмуванням 1С. Звичайно, реальне програмування набагато складніше і вимагає маси знань, але загальне уявленняВи тепер отримали.

Успіхів!

P.S. У pdf версії уроку подано скріншоти, щоб було легше зробити власний досвід.

P.P.S. До уроку подано 5 відео з прикладами створення бази для програмування, створення обробки, програмування в товстому та тонкому клієнті.

Але деякі моменти роботи з об'єктом "Повідомлення користувачеві" залишилися в ній не освітленими. Наприклад, що писати в полі "Поле", якщо ім'я

Реквізит відрізняється від імені поля на формі. Що писати в полі "ШляхКДаним". І нарешті, найсмачніше, як працювати з табличною частиною.

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

Все, що я пишу нижче, перевірено на 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.Повідомити();

Цей код спрацює, т.к. на клієнті реквізит форми "Об'єкт" це і не об'єкт зовсім а якась гидота, ось що нам каже відладчик про змінну об'єкт:

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

А тепер спробуємо те саме, але на сервері. Створимо серверну процедуру "Повідомити4На Сервері()" та викличемо її з клієнта

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

Тут все буде добре, єдине зауваження за кодом це те, що змінну "об'єкт" треба конвертнути з "ДаніФормиСтруктура" в реальний об'єкт викликавши процедуру "РеквізитФормиЗначення(...)".

Висновок: метод "УстановитьДанные(...)" можна використовувати лише сервері, т.к. тільки на сервері можна отримати об'єкт.

3. Повідомлення прив'язані до реквізиту табличної частини об'єкта

Цю тему я опустив у попередній статті. Знаючи нюанси описані вище, проблем тут не повинно бути. Ось робочий клієнтський код:

Повідомлення5 = новий ПовідомленняКористувачеві;
Повідомлення5.Текст = "5. Рядок 1 поле кількість";
Повідомлення5.Поле = "Товари.Кількість";
Повідомлення5.ШляхКДаним = "об'єкт";
Повідомлення5.Повідомити();

Хоч нюанси майже теж, але повторення мати вчення:

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

2. Шлях до даних – об'єкт, просто об'єкт.

3. Номер рядка в квадратних дужках- нумерація з нуля та це номер рядка, а не ідентифікатор рядка в колекції даних форми. При зсуві рядків, їх видаленні, ідентифікатор присвоєний при відкритті форми зберігається, а номери рядків перераховуються заново.

Ось і все цього разу. Відразу озвучу не розкриті теми, про які напишу пізніше:

1. Як прив'язувати повідомлення не до поточного об'єкта, а до будь-якого, щоб по подвійному клацанню відкривалася інша форма

2. Як прив'язувати повідомлення до форми, де немає об'єктів

3. Як брати повідомлення про статус виконання довгофо фонового завдання

4. Що таке "КлючДаних" і коли треба ним користуватися

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